第八章多态动手动脑

【动手动脑一】

“类型转换”知识点考核-2

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

m=d;

              d=m;

              d=(Dog)m;

              d=c;

              c=(Cat)m;

先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。

class Mammal{}

class Dog extends Mammal {}

class Cat extends Mammal {}

 

public class TestCast

{

       public static void main(String args[])

       {

              Mammal m;

              Dog d=new Dog();

              Cat c=new Cat();

              m=d;

              //d=m;

              d=(Dog)m;

              //d=c;

              //c=(Cat)m;

 

       }

}

结论:父类对象经过子类强制转换可以赋值给子类的对象,而子类对象可以赋值给父类对象。同为子类对象不能互相赋值。

 

【动手动脑二】

在实践中理解把握复杂的知识-2

运行以下测试代码

 

回答问题:

1. 左边的程序运行结果是什么?

2. 你如何解释会得到这样的输出?

3. 计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

答:

1、程序运行结果:

2、(1)子类对象可以赋值给父类的对象。父类进行子类强制转换可以赋值给子类的对象。

(2)子类能覆盖父类,但是父类中的变量的值是不改变的,访问父类中的变量时可用super来访问,反之则一直被子类覆盖。父类被覆盖时,对父类中的变量进行操作时,父类中的变量改变,但输出时仍输出覆盖父类的子类的变量。

(3)(child)Parent.myValue++,这时改变的将是覆盖父类的子类。

3、当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

这个特性实际上就是面向对象“多态”特性的具体表现。

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

如果子类被当作父类使用,则通过子类访问的字段是父类的!

posted @ 2016-11-18 23:10  李兆轩  阅读(295)  评论(0编辑  收藏  举报