java中关于继承_关于Java中的继承

关于继承,大家肯定不会陌生,甚至经常使用。

在继承中有这么一条规定:子类无法继承父类的构造方法。

但是我们再看继承条件下的构造方法遵循以下几点规则:

规则一:如果子类的构造方法中没有通过super显式调用有参构造方法,也没用通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。

规则二:如果子类的构造方法中通过super显式调用父类相应的构造方法,那就不执行父类无参构造方法。

规则三:如果子类构造方法中通过this显式调用自身其他的构造方法,在相应构造方法中应用以上两条。

在这时我们如果在写父类时仅构造了一个有参的构造方法,而没有构造无参的构造方法,而在实例化子类时如果调用子类的无参构造方法,这时程序是不能通过编译的,如下:

首先看父类:

public class A {

public String name;

public A(String name){

this.name = name;

}

}

此时父类仅有一个有一个参数的构造方法。

然后看子类

public class B extends A {

public B(){

System.out.println("B");

}

}

此时子类仅有一个无参的构造方法,此时Eclipse中无法通过编译

然后看测试类

public class Test {

public static void main(String[] args) {

B b = new B();

}

}

运行此程序时将在控制台出现以下错误

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

Implicit super constructor A() is undefined. Must explicitly invoke another constructor

at B.(B.java:3)

at Test.main(Test.java:4)

出现这个错误的原因就是上面说的规则一:如果子类的构造方法中没有通过super显式调用有参构造方法,也没用通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。

在子类构造方法中没有使用super关键字,也没有使用this关键字,这时系统会调用父类也就是A类的无参构造方法,但是此时A类中没有无参的构造方法,就会抛出这个异常。

那么上述三个规则就很容易理解了,下面看一个具体示例加深理解。

首先看有一个Person类,有name属性,同时有一个无参的构造方法,和一个有一个参数的构造方法。

public class Person {

String name;

public Person(){

System.out.println("执行人类的无参构造方法");

}

public Person(String name){

this.name = name;

System.out.println("执行人类有一个参数构造方法");

}

}

然后看学生类,它是人类的子类,有个school属性,和一个无参构造方法和全参构造方法

public class Student extends Person {

String school;

public Student(){

System.out.println("执行学生类的无参构造方法!");

}

public Student(String name,String school){

super(name);

this.school = school;

System.out.println("执行学生类全参构造方法");

}

}

然后看研究生类,它是学生类的子类,它有一个导师属性,和一个无参构造方法和一个全参构造方法。

public class Graduate extends Student {

String guide;

public Graduate(){

System.out.println("执行研究生类的无参构造方法");

}

public Graduate(String name,String school,String guide){

super(name, school);

this.guide = guide;

System.out.println("执行研究生类的全参构造方法");

}

}

然后看一下测试类

public class Test {

public static void main(String[] args) {

Graduate g = null;

g = new Graduate();

System.out.println();

g = new Graduate("张三", "北京大学", "李四");

}

}

代码分析:

首先在执行g = new Graduate();后,一共创建了四个对象,按照创建顺序依次是Object、Person、Student、Graduate对象。首先执行Graduate类的无参构造方法,这里没有使用super关键字也没有使用this关键字,这是根据规则一来看,这时会调用父类无参构造方法,Graduate类的父类是Student类;执行Student类的无参构造方法,Student的构造方法也没有使用super和this关键字,因此调用Student类的父类的无参构造方法,Student类的父类是Person类;执行Person类的无参构造方法也没有super和this关键字,这时继续调用Person类的父类的无参构造方法,Person类的父类是Object类,Object类的无参够方法没有做任何处理,这是生成一个Object对象,然后继续执行Person类无参构造方法中剩余部分,即在控制台打印输出执行人类的无参构造方法,然后生成一个Person类对象,然后继续执行Student类无参构造方法剩余部分…………

同时执行g=new Graduate("张三","北京大学","李四");会顺序执行父类的相应的构造方法,同时也是生成四个对象。

我们看一下执行结果截图:

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值