【问题标题】:Why can't I re-assign the parent's variable with this program?为什么我不能用这个程序重新分配父变量?
【发布时间】:2015-09-29 10:03:11
【问题描述】:
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. 我使用了 super,所以我认为父类中 NumberPu 的值将被分配为 3,但实际上分配的是子类中的值。谁能告诉我发生了什么?怎么会超。变成了这个。 ? 非常感谢!

【问题讨论】:

  • 你认为你这里有多少对象,是什么类型的?
  • 我这里有两个实例父类和子类,我有两个对象 NumberPu(int type) 在父类和 NumberPu(int type) 在子类。我说的对吗?
  • 你不是。这个new Parent() 创建了一个Parent 类型的对象。这个new Subclass() 创建了一个Subclass 类型的对象。这两个对象都可以访问自己的 NumberPu 字段。
  • 谢谢你的解释!!所以我这里有两个对象(父类和子类),它们分别属于父类和子类类型。 Object parent 是 Parent 类的实例,而 Object 子类是 Subclass 类的实例。我想这听起来更好??

标签: java inheritance this variable-assignment super


【解决方案1】:

这里有两个不同的对象,所以当你改变其中一个的数量时,另一个不会改变,因为它们不相关。 p>

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

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

【讨论】:

  • 感谢您的回答!我明白你的意思了!
  • @Oscar 没问题!请记住,如果我的回答回答了您的问题,请accept我的回答作为解决方案,以便其他有您问题的人知道答案:)。
【解决方案2】:
  1. 您可以将声明放在类级别(例如,将新变量添加到您的子类),但不能放在语句中。这里不是声明一个新变量,而是为现有变量赋值,所以应该在构造函数中完成,这很好。
  2. 您混淆了类和实例。您的父对象和子类对象是两个不同的实例,修改一个不会影响另一个,它们是具有不同成员字段实例的两个不同对象。 super 是一种在出现歧义时引用超类字段的方法,this 是引用当前实例,因此它们处于两个不同的级别。

【讨论】:

  • 感谢您的回答!我理解为现有值赋值的含义应该在构造函数中完成。但是我还是不明白 super.NumberPu 指的是什么?我应该把它改成 this.NumberPu 来得到上面的结果。
  • 在你的例子中,super.NumberPu 和 this.NumberPu 指的是同一个东西:字段 NumberPu,定义在 SubClass 的超类中,用于当前实例。
  • 所以我可以说在对象子类中,只有一个字段叫NumberPu。 NumberPu 由两个类共享:Parent,声明它的那个。而子类,从父类继承它的那个?所以当我重新分配 NumberPu 的值时,我是否使用它并不重要。或超级。因为它们都指的是唯一的?
猜你喜欢
  • 1970-01-01
  • 2016-04-06
  • 2021-12-10
  • 2017-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多