浅析对Java关键字final和static的理解-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

成都创新互联公司于2013年创立,是专业互联网技术服务公司,拥有项目网站建设、成都做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元永嘉做网站,已为上家服务,为永嘉各地企业和个人服务,联系电话:18982081108

一、final

            根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

  • final类不能被继承,没有子类,final类中的方法默认是final的。
  • final方法不能被子类的方法覆盖,但可以被继承。
  • final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
  • final不能用于修饰构造方法。

        注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

总的来说,final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

1)final修饰类

         当用final修饰一个类时,表明这个类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。那也就意味着此类在继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员,可以定义其为final,也可以不是final。而对于方法,自然也就成了final型的。在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者出于安全的考虑,尽量不要将类设计为final类。

2)final修饰方法

   使用final方法的原因有两个。第一就是说明已经知道这个方法提供的功能已经满足要求,不需要进行扩展,并且也不允许任何从此类继承而是的子类来覆写这个方法,但是继承类仍然可以直接使用这个方法。第二就是高效,编译器在遇到调用final方法时候会将所有对此方法的调用转化为inline调用的机制,大大提高执行效率。然而当方法主体非常庞大时,或在多处调用此方法时,调用代码便会迅速膨胀,可能反而会影响效率,所以要慎用final进行方法定义。只有在想明确禁止该方法在子类中被覆盖的情况下才将方法设置为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方法 
  t.f3(); //调用从父类继承过来的方法 
  //t.f4(); //调用失败,无法从父类继承获得 
 } 
} 

网页名称:浅析对Java关键字final和static的理解-创新互联
网站链接:http://scjbc.cn/article/cdssog.html

其他资讯