一、接口中定义常量:

    由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。

public interface Constants{  
    String name = "111";  
}  
public class read{  
    public static void main(String[] args){  
        System.out.println("Class Constants's name = " + Constants.name);  
    }  
}

   由于引用了一个static final 的字段,编译器已经将interface Constants中name的内容编译进了class read中,而不是对其引用。因此只有重新编译class read,interface Constants中name发生的变化才能在class read中反映。

二、类中定义 

public class Constants{  
    private static final String name = "111";  
    public static String getName(){  
        return name;  
    }  
}   
public class read{  
    public static void main(String[] args){  
        System.out.println("Class Constants's name = " + Constants.getName());  
    }  
}

    class read中是对Constants class的getName()方法的引用,当常量name的值改变时我们只需对class Constants中的常量做修改并重新编译,无需编译class read。

   我们可以使用jdk提供的反编译工具javap反编译read.class看个究竟,输入:javap -c read即可查看两种方式的不同。