java继承与多态课后作业

问题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关键字来访问它。

 

posted @ 2017-11-09 17:28  牛头怪  阅读(361)  评论(0编辑  收藏  举报