继承与多态 动手动脑

1.代码和测试结果如下

class Grandparent
{


public Grandparent()
{

System.out.println("GrandParent Created.");

}


public Grandparent(String string)
{

System.out.println("GrandParent Created.String:" + string);

}

}

class Parent extends Grandparent
{


public Parent()
{

//super("Hello.Grandparent.");

System.out.println("Parent Created");

// super("Hello.Grandparent.");

}

}

class Child extends Parent
{


public Child()
{

System.out.println("Child Created");

}

}

public class TestInherits
{


public static void main(String args[])
{

Child c = new Child();

}

}

2.我的猜想:

Parent.printValue(),myValue=100

Child.printValue(),myValue=200

Parent.printValue(),myValue=101

Child.printValue(),myValue=200

Child.printValue(),myValue==201

.程序运行的结果是:

 

解释:

第三行输出的是200,原因是:

parent.myValue++相当于parent.myValue+parent.myValue即两次调用parent的方法,故输出应该是200

总结:

对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

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

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

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

思考:

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

构造函数是一种特殊的方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们,即构造函数的重载。构造函数的主要功能用于在类的对象创建时定义初始化的状态。

构造一个对象,先调用其构造方法和成员变量。

子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和方法得不到正确的初始化。

不能反过来调用也是这个原因,因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序出错!

原文地址:https://www.cnblogs.com/sunshine-z/p/7816864.html