深入理解Java之《突破程序员基本功》之面向对象 ---------读书笔记------持续更新

1、创建任何java对象,程序总是先依次调用每个父类非静态初始化块,父类构造器执行初始化(隐式的,也可以显式通过super调用),然后调用本类的非静态初始化块,构造器执行初始化。

2、java对象创建时会调用父类哪个构造器进行初始化需分情况:

a、子类构造器第一行代码使用的super显示调用父类构造器,系统根据其中传入的实参选择父类构造器

b、子类构造器通过this显示调用本类中别的构造方法,则别的构造方法会根据a的情况进行父类构造器的选择

c、子类构造器中没有super也没有this,系统将在子类构造器调用之前隐式调用父类无参的构造方法

d、super和this只能在构造器中的第一行调用,所以构造器中有且只能调用其中之一的一次

3、从内存角度来看,java对象并不是构造器创建的,在构造器执行之前,对象的内存已经分配,构造器只是进行内存中值得分配;一个java对象可以拥有多个同名实例变量(可能继承父类的同名变量);当引用的编译时的类型和运行时的类型不同时,访问该引用的对象的实例变量由声明该变量的类型觉得,而访问该引用的对象的方法时则由它实际引用的类型决定,这可以解释在父类的构造器中调用由子类复写的方法容易出现null,这是因为如果父类的构造器调用被子类复写的方法,当子类创建对象时调用父类的这个构造器,会导致子类重写的方法在子类构造器所有代码之前执行,从而导致子类重写的方法访问不到子类实例变量的值;再深入的理解,如果子类复写了父类的方法,意味着子类定义的方法彻底覆盖父类方法,子类中则不存在父类的方法,而对于实例变量,如果子类定义了与父类同名的实例变量,这个实例变量并不能覆盖父类中的实例变量

4、final修饰的变量必须显示的指定初始值,且只能有三个位置:

a、定义final变量时赋值

b、非静态代码块中赋值

c、构造器中赋值

d、final实例变量本质上,只是在静态初始化块中赋值,

e、final修饰的局部变量不能再赋值,其它跟普通局部变量差别不大,

f、对于final变量,不管是类变量,实例变量,局部变量,只要编译时值能够确定下来,那么,这个值本质上不再是一个变量而是一个常量,当然,如果这个final引用的是另外的变量就另当别论了,若赋值时候使用的是基本的算术表达式(比如表达式中使用了方法或者表达式中含有非确定final值得变量就另当别论),编译的时候这个final同样会被确定下来,编译过程中,final变量会被宏替换成该变量的值

g、如果父类某个方法,使用了final修饰则这个方法不能被子类访问,也不能复写,从这个意义上说,private和final同时修饰某个方法意义就重复了

5、java要求内部类访问局部变量时必须用final修饰是有原因的

对于局部变量而言,其作用域停留在这个方法内,方法结束,局部变量消失,但内部类产生隐式闭包将脱离局部变量存在,也就是说,内部类可能会扩大局部变量的作用域

如果变量没有用final修饰,也就是说可以随意改变,那么将会引起极大的混乱


猜你喜欢

转载自blog.csdn.net/jianjiankedizai/article/details/50921988
今日推荐