动手动脑(多态与继承)

动手动脑 1

在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

源代码

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

Son s=new Son();

s.Cs();

}

}

class Parent{

void Cs(){

System.out.println("父类方法");

}

}

class Son extends Parent{

void Cs(){

super.Cs();

System.out.println("子类方法");

}

}

使用super调用父类同名方法。

 

动手动脑 2

下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

m=d;

d=m;

d=(Dog)m;

d=c;

c=(Cat)m;

以上代码中第二句,第四句和第五局不能通过编译

原因

(1)第二句是父类不能直接给子类赋值。像第三局根据类型转换可以完成赋值。

(2)第四句是子类之间的赋值,不能完成。

(3)第五句不能编译是因为此时的mdog类型,子类之间不能强制类型转换。假如没有执行第三局第五句将可以正常编译。

 

 

 

动手动脑 3

运行以下代码

 

 

 

预测结果

输出的值分别为

100

200

200

201

201

结果分析

前三个结果没有问题,后边的结果分析如下

 

 

 经过对代码的修改

         parent.myValue++;

System.out.println(parent.myValue);

parent.printValue();

((Child)parent).myValue++;

System.out.println(child.myValue);

parent.printValue();

输出结果为

101  

201

所以可以看出parent.myValue++;是对parentmyValue进行加1  而前边已经将子类赋值给父类,所以执行输出的时候输出的是childmyValue的值。

所以第四部分结果应该是200

最后一部分将parent转化为child类型之后对myValue 的值修改是改的ChildmyValue的值,最后输出的同样是child的值,所以结果为201

 

原文地址:https://www.cnblogs.com/wys-373/p/7812788.html