
本教程深入探讨java中`super`关键字在子类中对父类属性赋值的行为。我们将解释实例变量的独立性、`super`关键字的作用范围,并通过代码示例阐明,`super`仅作用于当前子类实例中继承的父类属性,而不会影响其他独立的父类实例。
在Java的面向对象编程中,继承是实现代码复用和多态性的核心机制。子类可以继承父类的属性和方法。然而,对于实例变量的赋值和访问,尤其是结合super关键字使用时,常常会引起一些混淆。本教程将通过一个具体的案例,详细解析super关键字在子类中修改父类属性时的行为,帮助开发者理解实例变量的作用域和对象实例的独立性。
在Java中,当一个类定义了实例变量(非静态变量)时,每创建一个该类的对象实例,该对象就会拥有这些实例变量的一份独立副本。这意味着,即使两个对象是同一个类的实例,它们各自的实例变量也是相互独立的,一个对象的变量值改变不会影响另一个对象的变量值。
当子类继承父类时,子类对象同样会拥有父类中定义的实例变量的副本。这些变量成为子类对象自身的一部分。例如,如果Fruit类有一个price实例变量,那么Apple类继承Fruit后,每个Apple对象也会包含一个price实例变量。
super关键字在Java中有两个主要用途:
立即学习“Java免费学习笔记(深入)”;
需要特别强调的是,无论是访问父类的方法还是实例变量,super关键字始终是在当前对象实例的上下文中操作的。super.variable并不意味着它会去操作一个独立的父类对象,而是指访问当前子类对象中继承自父类的那个实例变量。
我们通过以下代码示例来深入分析super关键字在子类中对父类属性赋值的行为。
package Practice.FruitConst;
public class App {
public static void main(String[] args) {
// 创建一个Fruit类的实例
Fruit fruit = new Fruit();
// 创建一个Apple类的实例
Apple apple = new Apple();
// 通过Apple实例的setter方法设置价格
apple.setPrice(100.0);
// 调用Apple实例的pp方法打印价格
apple.pp();
// 打印Fruit实例的价格
System.out.println("fruit " + fruit.price);
}
}
// Apple类继承自Fruit类
class Apple extends Fruit {
@Override
public void setPrice(Double price) {
// 使用super关键字为当前Apple实例的price属性赋值
super.price = price;
}
public void pp() {
// 打印当前Apple实例的price属性
System.out.println("apple " + this.price);
// 再次打印当前Apple实例中继承的price属性
System.out.println("fruit? " + super.price);
}
}
class Fruit {
String name;
String color;
double price; // 实例变量
// ... 省略其他方法,如toString, getName, setName, getColor, setColor ...
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);
@Override
public void setPrice(Double price) {
super.price = price; // 关键行
}apple.pp();
public void pp(){
System.out.println("apple " + this.price);
System.out.println("fruit? " + super.price);
}System.out.println("fruit " + fruit.price);
最终输出:
apple 100.0 fruit? 100.0 fruit 0.0
这与原始问题中观察到的输出完全一致,也解释了为什么fruit对象的price没有被更新。
通过上述分析,我们可以得出以下关键结论:
注意事项:
理解这些基本概念对于掌握Java的面向对象编程至关重要,尤其是在处理继承和多态性时,能够避免因误解super关键字和实例变量作用域而导致的逻辑错误。
以上就是Java中super关键字与实例变量:理解继承中属性赋值的范围的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号