0

0

Java继承中super关键字与实例变量的独立性解析

花韻仙語

花韻仙語

发布时间:2025-11-25 15:11:09

|

455人浏览过

|

来源于php中文网

原创

java继承中super关键字与实例变量的独立性解析

本文深入探讨Java中`super`关键字在子类中访问父类实例变量的行为,以及实例变量在继承体系下的独立性。我们将阐明每个对象实例拥有其独立状态的机制,即使通过继承共享变量定义,不同对象实例间的变量值也互不影响。理解`super`关键字的作用范围,以及它如何与当前对象实例的继承成员交互,对于掌握Java面向对象编程至关重要。

理解Java中的实例变量与对象独立性

在Java中,当您创建一个类的实例(即一个对象)时,该对象会拥有其自身的一套实例变量。这意味着,即使两个对象是同一个类的实例,或者一个对象是另一个对象的子类实例,它们各自的实例变量也是独立存储的。对一个对象实例的实例变量进行修改,不会影响到其他任何对象实例的同名实例变量,除非它们引用的是同一个共享对象(例如,通过赋值传递引用)。

继承与实例变量

当一个类继承另一个类时,子类会继承父类的实例变量。这些继承来的变量成为了子类实例的一部分。然而,这并不意味着子类实例和父类实例共享同一个变量的存储空间。相反,每个子类实例都会拥有其继承自父类的实例变量的独立副本。

super关键字的作用

super关键字在Java中主要有两个用途:

立即学习Java免费学习笔记(深入)”;

  1. 调用父类的构造器:在子类构造器中,使用super()可以调用父类的相应构造器。
  2. 访问父类的成员:在子类中,可以使用super.method()调用父类的方法,或者super.variable访问父类的实例变量(当子类有同名变量或需要明确指定访问父类版本时)。

重要的是要理解,无论super是用于调用方法还是访问变量,它始终是在当前子类对象实例的上下文中操作的。它不会去操作一个单独的、独立的父类对象实例。super.variable指的是当前子类对象中继承自父类的那个实例变量。

案例分析:super.price = price; 的行为

让我们通过一个具体的代码示例来深入理解这一点。

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;
    }
}

代码执行分析:

  1. Fruit fruit = new Fruit();

    AI Web Designer
    AI Web Designer

    AI网页设计师,快速生成个性化的网站设计

    下载
    • 创建了一个Fruit类型的对象实例,并将其引用赋值给fruit变量。
    • 此fruit对象的price实例变量被初始化为默认值 0.0。
  2. Apple apple = new Apple();

    • 创建了一个Apple类型的对象实例,并将其引用赋值给apple变量。
    • 此apple对象继承了Fruit类的price实例变量,并被初始化为默认值 0.0。
    • 注意: fruit对象和apple对象是两个完全独立的实例,它们各自拥有独立的price变量。
  3. apple.setPrice(100.0);

    • 调用了apple对象的setPrice方法(Apple类中重写的方法)。
    • 方法体中的 super.price = price; 语句执行。
    • 这里的 super.price 指的是当前apple对象中继承自Fruit的那个price实例变量。
    • 因此,apple对象的price变量被更新为 100.0。
    • 关键点: 这条语句对fruit对象(即new Fruit()创建的那个对象)的price变量没有任何影响。
  4. apple.pp();

    • 调用apple对象的pp方法。
    • System.out.println("apple " + this.price);
      • this.price 指的是当前apple对象的price实例变量。其值为 100.0。
      • 输出:apple 100.0
    • System.out.println("fruit? " + super.price);
      • super.price 同样指的是当前apple对象中继承自Fruit的price实例变量。其值为 100.0。
      • 注意: 在一个对象实例内部,this.price 和 super.price 通常引用的是同一个实例变量(除非子类隐藏了父类的同名实例变量,但这种做法不推荐且不常见)。super在这里更多是表明这个变量定义在父类中。
      • 输出:fruit? 100.0
  5. System.out.println("fruit " + fruit.price);

    • 打印fruit对象的price实例变量。
    • 由于fruit对象的price从未被修改,它仍然保持其默认值 0.0。
    • 输出:fruit 0.0

最终输出:

apple 100.0
fruit? 100.0
fruit 0.0

这与您观察到的输出完全一致,也解释了为什么fruit对象的price没有被修改。

总结与注意事项

  • 实例变量的独立性: Java中每个对象实例都拥有其独立的实例变量副本。对一个对象的实例变量进行操作,不会影响其他对象。
  • super关键字的上下文: super关键字始终在当前对象实例的上下文中工作。super.variable访问的是当前对象实例中继承自父类的那个实例变量,而不是一个独立的父类对象。
  • this与super在实例变量上的关系: 在子类实例中,this.inheritedVariable和super.inheritedVariable通常指向同一个实例变量。super更多是提供了一种明确指定访问父类成员的语法,尤其是在方法重写或变量隐藏的场景下。
  • 共享状态的实现: 如果确实需要在不同对象实例间共享数据,可以考虑使用static(静态)变量(类变量),或者让多个对象引用同一个可变对象。但需谨慎使用,因为这会引入线程安全等复杂性。

通过以上分析,我们明确了super关键字在Java继承中的精确行为,以及实例变量在不同对象实例间的独立性。理解这些核心概念是编写健壮、可维护的Java面向对象代码的基础。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

63

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

109

2024.02.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.3万人学习

Java 教程
Java 教程

共578课时 | 81.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号