问题1:总结对象实例化(初始化)的执行顺序。
静态语句块->静态变量初始化->实例语句块/成员变量初始化->构造方法,实例语句块与成员变量初始化的相对执行顺序取决于定义的先后顺序
问题2:总结子类对象实例化(初始化)的执行顺序。
父类static变量(父类static块)->子类static变量(子类static块)->父类成员变量(父类构造块)->父类构造函数->子类成员变量(子类构造块)->子类构造函数
问题3:分析P7示例的程序执行过程,画出程序执行的内存布局。
运行结果:
x=4 y=1
class name:A
x=5 y=1
class name:AA
I am an AA
z=10 x=6 super.x=5 y=1 super.y=1
问题4:总结this与super的用法。
this:1.表示当前对象引用,常用于形参或局部变量与类的成员变量同名的情形,使用this.成员名表示当前对象的成员 2.调用当前类的构造方法,例如this(x)
super:1.子类数据成员或成员方法与父类的数据成员或成员方法名字相同时,当要调用父类的同名方法或同名数据成员时可用super来指明。即super.数据成员,super.成员方法 2.super(参数列表),表示显式调用父类构造方法,对子类对象中从父类继承过来的数据成员初始化
问题5:论述组合与继承的区别以及两者的使用场景(即什么时候宜用组合?什么时候宜用继承?)。
组合与继承都能实现代码的复用。组合是has-a关系,继承是is-a关系;组合不破坏封装,类与类之间相互独立,继承破坏封装,子类缺乏独立性。
使用场景:
当想用原类型作为新类型的内部实现的时候,选择组合;当想重用类或接口的时候,选择继承。
同样条件下,优先使用组合,因为组合更加安全、简单、灵活、高效。
问题6:Java中的运行时多态的含义是什么?通常在什么场景下应用。
使用父类引用指向子类对象,在调用同一父类方法时,不同的子类表示出不同的结果。
在多个子类调用同一父类方法时,增加了程序的扩展性和可维护性。即如果再增加一个子类,不需要改写父类方法,只需要子类继承父类,覆盖父类其中的方法,就可以实现子类。
问题7:论述抽象类与接口的异同以及两者的使用场景。
抽象类:某个问题需要子类除了需要重写父类的抽象方法,还需要从父类继承变量或者重写重要的非抽象方法,就考虑抽象类
接口:某个问题不需要继承,只需要很多子类给出重复的抽象方法的具体实现细节,就用接口
问题8:论述内部类的定义和作用以及匿名内部类的使用。
内部类
定义:内部类就是在某个类的内部又定义了一个类。
作用:隐藏底层实现细节
匿名内部类
定义:匿名内部类就是在产生对象时没有显式地为这个对象创建引用
使用情景:1.如果对一个对象只需要进行一次方法调用 2.将匿名对象作为参数传递给一个函数调用