我很困惑,因为我认为这是指调用该方法的当前对象。
那么,为什么在调用继承的方法时,我的对象中的实例变量x没有被更改? 超类:

public class SuperBoss 
{
  int x = 50;

  public void changeX()
  {
   this.x  = 20;
  }
}

子类:

public class Boss extends SuperBoss
{
 int x = 10;
 public static void main(String[] args)
 {
  Boss b = new Boss();
  b.changeX();
  System.out.println(b.x); //prints 10
 }
}

为什么打印10张而不打印20张?

===============>>#1 票数:5 已采纳

简短答案:因为在Java中字段访问不是虚拟的。


SuperBoss声明x。

当Boss声明x时,x不会成为“虚拟”字段-它成为一个超类字段中隐藏的新字段。

当您在Boss上调用changeX时(这是SuperBoss中的一种方法),SuperBoss并不了解Boss.x,并且访问x不是虚拟的,因此只能访问SuperBoss.x。

如果需要访问x是虚拟的,则需要提供一个getX方法,并在Boss中覆盖getX方法。 现在,当SuperBoss的方法调用getX时,它将被重新路由到Boss中的getX。

===============>>#2 票数:1

当在子类中声明int x = 10 ,您将在所有人查看子类时向所有人隐藏超类变量。

当超类调用this.x它不会查看子类,因此可以获取其自己的变量版本。

变量实际上不是在运行时通过它们的代码名称存储的,因此无法像这样重新定义SuperBoss#x将解析为符号表中的一个符号,而Boss#x将解析为另一个符号,因此它们仍然存在,如果您知道如何使用它们。

  ask by Kacy Raye translate from so

未解决问题?本站智能推荐:

3回复

Java:如何修改子类的实例变量

故事是这样的: 我有一个称为算法的抽象类,还有许多扩展它的类。 其中一些具有要调整的参数。 有些没有,有些则最多为5。 我想在算法中有一种方法可以调整任意参数。 例如: 这样我就可以在“类SoftRankBoots扩展算法”中这样称呼它: 请注意,SoftRan
2回复

继承和私有实例变量

我无法弄清楚如何访问超类的私有实例变量。 我正在Dog类中编写一个equals方法来比较,看看名称和品种是否相同,但name是Pet内部的私有实例变量(Dog继承)。 这是我的代码: 和我的狗课: 在我的主要课程中: 由于某种原因,它继续使用我的Pet类的相同方法
1回复

用继承隐藏实例变量

在下面的代码中,子类“ B”中名为“ x”的实例变量隐藏了父超类“ A”中也称为“ x”的实例变量。 在下面的代码中,为什么println(zx)显示零值? 谢谢。
5回复

java中的实例变量创建

如果我有以下情况: 哪个先创建,苹果还是香蕉? 我想说苹果首先被创造,但我不确定。
2回复

使用Java继承实例变量

我知道如果你子类化一个类(超类),例如一个实例变量,它将继承在子类中。 即: 结论:我想知道为什么实例变量“湿度”在子类和类之间共享。 我知道如果我影响了它,它将不会被共享,但仍然为什么另一个实例(即使是超类)应该与继承逻辑中的子类共享一个变量。 提前致谢。
5回复

Java:继承,实例变量和this

我知道this是对当前正在执行的对象的引用。 如果是这样,您可以解释以下代码的行为吗? classAMethod的第一行报告this是对ClassB的引用。 但是,在下一行中,我将使用this来访问ClassA的私有实例变量privateInstanceVar ,我不应该对其进行访问
1回复

将一个类的实例变量设置为另一类的实例变量,然后

有没有一种方法可以将一个类的实例变量设置为另一类的实例变量,并且当第二个类的实例变量更改时,第一个类的实例变量也随之更改,然后再使对象脱离这两个类? 这是我的狗班: 这是我的猫课: 如您所见,我必须将它们都做成对象才能将dog.size设置为cat.size。 有没有一种方法
3回复

派生类中的实例变量与超类的私有实例变量具有相同的名称吗?

在派生类中是否可以有一个与超类中的私有实例变量同名的实例变量? 换句话说,我可以覆盖私有实例变量或私有方法吗?
9回复

覆盖超类的实例变量

为什么我们不能覆盖子类中超类的实例变量?
6回复

为什么建议将实例变量声明为私有?

我的问题与Java有关,但它也可以应用于C#。 我想知道为什么每个人都建议将实例变量设为私有而不是让它们受到保护 。 让我们考虑一下。 子类看不到私有变量,所以如果我需要访问或更改子类getMyPrivateVariable类的变量,我被迫使用一些访问器和mutators方法,如get