继承与多态-课后作业

一、继承条件下的构造方法调用

1、父类与子类之间构造方法的调用关系

 Java 中,无论是 explicit 还是 implicit 方式,都要求在子类的构造方法中调用其父类的构造方法。如果父类无构造方法(其实是一个默认无参的构造方法),那么子类的构造方法中会自动进行调用;如果 父类有自己的构造方法(这时父类不会有默认无参的构造方法),那么在子类的构造方法中,必须要调用父类的某个构造方法,而且必须是在构造方法的第一个语句中进行调用。

2、通过super调用基类构造方法,必须是子类构造方法中的第一个语句。

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

构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。 构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。 子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。 不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!

 

二、自行编写代码测试以下特性:在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

 

     class Parent2{

 

public void show() {

 

System.out.println("我是父类");

 

}

 

}

 

class Child2 extends Parent2{

 

public void show() {

 

super.show();

 

System.out.println("我是子类");

 

}

 

}

 

public class Test {

 

 

 

public static void main(String[] args) {

 

// TODO Auto-generated method stub

 

       Child2 c=new Child2();

 

       c.show();

 

}

 

 

 

}

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

自我判断:d=m”,“d=c”会引起编译错误;“c=(Cat)m”会引起运行时错误。

截图如下:

   

原因:d=m”编译错误是因为Mammal类是Dog类的父类,子类中的成员比父类的多,父类无法将子类初始化;“d=c”编译错误是因为两者代表不同的类,不能给对方赋值;c=(Cat)m”会引起运行时错误是因为Dog类的对象d已将Mammal类的对象m初始化,m被转换为Dog类后不能再转换为Cat类。

四、回答问题:1、左边的程序运行结果是什么?

2、总结:当子类与父类有一样的方法时,对象是子类型的,他就调用子类型的方法,是父类型的,他就调用父类型的方法。如果子类与父类中有相同的字段,则子类中的字段会代替或隐藏父类中的字段。

 

posted on 2017-11-09 13:41  同手同脚&&  阅读(114)  评论(0编辑  收藏  举报

导航