java - 在Java中具有继承的同一对象中具有相同标识的两个不同变量
问题描述
我正在尝试学习 Java 中的继承,并被这个例子弄糊涂了,因为在对象的同一个实例中似乎存在两个不同的 speedlimit 变量。一个来自超类,一个来自子类。仍然只有一个对象,一个 Honda3 对象(由自行车引用引用)。这是什么原因?有两个不同的实例变量吗?
class Bike
{
int speedlimit=92;
public void showSpeedLimit()
{ System.out.println("From Bike: SL= "+ this.speedlimit); }
public void SetSpeedLimit(int limit)
{ this.speedlimit=limit;}
}
class Honda3 extends Bike
{
int speedlimit=150;
public void showSpeedLimit()
{ System.out.println("From Honda3: SL= "+ this.speedlimit); }
public void SetSpeedLimit(int limit)
{ this.speedlimit=limit; }
}
public class main2
{
public static void main(String args[])
{
Bike obj;//reference to Bike object
obj=new Honda3();// Honda3 object created and assigned to the reference variable named obj
System.out.println(obj.speedlimit);//90 Data member not overridden
obj.showSpeedLimit();//150 showing Honda3;
obj.speedlimit+=3;//95 Bike
System.out.println(obj.speedlimit);//95
obj.showSpeedLimit();//still 150
obj.SetSpeedLimit(155);// setting Honda3 object speedlimit to 155
System.out.println(obj.speedlimit);// still 95
obj.showSpeedLimit();//155
}
}
输出:
92 来自 Honda3:SL= 150、95,来自 Honda3:SL= 150、95,来自 Honda3:SL= 155**
解决方案
- Java 不会覆盖变量。这就是每当您尝试打印 obj.speedlimit 时它会打印 parent 的值的原因,因为它是 Bike 的引用。
- 当您调用该
showSpeedlimit
方法时,它会按预期工作,因为该方法已被覆盖。
推荐阅读
- python - 评估得到错误输出的后缀表达式
- javascript - 停止音频而不是暂停
- python - 二分搜索猜谜游戏
- batch-file - 获取和操作 bat 文件中的 ffmpeg 音量检测输出
- c# - Unity - 异步/等待太慢
- mysql - 在不关闭防火墙的情况下修复 ECONNREFUSED?
- serilog - 无法使用 Serilog 将最小日志记录级别设置为 HttpClients 的警告
- arrays - 打字稿:从联合类型获取合并/组合类型
- c# - 如何在初始化时向 GameObjects 添加组件?
- c# - C# 9 记录有来自 ToString() 的 {propertyName=value} 输出,如何从中获取,返回记录类型?