super与构造方法

我先把题目贴出来,一点都不懂的就看我对照这几个题讲解super再联系后面的习题

class Super {
    public Super() {
        System.out.println("Super()");
    }

    public Super(String str) {
        System.out.println("Super(String)");
    }
}

public class Sub extends Super {

    public Sub() {
        super();
        System.out.println("Sub()");
    }

    public Sub(int i) {
        this();
        System.out.println("Sub(int)");
    }

    public Sub(String str) {
        super(str);
        System.out.println("Sub(String)");
    }

    public static void main(String[] args) {
        Sub s1 = new Sub();
        Sub s2 = new Sub(10);
        Sub s3 = new Sub("hello");
    }
}

不要说我不写测试类哇,我这个是为了方便在这里插入图片描述

首先子类继承父类

子类继承父类的话会先实现父类的构造方法!!!及时不写super();都会优先实现父类的无参构造

Sub s1 = new Sub();当读到这一条时应该先实现Super的无参构造

System.out.println(“Super()”);

再实现Sub的无参构造

System.out.println(“Sub()”);

Sub s2 = new Sub(10);中有一个int类型的参数

那我们回过头去找找

 public Sub(int i) {
        this();
        System.out.println("Sub(int)");
    }

大家可能有问题这个this()是个啥
在这里插入图片描述
this() 大家看里面是没东西的,那么他指的是子类的还是父类的呢?
他这里的this()应该指的是就近的无参构造就是Sub()
!!!那么调用了Sub()那就要实现Sub()的父类无参构造不然没有爸爸哪来的儿子
就把无参构造又走了一遍答案就是

System.out.println(“Super()”);
System.out.println(“Sub()”);

再看到 Sub s2 = new Sub(10);他父类没有int 参数的方法那就直接执行呗

System.out.println(“Sub(int)”);

最后:
**Sub s3 = new Sub(“hello”);**子类和父类中都有String类型的就有是先执行父类构造方法再执行子类构造方法咯

System.out.println(“Super(String)”);

System.out.println(“Sub(String)”);

所以最后答案显而易见咯

//Super()
//Sub()
//Super()
//Sub()
//Sub(int)
//Super(String)
//Sub(String)

### 原理 `super` 调用构造方法的原理基于 Java继承机制。在 Java 中,每个子类对象都包含一个父类对象的部分。当创建子类对象时,Java 要求先初始化其父类对象部分,这是通过调用父类的构造方法来实现的。`super` 关键字就是用来显式调用父类的构造方法。如果子类构造方法中没有显式调用 `super()` (无参构造方法)或 `super(参数列表)` (有参构造方法),编译器会自动在子类构造方法的第一行插入 `super()` 调用父类的无参构造方法。如果父类没有无参构造方法,且子类构造方法中没有显式调用父类的其他构造方法,就会出现编译错误,如 “Implicit super constructor Person() is undefined for default constructor. Must define an explicit constructor” [^3]。 ### 使用场景 1. **父类没有无参构造方法**:当父类中没有定义无参构造方法时,子类的构造方法必须显式调用父类的有参构造方法,否则会编译错误。 2. **需要传递特定参数给父类构造方法**:如果在创建子类对象时,需要向父类构造方法传递特定的参数来初始化父类的成员变量,就需要使用 `super` 调用父类的有参构造方法。 3. **明确初始化父类部分**:在某些情况下,需要明确指定使用父类的某个构造方法来初始化父类对象部分,以确保父类对象的正确初始化。 ### 示例 ```java // 父类 class Animal { private String name; // 父类有参构造方法 public Animal(String name) { this.name = name; System.out.println("Animal 构造方法被调用,name: " + this.name); } } // 子类 class Cat extends Animal { private String breed; // 子类构造方法,使用 super 调用父类的有参构造方法 public Cat(String name, String breed) { super(name); // 调用父类的有参构造方法 this.breed = breed; System.out.println("Cat 构造方法被调用,breed: " + this.breed); } public static void main(String[] args) { Cat cat = new Cat("Tom", "British Shorthair"); } } ``` 在上述示例中,`Animal` 类是父类,有一个有参构造方法。`Cat` 类是子类,在其构造方法中使用 `super(name)` 调用了父类的有参构造方法,以初始化从父类继承的 `name` 成员变量。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值