static final
static详见静态与非静态
final详见final详解
变量和方法
注意:
1、static final修饰的变量必须在声明时初始化。
2、static final修饰的变量赋值后不能修改。
3、static final修饰的方法不能被子类重写。
4、抽象类中的抽象方法不能被static、final或static final修饰。
5、接口中的所有方法都不能被static、final或static final修饰,因为接口中的方法都是抽象的。
6、接口中的变量默认为public static final。
在普通类中:
public class ClassA { public static final String S1 = "this is S1 in ClassA"; public static final String method1() { return "this is method1 in ClassA"; } }
测试1:
public class MainClass { public static void main(String[] args) { ClassA a = new ClassA(); System.out.println(ClassA.S1);// this is S1 in ClassA System.out.println(ClassA.method1());// this is method1 in ClassA System.out.println(a.S1);// this is S1 in ClassA System.out.println(a.method1());// this is method1 in ClassA } }
MainClass反编译:
public class MainClass { public static void main(String[] args) { ClassA a = new ClassA(); System.out.println("this is S1 in ClassA"); System.out.println(ClassA.method1()); System.out.println("this is S1 in ClassA"); System.out.println(ClassA.method1()); } }
在抽象类中:
public abstract class ClassA { public static final String S1 = "this is S1 in ClassA"; public static final String method1() { return "this is method1 in ClassA"; } }
测试2:
public class MainClass { public static void main(String[] args) { System.out.println(ClassA.S1);// this is S1 in ClassA System.out.println(ClassA.method1());// this is method1 in ClassA } }
MainClass反编译:
public class MainClass { public static void main(String[] args) { System.out.println("this is S1 in ClassA"); System.out.println(ClassA.method1()); } }
在接口中:
interface InterfaceA { static final String S1 = "this is S1 in InterfaceA"; }
测试3:
public class MainClass { public static void main(String[] args) { System.out.println(InterfaceA.S1);// this is S1 in InterfaceA } }
MainClass反编译:
public class MainClass { public static void main(String[] args) { System.out.println("this is S1 in InterfaceA"); } }
从以上测试中,可以得出:
1、static final修饰的变量在编译时直接被值替换。
2、通过对象访问普通类中的static final方法时,在编译时被优化为通过类名来访问。
3、static final修饰的变量为全局变量,可通过类名或接口名直接访问,并且在赋值后不能被修改。