06-继承与多态(动手动脑与验证)

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

测试代码一:

 1 class Grandparent
 2 {
 3     public Grandparent()
 4      {
 5             System.out.println("GrandParent Created.");
 6 }
 7     public Grandparent(String string)
 8     {
 9             System.out.println("GrandParent Created.String:" + string);
10     }
11 }
12
13 class Parent extends Grandparent
14 {
15     public Parent()
16     {
17             //super("Hello.Grandparent.");
18             System.out.println("Parent Created");
19             // super("Hello.Grandparent.");
20     }
21 }

测试结果:

测试代码二:

 1 class Grandparent
 2 {
 3     public Grandparent()
 4      {
 5             System.out.println("GrandParent Created.");
 6 }
 7     public Grandparent(String string)
 8     {
 9             System.out.println("GrandParent Created.String:" + string);
10     }
11 }
12
13 class Parent extends Grandparent
14 {
15     public Parent()
16     {
17             super("Hello.Grandparent.");
18             System.out.println("Parent Created");
19             // super("Hello.Grandparent.");
20     }
21 }

测试结果:

测试代码三:

 1 //编译错误
 2 class Grandparent
 3 {
 4     public Grandparent()
 5      {
 6             System.out.println("GrandParent Created.");
 7 }
 8     public Grandparent(String string)
 9     {
10             System.out.println("GrandParent Created.String:" + string);
11     }
12 }
13
14 class Parent extends Grandparent
15 {
16     public Parent()
17     {
18             //super("Hello.Grandparent.");
19             System.out.println("Parent Created");
20             super("Hello.Grandparent.");        //报错
21     }
22 }    

测试结果:

(构造函数调用必须在构造函数第一条语句)

结论:子类的构造方法在运行之前,必须调用父类的构造方法。

原因:构造函数的作用为初始化,当被继承的父类未初始化时,无法生成子类对象。

二、ParentChildTest

程序代码:

 1 package ParentChild;
 2 public class ParentChildTest {
 3     public static void main(String[] args) {
 4         Parent parent=new Parent();
 5         parent.printValue();
 6         Child child=new Child();
 7         child.printValue();
 8
 9         parent=child;
10         parent.printValue();
11
12         parent.myValue++;
13         parent.printValue();
14
15         ((Child)parent).myValue++;
16         parent.printValue();
17
18     }
19 }
20
21 class Parent{
22     public int myValue=100;
23     public void printValue() {
24         System.out.println("Parent.printValue(),myValue="+myValue);
25     }
26 }
27 class Child extends Parent{
28     public int myValue=200;
29     public void printValue() {
30         System.out.println("Child.printValue(),myValue="+myValue);
31     }
32 }

预测输出结果:

实际执行结果:

原因分析:

  当子类与父类具有相同名称的成员时,调用子类对象,默认调用的是子类中的成员,即父类同名成员被隐藏。

  当父类变量引用一个子类对象时,使用父类还是子类成员,由对象自己的“真实”类型所决定

时间: 2024-11-09 04:56:43

06-继承与多态(动手动脑与验证)的相关文章

继承与多态 动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

03继承与多态 动手动脑

动手实验:继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String st

继承与多态———动手动脑

public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(); ((Child)pa

06继承与多态

继承与多态动手动脑问题: public class ParentChildTest { public static void main(String[] args) { Parent parent=new Parent(); parent.printValue(); Child child=new Child(); child.printValue(); parent=child; parent.printValue(); parent.myValue++; parent.printValue(

继承多态动手动脑

[1] 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来? 提示: 构造函数的主要作用是什么? 从这个方面去想! [答] 构造函数(constructor)是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载.构造函数的功能主要用于在类的对象创建时定义初始化的状态. 构造一个对象,先调用其构造方法

java多态动手动脑

实验任务一:多态实现ATM工作原理 1)源代码: package demo; import java.util.Scanner; class A{ String name; String date; String mima; int yu; String kahao; public A(String name,String date,String mima,int yu,String kahao) { this.name=name; this.date=date; this.mima=mima;

第八章多态动手动脑

[动手动脑一] "类型转换"知识点考核-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 stat

06 继承与多态

动手实验 因为子类继承于父类,构造方法相当于对象初始化,只有父类先完成初始化,子类对象才能执行自己的初始化.子类在进行初始化的时候会默认调用父类的构造,所以不能反过来. 2 动手动脑 代码: 1 package Parent_son; 2 class Parent 3 { 4 public int value=100; 5 6 public void Introduce() 7 { 8 9 System.out.println("I'm father"); 10 11 } 12 } 1

继承与多态——动手又动脑

1.首先,第一次执行完源代码后 了解到当调用一个子类的构造方法时,它会依次调用父类的构造函数.以下是原因:当一个类继承了其它类时,在它的构造函数(constructor)中super()必须被首先调用,如果super()没有被调用,则编译器将在构造函数(constructor)的第一行插入对super()的调用.这就是为什么当创建一个子类的对象时会调用父类的构造函数(constructor)的原因. 通过super调用基类构造方法时,必须是子类构造方法中的第一个语句.否则就会报错 构造一个对象,