<示例1>
请写出运行结果
答案
分析

<示例2>
题目
答案
分析

类初始化时构造函数调用顺序:
  首先加载类,遇到extends字样会停止加载当前类,加载父类,之后再继续加载。
 
当把一个类完全加载后,这个类的静态成员将被先加载。之后进行如下流程:
1
)初始化对象的存储空间为零或null值;
 2
)调用父类构造函数;
3
)按顺序分别调用类成员变量和实例成员变量的初始化表达式;
 4
)调用本身构造函数

<示例3>this指针
题目
答案


实例方法专用于类的对象,但是在内存中只有一份实例方法供类的所有实例共享,因为为每个对象都复制一份所有实例方法代价很昂贵。
所以系统中专门有这样一种机制来保证:当你调用一个方法时,代码是按专用于这个对象的方式进行,这种机制就是this

每个实例方法都有一个名为this的变量,指的是调用该方法的当前对象。这种机制是当你的方法引用了类的一个实例变量是由编译器隐含使用的

即使对实例变量的每个引用实质上是有 this. 前缀的

当调用一个实例方法时,this变量将被设置成引用它所起作用的特定类对象。


所以的对象都共享这个备份,为了区分开到底是哪个对象在调用这个方法,关键的地方就是this的使用。this把调用方法的上下文对应到当前对象上

本例分析:
调用java中的所有成员变量或者成员函数都隐含了this。所以这个地方就很明了了:构造子类,this指针代表的当前对象是子类实例,子类实例为啥不调用自己overriding的方法呢?!

参考分析

参考java基础(一)

<示例4>

题目
答案
分析:

你总是可以从派生类构造器中调用一个适当的基础类构造器,对基础类构造器的调用必须放在派生类构造器的首位。

 

如果派生类构造器第一个语句不是对基础类构造器的调用,则编译器将替你插入一个对默认基础类构造器的调用:super()

 

如果你自己定义了自己的构造函数,则编译器认为是你会负责一个对象构造的全部细节问题,包括对默认构造器的任何要求,编译器不将管理。

 

如果你构造函数中要使用super() super this() this)等字样,则必须放在第一行。

如果你没有显示指定super() super)字样,系统会在构造函数第一行自动插入super()字样;如果你指定了,系统将按你指定的进行而不是默认的了。

<练习1>

题目

答案


<练习2>