继承与多态 动手动脑
Posted kt-xb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承与多态 动手动脑相关的知识,希望对你有一定的参考价值。
1.为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造函数是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。
构造一个对象,先调用其构造方法,来初始化其成员函数和成员变量。
子类拥有父的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。
不能反过来调用是因为父类根本不知道子类有什么变量而且这样一来子类也得不到初始化的父类变量,导致程序运行出错!
2.请编写代码测试在子类中,调用父类中被覆盖的方法,可是使用super关键字。
class Parent { public Parent() { System.out.println("Parent Created1"); } public void show(){ System.out.println("Parent Created2"); } } class Child extends Parent { public Child() { System.out.println("Child Created1"); } public void show(){ super.show(); System.out.println("Parent Created3"); } } public class text { public static void main(String args[]) { Child c = new Child(); c.show(); } }
3.
class Dog extends Mammal {}
class Cat extends Mammal{}
{
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;
}哪一个语句将引起编译错误?为什么?哪一个会引起运行时的错误?为什么?
第一行与第二行:分别创建子类和父类的对象,并调用各自的方法。
第三行:将子类对象child赋值给父类对象parent,父类对象parent的属性值不变,只是将父类的同名方法覆盖,所以当父类对象parent只能调用子类的printValue()方法,又因为子类方法访问的是子类中的字段而不是父类,所以输出子类对象parent的myValue属性值200。
第四行:parent.myValue++是将父类对象parent的属性myValue++,变为101,但是父类对象parent调用方法时调用的还是子类的printValue()方法,子类方法访问的还是子类中的字段,所以输出子类对象child的myValue属性值200。
第五行:把父类对象parent强制类型转换成子类Child类型,此时对象parent的为子类对象,拥有子类的属性和方法,因此((Child)parent).myValue++后,parent的myValue的属性值变为201,输出结果201。
Java特性总结:
1.当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
2.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
3.如果子类被当作父类使用,则通过子类访问的字段是父类的。
以上是关于继承与多态 动手动脑的主要内容,如果未能解决你的问题,请参考以下文章