06-继承与多态

动手动脑

1. 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

构造方法在创建对象时被调用,用来初始化新对象,即为对象成员变量赋初值。

子类要继承父类的成员变量和成员方法,如果不调用父类的构造方法,那么父类的成员变量和成员方法无法在子类创建对象时正确初始化。

反过来调用不可以,因为父类不知道子类有什么变量,这样子类也得不到初始化的父类变量。

 

2.请自行编写代码测试以下特性:

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

 1 package 动手动脑;
 2 //信1605-2 王金萱 20163588
 3 class Father//父类
 4 {
 5     public void Introduce()
 6     {
 7 
 8            System.out.println("I'm father");
 9     }
10 }
11 class Son extends Father//子类
12 {
13      public void Introduce()//覆写父类中的方法
14      {
15          super.Introduce();//调用父类中被覆盖的方法
16          System.out.println("I'm son");
17      }
18 }
19 
20 public class fugai {
21     public static void main(String[] args) {
22         // TODO Auto-generated method stub
23         Father p=new Father();//创建父类对象
24         p.Introduce();
25         p=new Son();
26         p.Introduce();
27     }
28 
29 }

运行结果:

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

              m=d;

              d=m;

              d=(Dog)m;

              d=c;

              c=(Cat)m;

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

判断:

第二句会出错,基类对象要赋给子类对象变量,必须执行类型转换。

第四句会出错,c和d属于不同子类,不同子类对象之间不可以相互赋值。

运行证明:

第二句第四句无法通过编译。

第五句可以通过编译,但是运行时会出错。

因为第一句“m=d;”将Dog类型对象d赋值给父类Mammal类对象m,此时m变为Dog类。

 

4.请看以下“变态”的类(参看示例ParentChildTest.java

上述代码的特点是:子类和父类定义了一模一样的字段和方法

  • 运行以下测试代码

 

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

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

第一行100:Parent类对象parent调用printValue方法输出Parent类中myValue值为100。

第二行200:Child类对象child调用printValue方法输出Child类中myValue值为200。

子类对象赋值给父类对象时,如果子类重写了父类的方法,则属性是父类的,方法是子类的。

第三行200:将子类对象赋给父类对象,此时parent只能调用子类的printValue方法,输出子类myValue值200。

第四行200:parent.myValue++;将父类的myValue值加1,变为101;但是依然只能调用子类的printValue方法输出子类的yValue值为200。

第五行201:因为之前子类对象child已经赋值给父类对象parent,所以此处父类对象parent可以转换类型后转换为子类对象,此时执行myValue++是将子类的myValue值加1,变为201;然后依旧调用子类的printValue方法输出子类的myValue值201。

注意:如果在未进行子类对象对父类对象赋值时,即使使用类型转换,也无法将父类对象赋值给子类;换句话说,如果想使用类型转换将父类对象赋值给子类对象,必须先把子类对象赋值给父类对象。

  • 可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:

  Object obj="Hello";

  if(obj instanceof String)

       System.out.println("obj对象可以被转换为字符串");

 

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

总结(1):子类父类拥有同名的方法时:

  • 当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
  • 这个特性实际上就是面向对象“多态”特性的具体表现。

总结(2):子类父类拥有同名的方法时:

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

 

posted @ 2017-11-09 13:31  顾北清歌寒。  阅读(136)  评论(0编辑  收藏  举报