Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么Java中类的成员变量不能被重写?成员变量在Java中能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

为什么Java中类的成员变量不能被重写?成员变量在Java中能够被重写么?不会重写成员变量,而是隐藏成员变量访问隐藏域的方法

作者头像
desperate633
发布于 2018-08-22 07:21:57
发布于 2018-08-22 07:21:57
3.8K00
代码可运行
举报
文章被收录于专栏:desperate633desperate633
运行总次数:0
代码可运行

这篇文章讨论了Java面向对象概念中一个基本的概念--Field Hiding(成员变量隐藏)

成员变量在Java中能够被重写么?

Let’s first take a look at the following example which creates two Sub objects. One is assigned to a Sub reference, the other is assigned to a Super reference. 我们看下面这个例子,我们创建了两个子对象,一个使用的是子对象的引用,一个使用的是父对象的引用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FieldOverriding {

    public static void main(String[] args) {
        Sub c1 = new Sub();
        Super c2 = new Sub();
        System.out.println(c1.s);
        System.out.println(c2.s);

    }

}

class Super {
    String s = "Super";
}

class Sub extends Super {
    String s = "Sub";
}

程序的输出结果是:

Paste_Image.png

按照我们已有的多态的概念,第二个应该是输出sub才对,但却输出了super。这是为什么呢?

不会重写成员变量,而是隐藏成员变量

Java文档中对隐藏域的定义:

Within a class, a field that has the same name as a field in the superclass hides the superclass’s field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super. Generally speaking, we don’t recommend hiding fields as it makes code difficult to read.

意思就是:

在一个类中,子类中的成员变量如果和父类中的成员变量同名,那么即使他们类型不一样,只要名字一样。父类中的成员变量都会被隐藏。在子类中,父类的成员变量不能被简单的用引用来访问。而是,必须从父类的引用获得父类被隐藏的成员变量,一般来说,我们不推荐隐藏成员变量,因为这样会使代码变得难以阅读。

其实,简单来说,就是子类不会去重写覆盖父类的成员变量,所以成员变量的访问不能像方法一样使用多态去访问。

访问隐藏域的方法

  • 就是使用父类的引用类型,那么就可以访问到隐藏域,就像我们例子中的代码
  • 就是使用类型转换System.out.println(((Super)c1).s);

翻译自http://www.programcreek.com/simple-java/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.03.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 快速入门,学习笔记(一)
使用 +,比如 String s = "Hello " + “World!”。 使用 String 类的 concat() 方法。
耕耘实录
2021/02/04
3350
《Java程序设计基础》 第8章手记Part 1
本章主要内容 Part 1 - 子类的创建 - 在子类中访问父类的成员 - 覆盖父类的方法 - …… 本章主要讲继承、抽象类和接口,这篇博客讲的是继承这一部分。使用实验的代码做例子来说明。 类的继承 类的继承是面向对象的程序设计的一个重要特点,通过继承实现代码的复用,被继承的类称为父类或超类(superclass),由继承得到的类称为子类(subclass) 子类继承父类的成员变量和方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量和方法。 Ps:C
Steve Wang
2018/02/05
7530
Java 继承、多态与类的复用
摘要:   本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍。首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同。紧接着,我们根据继承引入了多态,介绍了它的实现机制和具体应用。此外,为了更好地理解继承和多态,我们对final关键字进行了全面的介绍。在此基础上,我们介绍了Java中类的加载及初始化顺序。最后,我们对面向对象设计中三个十分重要的概念–重载、覆盖与隐藏进行了详细的说明。
全栈程序员站长
2022/09/08
8230
Java基础-Day03
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
软件小生活
2021/08/16
2560
Java基础(八):封装、继承、多态性
概述:私有化类的成员变量,提供公共的get和set方法,对外暴露获取和修改属性的功能
冬天vs不冷
2025/01/21
1390
Java基础(八):封装、继承、多态性
万字长文详细总结!关于继承、重写与重载、封装、接口的硬核干货
Java语言在面向对象方面的知识点复杂繁琐,但是几乎是每个小伙伴学习编程必须踩的坑,其实,面向对象的底层都是一些计算机底层知识的结合,所以,不注重基础的程序猿,一定不是一个可以走的远的程序猿。那么,今天,我们先逐一地深入了解继承、重载、接口和构造器的知识。
CodeVald
2021/02/01
1K0
Java基础小结(二)
继承可以使用 extends 和 implements 这两个关键字来实现继承, 而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
WindCoder
2018/09/19
6920
Java Review (十、面向对象----继承)
使用继承,人们可以基于已存在的类构造一个新类。继承已存在的类就是复用(继承)这些类的方法和域。在此基础上,还可以添加一些新的方法和域, 以满足新的需求。这是 Java 程序设计中的一项核心技术。
三分恶
2020/07/16
5150
JAVA基础(38) java四大特性理解(封装、继承、多态、抽象)
JAVA基础(38) java四大特性理解(封装、继承、多态、抽象)
Java架构师必看
2021/06/16
2.4K0
【趣学程序】java面向对象三大特征
封装:通常将类中的成员变量私有化(private),通过对外提供方法(setXxx,getXxx),可对该变量(xxx)进行访问。 boolean 类型的变量没有getXX,只有 isXX;
趣学程序-shaofeer
2019/07/27
3940
Java程序设计(面向对象)- 三大支柱「建议收藏」
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 介绍:
全栈程序员站长
2022/08/04
2970
Java程序设计(面向对象)- 三大支柱「建议收藏」
Java抽象类与oop三大特征
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它 只有声明,而没有具体的实现 。抽象方法的声明格式为:
Java团长
2018/07/23
8160
Java抽象类与oop三大特征
Java桥方法
Java桥方法的出现是由于Java中泛型在虚拟机中会类型擦除,为了解决因擦除引起在多态时会引起问题而引入桥方法这个概念
doper
2022/09/26
3680
Java桥方法
[ Java学习基础 ] Java的继承与多态
看到自己写的东西(4.22的随笔[ Java学习基础 ] Java构造函数)第一次达到阅读100+的成就还是挺欣慰的,感谢大家的支持!希望以后能继续和大家共同学习,共同努力,一起进步!共勉! ------------------------------------ 一、Java继承       继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。       继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有
Kevin_Zhang
2018/05/22
1K0
JAVA17/JAVA21继承和抽象类
​ 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,这个类就是父类,那么多个子类无需再定义这些属性和行为,只要继承那一个类即可。如图所示:
张哥编程
2024/12/13
1490
JAVA17/JAVA21继承和抽象类
Java基础(十一):抽象类、接口、内部类
选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法
冬天vs不冷
2025/01/21
2670
Java基础(十一):抽象类、接口、内部类
1.8 封装、继承、多态
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
ha_lydms
2023/08/09
1980
1.8 封装、继承、多态
继承与隐藏:Java中父类成员变量的神秘禁忌
在Java中,子类继承了父类的成员变量,但不能直接覆盖(或称为隐藏)父类的成员变量。本文将解释为什么Java设计了这样的规则,探讨与此相关的继承和多态的概念,并说明如何在子类中访问和使用父类的成员变量。
灬沙师弟
2023/09/06
7520
继承与隐藏:Java中父类成员变量的神秘禁忌
Java语言中的面向对象特性总结
【课前思考】    1. 什么是对象?什么是类?什么是包?什么是接口?什么是内部类?    2. 面向对象编程的特性有哪三个?它们各自又有哪些特性?    3. 你知道java语言在面向对象编程方面有何独特的特点吗? 
全栈程序员站长
2021/12/28
4590
你真的了解Override吗,属性能够被重写吗?
最近想到了一个问题,Java的属性能够被Override吗?首先让我们看一下下面这个继承的例子。
三哥
2018/12/17
6990
相关推荐
Java 快速入门,学习笔记(一)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验