为什么super在下面的Java示例中引用当前对象

为什么super在下面的Java示例中引用当前对象,java,inheritance,superclass,super,Java,Inheritance,Superclass,Super,在输出中,“父颜色”打印的是“黑色”,这让我很困惑。它应该是白色的,因为我只改变了子对象的颜色?谁能给我解释一下原因。color只在super classAnimal中声明过一次Dog本身没有名为color的插槽 因为狗是一个亚类,它继承了动物的槽。只有一个对象,它只有一个成员。通过this引用它(正如您所暗示的那样,printColor,color和this.color是同一件事)或通过super引用它的唯一区别是您必须引用它的类型以及关于如何使用该类型信息的一些细节。你还是指同一个对象。该对

在输出中,“父颜色”打印的是“黑色”,这让我很困惑。它应该是白色的,因为我只改变了子对象的颜色?谁能给我解释一下原因。

color
只在super class
Animal
中声明过一次
Dog
本身没有名为
color
的插槽


因为狗是一个亚类,它继承了动物的槽。

只有一个对象,它只有一个成员。通过
this
引用它(正如您所暗示的那样,
printColor
color
this.color
是同一件事)或通过
super
引用它的唯一区别是您必须引用它的类型以及关于如何使用该类型信息的一些细节。你还是指同一个对象。该对象中只有一个
color
成员。由于只有一个,您可以通过
this
super
访问它,因此无论哪种方式都会得到相同的结果

它应该是“白色”的权利,因为我已经改变了颜色的孩子 仅对象

您没有2个对象,只有1个

color
在子类中继承。
调用
super.color
color
与使用单个
color
字段相同。

color
字段添加到
Dog
类中,它将产生不同的结果:

class Animal {
    String color = "white";
}

class Dog extends Animal {
    void printColor() {
        System.out.println("This Color: " + color); //prints color of Dog class  
        System.out.println("Parent Color: " + super.color); //prints color of Animal class  
    }
}

class TestSuper1 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.color = "black";
        d.printColor();
    }
}
现在,您将在编写时获得两个不同的输出:

class Dog extends Animal {
   ...
    String color = "white";
    void printColor() {
        System.out.println("This Color: " + color);// prints color of Dog class
        System.out.println("Parent Color: " + super.color);// prints color of Animal class
     }
}

由于第一个输出指的是
Dog
字段,第二个输出指的是
Animal
字段。

由于字段
color
仅在父类
Animal
中定义,那么子类
Dog
的对象将其值设置为“black”并且子类没有名称颜色字段,这就是为什么它的值在这两种情况下都会打印“黑色”。但是如果我们定义一个字段
String color=“brown”
Dog
类中,然后输出将被打印:黑色用于
Dog
类,白色用于
Animal
类。

前面的答案已经解释了代码中发生的情况

那么
super.xxx
有什么用呢?它的意思是(或多或少):接受当前的
this
对象,但使用超类的方法和字段声明

super
主要用于方法重写父方法继承的方法,但您不想有全新的行为,只需将功能添加到父方法的实现中即可

Dog d = new Dog();
d.color = "black"; // modify the color field of Dog not which one of Animal
d.printColor();
这会打印出来

class Animal {
    String color = "white";
    void printColor() {
        System.out.println("Animal color: " + color); 
    }
}

class Dog extends Animal {
    void printColor() {
        // Animal class prints the color
        // Dog class remarks that it's a dog
        System.out.println("I am a Dog!");  
        super.printColor(); 
    }
}

class TestSuper1 {
    public static void main(String args[]) {
        // declaring d as Dog or Animal doesn't matter
        Animal d = new Dog(); 
        d.color = "black";
        d.printColor();
    }
}

在寻求帮助时,请花时间一致且易读地缩进代码。(在不寻求帮助时,这也是一个好主意。)我已经在上面为您重新设置了格式。谢谢!超级类对象是在创建子类对象时首先创建的,对吗?在这里,我如何创建这个超类对象并打印该超类对象的“color”值?@Rajeesh:否。再次声明:只有一个对象,它具有由超类和子类定义的所有特性。没有单独的对象。这是基于类的继承,而不是原型继承(如Self和JavaScript等其他一些语言所使用的)。我认为在问题中不存在字段重写时引入字段重写并没有多大用处。它所做的只是进一步混淆了一个已经认为存在独立对象的人。@T.J.克劳德,我明白了。我在子类中引入了一个新的字段声明(实例字段不被覆盖),以显示OP如何获得他/她期望的结果。在解释创建/使用单个对象和单个
颜色
字段时。我的印象是只解释第二条遗漏了什么…(顺便说一句,我上面的评论并没有回答你的第一条评论;只是巧合。)@davidxxx:是的,这正是让我困惑的地方。在子类中添加“color”字段后,我可以调用super,并且可以访问super类对象的color字段。实际上,在创建子类对象时,不会隐式创建超级类对象?“实际上,在创建子类对象时,不会隐式创建超级类对象?”是。明白了。我的问题是,如果子类没有自己的颜色属性,为什么super.color不打印“白色”?
I am a Dog!
Animal color: black