问题1:
继承条件下的构造方法调用?
通过super语句调用父类方法super()或super(参数)但父类构造方法必须在子类构造方法中是第一个语句。
问题2:
为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造方法的主要作用是初始化,在创造子类之前,我们必须先初始化父类,才能创造子类,再进行子类的初始化。这就要求先进行父类的构造函数,之后是子类的构造函数。
问题3:
注意最后一句,一个字串和一个对象“相加”,得到以下结果:
为什么?
在“+”运算中,当任何一个对象与一个String对象连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
问题4:
现在有三个类:
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;
答:1.正确,子类可以直接给父类赋值
2.不正确,父类必须通过强制转换给子类赋值
3.正确
4. 不正确,dog类与cat类无联系。
5.不正确,m变量在第一句已经转换为dog类,dog类与cat类无关联,无法转换
问题5:
1. 左边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
3. 计算机是不会出错的,之所以得 到这样的运行结果也是有原因的, 那么从这些运行结果中,你能总 结出Java的哪些语法特性?
答:
1运行结果:
Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201
2.原因:
首先第一次输出输出parent类的value值,第二次输出child类value值,之后进行覆盖,此时parent的类型已经是child类了,再次输出为child的200。
之后进行了加一操作,但没起作用,这是因为parent已经是child类变量,无法通过原来parent的方法实现自增,只能转换为child类进行自增。
3.特性:
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。