关于java的final关键字介绍

  protected

  用来修饰 域,代表域的访问权限是:包权限 或者 不同包,但是是子类 ;

  final 修饰常量

  只要是该常量代入的计算式,在编译时期,就会被执行计算,以减轻运行时的负担。(只对基本数据类型的计算式,奏效)

  final 修饰引用

  这个有个地方需要说下,只是引用指向的对象,一经确定,就不再可以修改为指向别的对象。但是对象本身的属性,可以随意改变;

  空白 final

  就是被申明为final,但是未赋值的域 ,称为 空白final ;但是在使用之前,必须对其进行赋值;

  这样就可以灵活的为其进行赋值,但是又保持了其不可更改的特性 ;

  final 参数

  就是方法参数,被final修饰了;跟final引用一样,无法更改其指向其他对象 ;

  final 方法

  被修饰的方法,只能被继承,但是不能被覆盖 ;被修饰为final的方法,其实是用了前期绑定,因此,在之前这样做是可以提升效率的;

  final 类

  final类不可被继承,final类的方法,都被隐式的设定为final,但是域,不是final的,可以根据自己的意愿来设定 ;

  子父类中同名的 private 方法

  public class test {

  public static void main(String[] args) {

  A a = new B();

  a.haha(); ; // error

  a.hehe(); ; // ok

  }

  }

  class A{

  private void haha(){

  System.out.println(“A”);

  }

  public void hehe(){

  System.out.println("A");

  }

  }

  class B extends A{

  private void haha(){

  System.out.println(“B”);

  }

  }

  它们之间是没有任何关系的;只是恰巧重名了 ;它们不能发生多态的行为;

  方法的覆盖和向上转型,只针对方法是父类中能被子类继承的方法 ;因此,它们之间是没有向上转型、覆盖的说法的,也就没有多态的行为;

  java中的前期绑定

  我们都知道,java是采用后期绑定的;

  但是,其实在java中有的地方,也采用可前期绑定;比如:static方法、final方法;这两种方法是前期绑定的;

  由于private是隐式的final方法,因此,private方法也是前期绑定哦;

  对了 构造器也是前期绑定,因为,其实,那个构造器是隐式的static方法 ;

  免疫多态

  域 和 静态方法 是不会产生多态行为的 ;

  任何对 域 的操作,都是在 编译时期 完成的,此时编译器认为父类引用的就是父类的对象,因此,根本不存在多态的可行性;

  静态方法,不存在多态的原因是:静态方法 是 前期绑定,此时编译器,也是单纯的认为,父类引用指向的就是父类对象,天真!

  对于它们,是 编译看左边,运行看左边;

  class A {

  public int a = 1 ;

  private void haha(){

  System.out.println("A");

  }无锡哪家医院妇科好 http://www.bhnfk.com/

  public void hehe(){

  System.out.println("A");

  }

  public static void aa(){

  System.out.println("aa");

  }

  }

  class B extends A{

  public int a = 2 ;

  private void haha(){

  System.out.println(“B”);

  }

  public static void aa(){

  System.out.println("bb");

  }

  }

  public class test {

  public static void main(String[] args) {

  A a = new B();

  System.out.println(a.a);

  a.aa();

  }

  }

  // output:1 aa ;都是输出父类的。  


猜你喜欢

转载自blog.51cto.com/14335413/2405727