【继承 (extends) vs 接口实现 (implements)】

@[TOC](继承 (extends) vs 接口实现 (implements))

特性继承 (extends)接口实现 (implements)
数量限制只能继承一个类(单继承)可以实现多个接口(多实现
成员类型继承具体实现实现抽象规范
构造方法涉及构造方法链(子类必须调用父类构造方法)不涉及构造方法(接口没有构造方法)
设计目的代码复用和层次关系定义行为和规范

​​构造方法链(Constructor Chaining)

在继承关系中,子类的构造方法会​​隐式或显式调用父类的构造方法​​(通过 super()),形成一条构造方法的调用链。

​​隐式调用​​

如果子类构造方法没有显式调用 super(),Java 会​​自动调用父类的无参构造方法​​。

class Parent {
    Parent() {
        System.out.println("Parent 构造方法");
    }
}

class Child extends Parent {
    Child() {
        // 这里隐式调用了 super();
        System.out.println("Child 构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        // 输出
        // Parent 构造方法
        // Child 构造方法

    }
}

​​显式调用​​

如果父类没有无参构造方法,子类必须​​显式调用 super(参数)​​ 来匹配父类的某个构造方法。

  • super()必须是子类构造方法中的第一条语句
  • 如果父类没有无参构造方法(只有有参构造方法),必须显式调用 super(参数)
  • 如果既不写 super()也不写 this()(调用本类其他构造方法),编译器会自动插入 super()
  • 在一个构造方法中,​​要么显式调用 super(),要么显式调用 this(),要么都不写(此时编译器会自动插入 super())​​。
  • 不能同时调用 super()和 this(),因为它们都必须是构造方法的第一条语句。
class Parent {
    Parent(int x) { // 只有有参构造方法
        System.out.println("Parent 构造方法 with " + x);
    }
}

class Child extends Parent {
    Child() {
        super(10); // 必须显式调用,因为父类没有无参构造方法
        System.out.println("Child 构造方法");
    }
}
class Parent {
    Parent() {
        System.out.println("Parent 构造方法");
    }
}

class Child extends Parent {
    Child() {
        this(10); // 调用本类的另一个构造方法 Child(int x)
        System.out.println("Child 无参构造方法");
    }
    
    Child(int x) {
        // 这里隐式调用了 super();
        System.out.println("Child 有参构造方法,x = " + x);
    }
}

public class Main {
    public static void main(String[] args) {
        Child child = new Child();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值