为什么我不能用这个程序重新分配父变量?

问题描述:

package accesslevelmodifiers; 

public class AccessLevelModifiers { 

    public static void main(String[] args) { 

    Parent parent =new Parent(); 
    Subclass subclass = new Subclass(); 
    parent.go(); 
    subclass.go(); 

    System.out.println("==========="); 

    subclass.setNumberPu(3); 
    parent.go(); 
    subclass.go(); 
    } 
} 


public class Parent { 

    public int NumberPu=100; 

    public void go(){ 
     System.out.println(NumberPu); 
    } 
} 

class Subclass extends Parent{ 

    public void setNumberPu(int NumberPu) { 
     super.NumberPu = NumberPu; 
    } 


} 

它成功地建立并运行;但结果是为什么我不能用这个程序重新分配父变量?

100 
100 
=========== 
100 
3 

我很困惑的两件事情。 1.为什么我可以在子类中使用super.NumberPu?我的意思是如果我写

class Subclass extends Parent{ 
     super.NumberPu = 3; 
} 

IDE会说找不到符号。

  1. 我使用超级,所以我认为NumberPu在父级的值将被分配为3,但相反,它是分配的子类中的一个。谁能告诉我发生了什么事?超级怎么样。成了这个。 ? 非常感谢!
+1

你认为你在这里有多少物体? –

+0

我有两个实例父和子类在这里,我有父对象NumberPu(int类型)和子类中NumberPu(int类型)两个对象。我对么? – Oscar

+0

你不是。这个'new Parent()'创建一个类型为'Parent'的对象。这个“新的Subclass()”创建一个类型为“Subclass”的对象。这两个对象都可以访问自己的'NumberPu'字段。 –

你有两个不同的对象这里,所以当你改变其中之一的数量,另外一个不会改变,因为他们是无关

Parent parent =new Parent(); 
Subclass subclass = new Subclass(); 

看看您在这里如何使用newnew运算符通过为新对象分配内存并返回对该内存的引用来实例化一个类。所以你有两个不同的记忆,完全不相关。

+0

谢谢你的回答!我明白你的意思了! – Oscar

+0

@Oscar没问题!请记住,如果我的答案回答了您的问题,请[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)作为解答的答案,所以其他人你的问题知道答案:)。 –

  1. 您可以在类级别放置声明(例如为您的子类添加新变量),但不能声明。在这里你没有声明一个新的变量,你为现有的变量赋值,所以它应该在构造函数中完成,没关系。
  2. 你混淆了类和实例。您的父类和您的子类对象是两个不同的实例,修改一个不会影响另一个实例,它们是具有不同成员字段实例的两个不同对象。 super是一种在不明确的情况下引用超类中的字段的方法,this是引用当前实例,因此它们处于两个不同的级别。
+0

谢谢你的回答!我明白应该在构造函数中完成赋值给现有值的意义。但是我仍然不明白super.NumberPu指的是什么?我应该把它改成this.NumberPu来得到上面的结果。 – Oscar

+0

在你的情况下,super.NumberPu和this.NumberPu引用同样的事物:在当前实例中,在SubClass的超类中定义的NumberPu字段。 –

+0

所以我可以说在对象的子类中,只有一个名为NumberPu的字段。 NumberPu由两个类共享:Parent,声明它的那个。和子类,谁从父母继承它?因此,当我重新分配NumberPu的价值时,我是否使用它并不重要。或超级。因为他们都指的是唯一的一个? – Oscar