
本文深入探讨Java中`super`关键字在子类中访问父类实例变量的行为,以及实例变量在继承体系下的独立性。我们将阐明每个对象实例拥有其独立状态的机制,即使通过继承共享变量定义,不同对象实例间的变量值也互不影响。理解`super`关键字的作用范围,以及它如何与当前对象实例的继承成员交互,对于掌握Java面向对象编程至关重要。
在Java中,当您创建一个类的实例(即一个对象)时,该对象会拥有其自身的一套实例变量。这意味着,即使两个对象是同一个类的实例,或者一个对象是另一个对象的子类实例,它们各自的实例变量也是独立存储的。对一个对象实例的实例变量进行修改,不会影响到其他任何对象实例的同名实例变量,除非它们引用的是同一个共享对象(例如,通过赋值传递引用)。
当一个类继承另一个类时,子类会继承父类的实例变量。这些继承来的变量成为了子类实例的一部分。然而,这并不意味着子类实例和父类实例共享同一个变量的存储空间。相反,每个子类实例都会拥有其继承自父类的实例变量的独立副本。
super关键字在Java中主要有两个用途:
立即学习“Java免费学习笔记(深入)”;
重要的是要理解,无论super是用于调用方法还是访问变量,它始终是在当前子类对象实例的上下文中操作的。它不会去操作一个单独的、独立的父类对象实例。super.variable指的是当前子类对象中继承自父类的那个实例变量。
让我们通过一个具体的代码示例来深入理解这一点。
package Practice.FruitConst;
public class App {
public static void main(String[] args) {
Fruit fruit = new Fruit(); // 创建一个Fruit对象实例
Apple apple = new Apple(); // 创建一个Apple对象实例
apple.setPrice(100.0); // 调用Apple对象的setPrice方法
apple.pp(); // 调用Apple对象的pp方法
System.out.println("fruit " + fruit.price); // 打印Fruit对象的price
}
}
class Apple extends Fruit {
@Override
public void setPrice(Double price) {
super.price = price; // 修改当前Apple对象中继承自Fruit的price变量
}
public void pp() {
System.out.println("apple " + this.price); // 打印当前Apple对象的price
System.out.println("fruit? " + super.price); // 再次打印当前Apple对象的price(通过super)
}
}
class Fruit {
String name;
String color;
double price; // 实例变量,默认值为0.0
// 省略构造器、getter/setter、toString方法,与示例无关紧要
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}代码执行分析:
Fruit fruit = new Fruit();
Apple apple = new Apple();
apple.setPrice(100.0);
apple.pp();
System.out.println("fruit " + fruit.price);
最终输出:
apple 100.0 fruit? 100.0 fruit 0.0
这与您观察到的输出完全一致,也解释了为什么fruit对象的price没有被修改。
通过以上分析,我们明确了super关键字在Java继承中的精确行为,以及实例变量在不同对象实例间的独立性。理解这些核心概念是编写健壮、可维护的Java面向对象代码的基础。
以上就是Java继承中super关键字与实例变量的独立性解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号