讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中子类通过super关键字修改父类实例属性的深度解析

风涛姑娘_3167

风涛姑娘_3167

发布时间:2025-11-25 17:13:11

|

919人浏览过

|

来源于php中文网

原创

java中子类通过super关键字修改父类实例属性的深度解析

本文旨在深入探讨Java中子类使用`super`关键字修改父类实例属性时的行为。核心内容在于澄清实例变量的作用域,强调每个对象实例(包括父类和子类实例)都拥有其独立的实例变量副本。通过分析具体代码示例,我们将详细解释`super.variable`如何作用于当前子类实例继承的属性,以及为何它不会影响其他独立父类实例的同名属性,从而纠正关于`super`关键字和实例变量作用域的常见误解。

在Java面向对象编程中,继承是实现代码复用和多态性的重要机制。子类可以继承父类的属性和方法。然而,当子类尝试通过super关键字修改父类定义的实例属性时,常常会产生一些关于作用域和对象实例的误解。本教程将通过一个具体的示例来详细阐释这一行为。

理解实例变量与对象实例

首先,我们需要明确“实例变量”这一概念。实例变量是属于对象而不是类本身的变量。这意味着每当我们创建一个类的新实例(即一个对象)时,这个新实例都会拥有自己一套独立的实例变量副本。即使这些变量是在父类中定义的,子类实例继承后,它所操作的也是自己这份副本。

super关键字在子类中用于引用父类的成员(包括方法和变量)。当我们在子类中使用super.variable时,它实际上是指向当前子类实例所继承的那个父类变量副本。它并不会去访问或修改任何其他独立的父类对象实例的变量。

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

示例代码分析

让我们通过以下Java代码示例来具体分析:

package Practice.FruitConst;

public class App {
    public static void main(String[] args) {
        Fruit fruit = new Fruit(); // 1. 创建一个Fruit对象实例
        Apple apple = new Apple(); // 2. 创建一个Apple对象实例

        apple.setPrice(100.0); // 3. 调用Apple实例的setPrice方法
        apple.pp(); // 4. 调用Apple实例的pp方法

        System.out.println("fruit " + fruit.price); // 5. 打印Fruit实例的price
    }
}

class Apple extends Fruit {
    @Override
    public void setPrice(Double price) {
        super.price = price; // 6. 修改当前Apple实例继承的price属性
    }

    public void pp() {
        System.out.println("apple " + this.price); // 7. 打印当前Apple实例的this.price
        System.out.println("fruit? " + super.price); // 8. 打印当前Apple实例的super.price
    }
}

class Fruit {
    String name;
    String color;
    double price; // 9. 定义实例变量price,默认值为0.0

    // 省略 toString, getter, setter 方法,它们与本例核心无关
    public void setPrice(Double price) {
        this.price = price;
    }
}

按照代码执行顺序,我们来逐步分析变量price的变化:

  1. Fruit fruit = new Fruit();

    Java Maven Common
    Java Maven Common

    Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。

    下载
    • JVM创建了一个Fruit类的对象实例,并将其引用赋值给fruit变量。
    • 这个fruit对象拥有自己的实例变量price,其默认值为0.0。
  2. Apple apple = new Apple();

    • JVM创建了一个Apple类的对象实例,并将其引用赋值给apple变量。
    • 由于Apple继承自Fruit,所以这个apple对象也拥有自己继承来的实例变量price,其默认值为0.0。
    • 注意: 此时,fruit对象的price和apple对象的price是两个完全独立的变量。
  3. apple.setPrice(100.0);

    • 调用apple对象(一个Apple类的实例)的setPrice方法。
    • 进入Apple类中重写的setPrice方法:super.price = price;
    • 这里的super.price指的是当前apple对象实例所继承的price属性。因此,apple对象的price属性被更新为100.0。
    • 关键点: 这个操作只影响apple对象的price,对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对象所继承的price属性,此时也为100.0。
      • 输出:fruit? 100.0
    • 注意: 在子类实例内部,this.price和super.price通常指向同一个物理内存位置,即当前子类实例继承的那个属性。只有当子类中定义了与父类同名的实例变量(即变量隐藏,不推荐)时,它们才可能不同。
  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

这与问题中观察到的输出完全一致。

总结与注意事项

  • 实例变量的独立性: Java中每个对象实例都拥有其独立的实例变量副本。即使它们继承自同一个父类,不同对象实例之间的同名实例变量也是相互独立的。
  • super关键字的作用域: 在子类中,super.variable用于访问当前子类实例所继承的父类属性。它不会影响其他独立的父类对象实例的同名属性。
  • 理解对象引用: Fruit fruit = new Fruit(); 和 Apple apple = new Apple(); 创建了两个完全不同的对象实例,它们在内存中占据不同的位置,彼此独立。
  • 避免混淆: 初学者常会将super理解为“访问父类对象”,但实际上它只是“访问当前对象中继承自父类的成员”。

通过本教程的讲解,希望能帮助您更清晰地理解Java中super关键字、实例变量作用域以及对象实例独立性的概念,从而避免在继承关系中操作属性时产生的常见误解。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

相关专题

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

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

6455

2025.09.05

java面向对象
java面向对象

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

342

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

344

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

223

2026.04.17

java多态详细介绍
java多态详细介绍

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

355

2025.11.27

java多态详细介绍
java多态详细介绍

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

355

2025.11.27

java多态详细介绍
java多态详细介绍

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

355

2025.11.27

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

20

2026.10.16

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

20

2026.10.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn