动手动脑11.11

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();

}

}

结果

GrandParent Created.
Parent Created
Child Created

总结父类与子类之间构造方法的调用关系:

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

 

 

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

构造函数用来在创建对象时初始化对象,与new运算符一起使用在创建对象的语句时。子类拥有父类的成员变量和成员方法,如果不调用,则从父类继承而来的成员变量和成员方法得不到正确的初始化。不可以反过来调用,父类不知道子类有什么变量,导致子类得不到正确的初始化,程序出错。

 

3.方法覆盖(override)”的要点

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

public class Father{//定义父类

    public  void  s(){ //定义父类的方法s
    }
}
public  class  Son  extends  Father{ //定义子类son,继承父类father
    public  void  s(){ //定义子类的s方法,覆盖了父类的s方法
      super .s(); //通过super调用父类的s方法
    }
}
4.“类型转换”知识点考核-2

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

m=d; d=m; d=(Dog)m; d=c; c=(Cat)m;

 

编译错误:d=m;d=c;

原因:子类对象可以直接赋给基类变量。
基类对象要赋给子类对象变量,必须执行类型转换,
其语法是:子类对象变量=(子类名)基类对象名;

运行错误:c=(Cat)m

原因:转换混乱。如果类型转换失败Java会抛出以下这种异常:ClassCastException

5.在实践中理解把握复杂的知识-2

运行ParentChildTest.java

结果:

Parent.printValue(),myValue=100
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=200
Child.printValue(),myValue=201

总结:

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

转载于:https://www.cnblogs.com/lqs244/p/7819123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值