浅谈java继承机制——通过super调用父类方法

最近在看代码的时候遇到一个天坑,由于习惯性思维,可能大部分人都会掉近这个坑,所以拿出来记录一下

子类使用super调用的父类方法里,再调用父类的方法

先来看一段代码(该段代码只是作为测试用,正常编码时类名一定要规范编写)

package supertetst;

/**
 * @Author: x1aolone
 * @Date: 2019/11/8 22:11
 */

class father {
   
   
    public void invoke () {
   
   
        say();
    }

    public void say () {
   
   
        System.out.println("father say");
    }
}

class child extends father{
   
   
    @Override
    public void invoke () {
   
    
    	super.invoke(); 
    }

    @Override
    public void say () {
   
    
    	System.out.println("child say"); 
    }
}


public class test {
   
   
    public static void main(String
### Java使用 `super` 调用父类方法使用方式 在Java中,`super`关键字用于引用当前对象的直接父类中的成员(包括方法和构造函数)。通过`super`可以显式地调用父类方法或构造函数。以下是关于如何使用`super`调用父类方法的具体说明: #### 1. 使用 `super` 调用父类的非静态方法子类需要调用父类中被重写的方法时,可以通过`super`关键字来实现。例如,在子类中定义了一个与父类同名的方法,并希望在子类方法调用父类方法,可以这样操作[^2]: ```java class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { void eat() { super.eat(); // 调用父类的eat方法 System.out.println("Dog is eating"); } } ``` #### 2. 使用 `super` 调用父类的构造方法子类需要调用父类的构造方法时,必须在子类构造方法的第一行使用`super`关键字。如果父类没有无参构造函数,那么子类必须显式调用父类的带参构造函数[^3]。例如: ```java class Animal { String name; // 父类的构造方法 Animal(String name) { this.name = name; System.out.println("Animal constructor called"); } } class Dog extends Animal { // 子类的构造方法 Dog(String name) { super(name); // 调用父类的构造方法 System.out.println("Dog constructor called"); } } ``` #### 3. 注意事项 - 如果父类有无参构造函数,则子类构造函数可以省略`super`调用,默认会调用父类的无参构造函数[^1]。 - 如果父类没有无参构造函数,子类必须显式调用父类的带参构造函数,否则会出现编译错误[^3]。 #### 4. 示例代码 以下是一个完整的示例,展示如何在子类使用`super`调用父类的构造方法方法: ```java class Animal { String name; // 父类的构造方法 Animal(String name) { this.name = name; System.out.println("Animal constructor called: " + name); } void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { // 子类的构造方法 Dog(String name) { super(name); // 调用父类的构造方法 System.out.println("Dog constructor called"); } void eat() { super.eat(); // 调用父类的eat方法 System.out.println("Dog is eating"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog("Rex"); dog.eat(); } } ``` 运行结果: ``` Animal constructor called: Rex Dog constructor called Animal is eating Dog is eating ``` ###
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值