,,,,,,,,,,,根据程序上下文环境,Java关键字最后有“这是无法改变的”或者”终态的“含义,它可以修饰非抽象类,非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
-
<李>最终类不能被继承,没有子类,最终类中的方法默认是最后的。李>
<李>最后方法不能被子类的方法覆盖,但可以被继承。李>
<李>最终成员变量表示常量,只能被赋值一次,赋值后值不再改变。李>
<李>最后不能用于修饰构造方法。李>
,,,,,,,注意:父类的私有成员方法是不能被子类方法覆盖的,因此私人类型的方法默认是最终的类型的。
总的来说,最后用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
1)最后修饰类
,,,,,,,,当用最后修饰一个类时,表明这个类不能被继承,因此最终类的成员方法没有机会被覆盖,默认都是最终的。那也就意味着此类在继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于最终类中的成员,可以定义其为决赛,也可以不是决赛。而对于方法,自然也就成了最后型的。在使用最后修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为最终类。
2)最终修饰方法
,,使用最后的方法的原因有两个。第一就是说明已经知道这个方法提供的功能已经满足要求,不需要进行扩展,并且也不允许任何从此类继承而是的子类来覆写这个方法,但是继承类仍然可以直接使用这个方法。第二就是高效、编译器在遇到调用最后的方法时候会将所有对此方法的调用转化为内联调用的机制,大大提高执行效率。然而当方法主体非常庞大时,或在多处调用此方法时,调用代码便会迅速膨胀,可能反而会影响效率,所以要慎用最后进行方法定义。只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为最终的。例如:
类Test1 { 公共空间f1 () { System.out.println (f1); }//无法被子类覆盖的方法 公众最终无效f2 () { System.out.println (f2); } 公共空间f3 () { System.out.println (f3); } 私人空间f4 () { System.out.println (f4); } } 公开课Test2延伸Test1 { 公共空间f1 () { System.out.println (“Test1父类方法f1被覆盖!”); } 公共静态void main (String [] args) { Test2 t=新Test2 (); t.f1 (); t.f2 ();//调用从父类继承过来的最后的方法 t.f3 ();//调用从父类继承过来的方法//t.f4 ();//调用失败,无法从父类继承获得 } }
,注意:类的私有方法会隐式地被指定为最后方法。
3)最后修饰变量
,,最后修饰变量是用得最多的地方,对于一个最终变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改,如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象.final变量的初始化可以在两个地方,一是其定义处,二是在构造函数中,两者只能选其一。最后修饰的变量有三种:静态变量,实例变量和局部变量,分别表示三种类型的常量.final变量定义的时候,可以先声明,而不给初值,这中变量也称为最终空白,无论什么情况,编译器都确保空白最终在使用之前必须被初始化,有了这个保障,一个类中最后的数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。看下面个例子:
公开课Test3 { 私人最终字符串S=白钪帐道淞縎”; 私人最终int=100; 公众最终int B=90; 公共静态最终int C=80; 私有静态最终int D=70; 公众最终int E;//最后一个空白,必须在初始化对象的时候赋初值 公共Test3 (int x) { E=x; } 私人空白测试(){ system . out。println(新Test3 (1)。); System.out.println (Test3.C); System.out.println (Test3.D); } 公共空间test2 () { 最终int;//最后一个空白,在需要的时候才赋值 最后int b=4;//局部常量,最后用于局部变量的情形 最后一个int c;//最后一个空白,一直没有给赋值。=3;//=4;出的错,已经给赋过值了。//b=2;出的错,已经给赋过值了。 } 公共静态void main (String [] args) { Test3 t=新Test3 (2);//t.A=101;//出错,最后变量的值一旦给定就无法改变//肺结核=91;//出错,最后变量的值一旦给定就无法改变//t.c.=81;//出错,最后变量的值一旦给定就无法改变//t.D=71;//出错,最后变量的值一旦给定就无法改变 System.out.println (t.A); System.out.println(肺结核); System.out.println (t.c.);//不推荐用对象方式访问静态字段 System.out.println (t.D);//不推荐用对象方式访问静态字段 System.out.println (Test3.C); System.out.println (Test3.D);//System.out.println (Test3.E);//出错,因为E为最后空白,依据不同对象值有所不同。 System.out.println (t.E); Test3 t1=new Test3 (3); System.out.println (t1.E);//最后一个空白变量E依据对象的不同而不同 } }浅析对Java关键字最后和静态的理解