当前位置: 首页 > news >正文

Java——super

在Java中,super关键字用于引用父类的成员(属性、方法或构造器)。它在继承关系中非常重要,主要用于以下几种场景:


1. 调用父类的构造器

  • 在子类的构造器中,可以使用super关键字调用父类的构造器。
  • super()必须放在子类构造器的第一行。
  • 如果子类构造器中没有显式调用super(),编译器会自动插入对父类无参构造器的调用。
示例:
class Animal {
    private String name;

    // 父类构造器
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor: " + name);
    }
}

class Dog extends Animal {
    private String breed;

    // 子类构造器
    public Dog(String name, String breed) {
        super(name); // 调用父类构造器
        this.breed = breed;
        System.out.println("Dog constructor: " + breed);
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog("Buddy", "Golden Retriever");
    }
}

输出

Animal constructor: Buddy
Dog constructor: Golden Retriever

2. 访问父类的成员变量

  • 如果子类和父类有同名的成员变量,可以使用super关键字访问父类的成员变量。
示例:
class Animal {
    protected String name = "Animal";
}

class Dog extends Animal {
    private String name = "Dog";

    public void printNames() {
        System.out.println("Subclass name: " + name); // 访问子类的name
        System.out.println("Superclass name: " + super.name); // 访问父类的name
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.printNames();
    }
}

输出

Subclass name: Dog
Superclass name: Animal

3. 调用父类的方法

  • 如果子类重写了父类的方法,可以使用super关键字调用父类的原始方法。
示例:
class Animal {
    public void makeSound() {
        System.out.println("Animal is making a sound.");
    }
}

class Dog extends Animal {
    @Override
    public void makeSound() {
        super.makeSound(); // 调用父类的方法
        System.out.println("Dog is barking: Woof! Woof!");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.makeSound();
    }
}

输出

Animal is making a sound.
Dog is barking: Woof! Woof!

4. superthis的区别

特性superthis
作用引用父类的成员(属性、方法、构造器)引用当前对象的成员(属性、方法、构造器)
调用构造器用于调用父类的构造器(super()用于调用当前类的其他构造器(this()
访问成员变量访问父类的成员变量访问当前类的成员变量
访问方法调用父类的方法(即使子类重写了该方法)调用当前类的方法
位置限制必须放在子类构造器的第一行必须放在构造器的第一行

5. 注意事项

  1. super必须在第一行

    • 在构造器中,super()this()必须作为第一条语句,不能同时出现。
    • 如果子类构造器中没有显式调用super(),编译器会自动插入对父类无参构造器的调用。
  2. 父类必须有无参构造器

    • 如果父类没有无参构造器,子类必须显式调用父类的有参构造器,否则会编译错误。
  3. super不能用于静态上下文

    • super关键字不能用于静态方法或静态代码块中,因为静态成员属于类,而不是对象。

6. 总结

  • super关键字用于在子类中访问父类的成员(属性、方法或构造器)。
  • 它在继承关系中非常重要,尤其是在方法重写和构造器调用时。
  • 合理使用super可以确保子类正确继承和扩展父类的功能。

相关文章:

  • 破解Docker镜像拉取难题:为Docker配置代理加速镜像拉取
  • 【JMeter使用-2】JMeter中Java Request采样器的使用指南
  • 【教学类-89-06】20250220新年篇05——元宵节灯笼
  • 机器学习实战:从理论到应用的完整指南
  • 优艾智合获批广东省复合协作机器人工程技术研究中心
  • 【C#】无法安装程序包“DotSpatial.Symbology 4.0.656”
  • jsherp importItemExcel接口存在SQL注入
  • uniapp多端适配
  • 【C语言】CreateFile函数用法介绍
  • 【AI应用】Cherry Studio结合deepseek搭建本地知识库
  • 实时股票行情接口与WebSocket行情接口的应用
  • 爬虫获取数据后的清洗与校验:完整指南
  • 三甲医院网络架构与安全建设实战
  • 科技快讯 | 京东为外卖骑手缴纳五险一金;全3D打印电喷雾发动机问世;小红书:3个月处置超300万违规账号
  • 【Mysql】我在广州学Mysql 系列—— 有关日志管理的示例
  • ASUS/华硕无畏Pro15 K6500Z 原厂Win11 22H2系统 工厂文件 带ASUS Recovery恢复
  • vue2的计算属性
  • 什么是业务流程分类框架
  • 水利水电安全员主要做什么?其任职资格有哪些?
  • 如何使用springboot项目如何实现小程序里面商品的浏览记录功能案例
  • 证券时报:“好房子”标准即将全面落地,购房者有哪些新期待
  • AI观察|算力饥渴与泡沫
  • 在循环往复的拍摄中,重新发现世界
  • 伊朗港口爆炸已致46人死亡
  • 视觉周刊|2025上海车展的科技范
  • 乌克兰否认俄收复库尔斯克州,称战斗仍在持续