01.怎样判断对象是否可以转换?
答:可以使用instanceof运算符判断一个对象是否可以转换为指定的类型
02. 现在有三个类:
class Mammal{}
class Dog extends Mammal {}
class Cat extends Mammal{}
针对每个类定义三个变量并进行初始化
Mammal m=null ;
Dog d=new Dog();
Cat c=new Cat();
下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
出现编译错误:第二行,原因:不能将父类变量赋值给子类变量。
第四行,原因:继承于同一个父类的两个平行子类不能互相赋值。
出现运行错误:第五行,原因:在第一行中,m变量已经指向Dog对象,如果再执行c = (Cat)m,就是让c指向Dog对象,而Cat和Dog之间不存在继承关系,无法让c指向Dog对象。
03.
运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!
通过 super 调用基类构造方法,必须是子类构造方法中的第一个语句。
04.
运行以下测试代码
. 左边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
3. 计算机是不会出错的,之所以得
到这样的运行结果也是有原因的,
那么从这些运行结果中,你能总
结出Java的哪些语法特性?
答:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
如果子类被当作父类使用,则通过子类访问的字段是父类的!