1.实验:利用IDE的debug功能给例6.4和例6.5的new语句设置断点,使用单步调试(step into/step over)跟踪子类对象实例化(初始化)的执行顺序,并总结该过程。
2.如何实现两个对象之间互发消息,请举例说明。
3. 谈谈组合与继承的区别以及两者的使用场景(即什么时候宜用组合 ?什么时候宜用继承?)。
继承中子类可以访问和调用父类的部分属性和方法。组合是通过对现有对象进行拼装即组合产生新的具有更复杂的功能。
当只需要某个类的方法时使用组合。当两个类之间是is-a的关系时使用继承。
4. Java中的运行时多态的含义是什么?有什么作用?请举例说明。
运行时多态指程序运行时系统根据实例的类型选择调用某个方法。当子类重写了父类方法,使用父类引用指向子类对象,再调用某一父类中的方法时,不同子类会表现出不同结果。
运行时多态可以在运行时解决很多事,提供更大的灵活性。
5. 使用接口改写例6.8中的程序。
6. 自定义一个类,覆写equals方法,以满足自身业务需求。
7. 举例说明运算符instanceof的使用场景。
public interface A {
}
public class B implements A{
}
public class C extends B{
}
public class InstanceofTest3 {
public static void main(String[] args) {
A a = null;
B b = null;
boolean result;
result = a instanceof A;
System.out.println(result); // 结果:false null用instanceof跟任何类型比较时都是false
result = b instanceof B;
System.out.println(result); // 结果:false null用instanceof跟任何类型比较时都是false
a = new B();
b = new B();
result = a instanceof A;
System.out.println(result); // 结果:true a是接口A的实例对象引用指向子类类B,类B实现了接口A,所以属于同一个继承树分支
result = a instanceof B;
System.out.println(result); // 结果:true a是接口A的实例对象引用指向子类类B,类B实现了接口A,所以属于同一个继承树分支
result = b instanceof A;
System.out.println(result);// 结果:true b是类B的实例对象,类B实现了接口A,所以属于同一个继承树分支
result = b instanceof B;
System.out.println(result);// 结果:true b是类B的实例对象,类B实现了接口A,所以属于同一个继承树分支
B b2 = new C();
result = b2 instanceof A;
System.out.println(result); // 结果:true b2是父类B引用指向子类C,类B实现了接口A,所以属于同一个继承树分支
result = b2 instanceof B;
System.out.println(result); // 结果:true b2是父类B引用指向子类C,所以属于同一个继承树分支
result = b2 instanceof C;
System.out.println(result); // 结果:true b2是父类B引用指向子类C,所以属于同一个继承树分支
}
}
8. 谈谈抽象类与接口的异同以及两者的使用场景。
相同点:两者都具有抽象方法,都不能实例化,都可以有自己的声明,能引用子类或实现类对象。
不同点:抽象类可以有域变量;接口只能是静态常量。
抽象类可以有具体方法,具体方法可以调用抽象方法;接口有方法则只能是抽象方法。
抽象类必须有子类继承;接口必须有实现类实现。
一个类只能继承一个抽象类,但可以同时实现多个接口。
抽象类用于is-a关系中,接口用于can-do关系中。