示例如下:
父类User,包含私有变量name和money;
以及两个构造函数和基本的getter方法。

public class User {public User() {}public User(String name, int money) {this.name = name;this.money = money;}public String getName() {return name;}public int getMoney() {return money;}
}

子类Manager继承User

public class Manager extends User {public Manager() {}public Manager(String name, int money) {super(name, money);}private String name;private int money;public void show(){System.out.println("我是"+this.name+",我有"+this.money+"元钱");System.out.println("我是"+this.getName()+",我有"+this.getMoney()+"元钱");System.out.println("我是"+super.getName()+",我有"+super.getMoney()+"元钱");}
}

主类ClassDemo新建一个Manager对象,并调用其show()函数。

public class ClassDemo {public static void main(String[] args) {Manager m=new Manager("q",1);m.show();}
}

结果如下

我是null,我有0元钱---1
我是q,我有1元钱------2
我是q,我有1元钱------3

其中结果1容易理解,本类中的两个变量没有初始化,返回的是默认值。

结果2一开始感觉很困惑,子类继承了父类的getName()和getMoney(),可并没有继承私有变量name和money,这里返回的值是谁的呢?

之后了解了一下这一部分的内存原理,原来新建子类时,会先在堆中新建一个父类,父类的变量和方法,以及子类独有的变量和方法,二者共同组成了子类空间。
所以,新建子类后,父类中的private变量虽然不能被子类继承,但却是真实存在的,只是不可被直接访问,只能间接使用。
结果2中,Manager对象其实在创建时就已经在构造函数中通过super(name,money)给name和mongey这两个父类私有变量赋值了。而在使用this.getName()方法时,该方法是从父类继承,所以方法内使用的变量也是父类的这两个私有变量,所以在结果2中返回的是自定义的两个值。
结果3中,super()直接通过父类调用getter方法,返回值当然也是两个父类私有变量。
不过,如果在子类Manager中重写getter方法,结果2就发生了改变。

public class Manager extends User {public Manager() {}public Manager(String name, int money) {super(name, money);}/*****************************新增重写方法***************************/   @Overridepublic String getName() {return name;}@Overridepublic int getMoney() {return money;}/*****************************************************************/private String name;private int money;public void show(){System.out.println("我是"+this.name+",我有"+this.money+"元钱");System.out.println("我是"+this.getName()+",我有"+this.getMoney()+"元钱");System.out.println("我是"+super.getName()+",我有"+super.getMoney()+"元钱");}
}
我是null,我有0元钱---1
我是null,我有0元钱---2
我是q,我有1元钱------3

因为现在本类Manager中已经有了getter()方法,所以方法内直接调用本类的两个name,money变量,因此结果2返回的是两个初始值。

参考

Java中子类能不能继承父类的私有变量和方法?
JAVA中的父类私有成员变量的继承问题

Java子类访问父类私有变量的思考相关推荐

  1. java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...

    今天学习Java三大特征之一:继承的时候,产生了一些疑问,最后通过网上查找和各位网友的帮助,终于拔开云雾见日出.下面进入正题: 首先:子类对象拥有父类中的所有属性和方法:在这里,很多人会问构造器可以继 ...

  2. C++:从子类访问父类的私有函数

    C++:从子类访问父类的私有函数 转自 龙音阁http://blog.sina.com.cn/dragonsound 感谢原作者的工作 (2009-09-01 22:44:21) 标签: 虚函数 c ...

  3. C++ 从子类访问父类的私有函数(看的我发愣)

    众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能. 从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员 ...

  4. 继承能够访问父类私有字段_在单元测试中访问私有字段

    继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...

  5. Java子类和父类的初始化执行顺序

    有个朋友在CSDN评论区问我,java子类和父类初始化时各个代码块的执行顺序,我本来写好了一大段回复,点击发表回复,结果没有回复成功,我写的评论也不见了...csdn的评论区编辑体验本来就不好,然后还 ...

  6. Java线程:线程私有变量

    Java线程:线程私有变量 线程对象也是从一个(线程)类而构建的,线程类作为一个类也可以拥有自己的私有成员.这个成员为此线程对象私有,有时候使用线程私有变量,会巧妙避免一些并发安全的问题,提高程序的灵 ...

  7. java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况

    Java – 父类和子类拥有同名的成员变量取值情况 参考文章 结论: 当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量.若对该成员变量进行操作的方法 ...

  8. java 子类继承父类_关于Java 的继承问题,子类会继承父类的哪些东西?-----转载...

    和C++类似,可以继承基类的公共属性和方法. 在Java继承里,父类的属性还有方法在声明时,如果是public关键字即公共属性,则在子类继承时,这些属性和方法都会被子类继承.受保护的也可以继承 但是私 ...

  9. Java子类与父类之间的对象转换

    在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...

最新文章

  1. 深度学习浪潮下的自然语言处理,百度NeurIPS 2019展现领域新突破
  2. 设计模式三—抽象工厂模式
  3. R语言数据挖掘实践——系谱聚类
  4. 真·抬头发票!| 今日最佳
  5. Nacos 集群集成SpringBoot2.x 微服务_02
  6. 【Linux】linux服务器下包管理器
  7. Oracle RAC CRS-0184 --Cannot communicate with the CRS daemon
  8. idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
  9. Hyper-V 3.0 - 关于存储迁移的一些说明
  10. 苹果手机软件升级密码_给iOS应用设置一个密码锁
  11. php有个schost.exe_svchost.exe是什么
  12. LODOP直接用base64码输出图片
  13. java-IO-字节数组输入输出流(ByteArrayInputStream、ByteArrayOutputStream)
  14. 【Stochastic Depth】《Deep Networks with Stochastic Depth》
  15. 最近很火的ChatGPT和GPT4
  16. python 爬取海量网易云评论并写入数据库
  17. Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
  18. 统计学基础——常用的概率分布(二项分布、泊松分布、指数分布、正态分布)
  19. android调用系统发送短信
  20. Spark:java.net.URISyntaxException: Relative path in absolute URI: file:D:/XXX/SparkFaultBench/spark-

热门文章

  1. 三四十岁的大龄程序员,如何保持自己的职场核心竞争力?
  2. 如何打造元宇宙NFT头像?教你玩点新鲜的!
  3. 跟涛哥一起学嵌入式 16:设计一款CPU芯片到底有多难?
  4. org.eclipse.jgit.errors.LockFailedException: Cannot lock D:\xxx\.git\index
  5. 我愿意去纳格兰的天空中翱翔 ----写给自己的亡灵盗贼(一)
  6. Oracle EBS R12 GL总帐模块 查询日记帐明细SQL
  7. 计算机软件技术基础图片,计算机软件技术基础.ppt
  8. 微信小程序自动化测试框架 Minium——快速开始
  9. Unity3D-VR《静夜诗》4-窗户门动画的播放
  10. atoi和strtol的区别和使用