Java子类访问父类私有变量的思考
示例如下:
父类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子类访问父类私有变量的思考相关推荐
- java子类访问父类私有成员_Java中子类可以继承父类的私有成员,但是不能(直接)访问!!!...
今天学习Java三大特征之一:继承的时候,产生了一些疑问,最后通过网上查找和各位网友的帮助,终于拔开云雾见日出.下面进入正题: 首先:子类对象拥有父类中的所有属性和方法:在这里,很多人会问构造器可以继 ...
- C++:从子类访问父类的私有函数
C++:从子类访问父类的私有函数 转自 龙音阁http://blog.sina.com.cn/dragonsound 感谢原作者的工作 (2009-09-01 22:44:21) 标签: 虚函数 c ...
- C++ 从子类访问父类的私有函数(看的我发愣)
众所周知,c和c++的数组都是不安全的,因为无论c还是c++都不提供数组边界检查功能,这使得数组溢出成为可能. 从某个意义上说,c和c++是一种缺少监督的语言,然而这也正是其魅力所在.c++给予程序员 ...
- 继承能够访问父类私有字段_在单元测试中访问私有字段
继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...
- Java子类和父类的初始化执行顺序
有个朋友在CSDN评论区问我,java子类和父类初始化时各个代码块的执行顺序,我本来写好了一大段回复,点击发表回复,结果没有回复成功,我写的评论也不见了...csdn的评论区编辑体验本来就不好,然后还 ...
- Java线程:线程私有变量
Java线程:线程私有变量 线程对象也是从一个(线程)类而构建的,线程类作为一个类也可以拥有自己的私有成员.这个成员为此线程对象私有,有时候使用线程私有变量,会巧妙避免一些并发安全的问题,提高程序的灵 ...
- java子类和父类有相同成员_Java -- 父类和子类拥有同名的成员变量的情况
Java – 父类和子类拥有同名的成员变量取值情况 参考文章 结论: 当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量.若对该成员变量进行操作的方法 ...
- java 子类继承父类_关于Java 的继承问题,子类会继承父类的哪些东西?-----转载...
和C++类似,可以继承基类的公共属性和方法. 在Java继承里,父类的属性还有方法在声明时,如果是public关键字即公共属性,则在子类继承时,这些属性和方法都会被子类继承.受保护的也可以继承 但是私 ...
- Java子类与父类之间的对象转换
在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...
最新文章
- 深度学习浪潮下的自然语言处理,百度NeurIPS 2019展现领域新突破
- 设计模式三—抽象工厂模式
- R语言数据挖掘实践——系谱聚类
- 真·抬头发票!| 今日最佳
- Nacos 集群集成SpringBoot2.x 微服务_02
- 【Linux】linux服务器下包管理器
- Oracle RAC CRS-0184 --Cannot communicate with the CRS daemon
- idm下载百度网盘有限制 提示403错误 下载显示没有权限404,最新的解决办法教程
- Hyper-V 3.0 - 关于存储迁移的一些说明
- 苹果手机软件升级密码_给iOS应用设置一个密码锁
- php有个schost.exe_svchost.exe是什么
- LODOP直接用base64码输出图片
- java-IO-字节数组输入输出流(ByteArrayInputStream、ByteArrayOutputStream)
- 【Stochastic Depth】《Deep Networks with Stochastic Depth》
- 最近很火的ChatGPT和GPT4
- python 爬取海量网易云评论并写入数据库
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
- 统计学基础——常用的概率分布(二项分布、泊松分布、指数分布、正态分布)
- android调用系统发送短信
- Spark:java.net.URISyntaxException: Relative path in absolute URI: file:D:/XXX/SparkFaultBench/spark-
热门文章
- 三四十岁的大龄程序员,如何保持自己的职场核心竞争力?
- 如何打造元宇宙NFT头像?教你玩点新鲜的!
- 跟涛哥一起学嵌入式 16:设计一款CPU芯片到底有多难?
- org.eclipse.jgit.errors.LockFailedException: Cannot lock D:\xxx\.git\index
- 我愿意去纳格兰的天空中翱翔 ----写给自己的亡灵盗贼(一)
- Oracle EBS R12 GL总帐模块 查询日记帐明细SQL
- 计算机软件技术基础图片,计算机软件技术基础.ppt
- 微信小程序自动化测试框架 Minium——快速开始
- Unity3D-VR《静夜诗》4-窗户门动画的播放
- atoi和strtol的区别和使用