final方法
|
class Test1 { public void f1() { System.out.println("f1"); } //无法被子类覆盖的方法 public final void f2() { System.out.println("f2"); } public void f3() { System.out.println("f3"); } private void f4() { System.out.println("f4"); } } public class test2 extends Test1 {
public void f1(){ System.out.println("Test1父类方法f1被覆盖!"); }
public static void main(String[] args) { test2 t=new test2(); t.f1(); //正常复写 t.f2(); //调用从父类继承过来的final方法 final能继承,不能覆盖 t.f3(); //调用从父类继承过来的方法 //t.f4(); //调用失败,无法从父类继承获得 private } } |
|
用final修饰的成员变量表示常量,值一旦给定就无法改变!
一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。 |
public class Test3 { private final String S = "final实例变量S"; private final int A = 100; public final int B = 90;
public static final int C = 80; private static final int D = 70;
public final int E; //final空白,必须在初始化对象的时候赋初值
public Test3(int x) { E = x; }
/** * @param args */ public static void main(String[] args) { Test3 t = new Test3(2); //t.A=101; //出错,final变量的值一旦给定就无法改变 //t.B=91; //出错,final变量的值一旦给定就无法改变 //t.C=81; //出错,final变量的值一旦给定就无法改变 //t.D=71; //出错,final变量的值一旦给定就无法改变
System.out.println(t.A); System.out.println(t.B); System.out.println(t.C); //不推荐用对象方式访问静态字段 System.out.println(t.D); //不推荐用对象方式访问静态字段 System.out.println("-------"); System.out.println(Test3.C); System.out.println(Test3.D); System.out.println("-------"); //System.out.println(Test3.E); //出错,因为E为final空白,依据不同对象值有所不同. System.out.println(t.E);
Test3 t1 = new Test3(3); System.out.println(t1.E); //final空白变量E依据对象的不同而不同 }
private void test() { System.out.println(new Test3(1).A); System.out.println(Test3.C); System.out.println(Test3.D); }
public void test2() { final int a; //final空白,在需要的时候才赋值 final int b = 4; //局部常量--final用于局部变量的情形 final int c; //final空白,一直没有给赋值. a = 3; //a=4; 出错,已经给赋过值了. //b=2; 出错,已经给赋过值了. } } |
|
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。 |
|
|
public static |
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。 |
|
static变量 |
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 |
|
静态方法可以直接通过类名调用 |
|
|
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。 |
|
|
static中任何new都是无效的 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|