Object.toString()如何适用于不同的底层类型?

Gio*_*Far 5 java object tostring object-to-string

我不明白为什么这在java中有效:

如果我在对象中有一个Integer对象,例如:

Object myIntObj = new Integer(5);
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

System.out.println(myIntObj);
Run Code Online (Sandbox Code Playgroud)

输出是: 5

我现在认为Integer类有一个toString方法的ovveride,但在这种情况下是不同的(我认为).对于多态性,如果我在"父变量"中有一个"子对象",则该对象不会更改其实际类型(在本例中为Integer)但是......它(在Object变量中)只能使用方法对象类,为什么我写:

System.out.println(myIntObj);
Run Code Online (Sandbox Code Playgroud)

我可以直接看到数字5而不是这个对象的引用?因为对象类中的toString方法默认只返回对象引用的字符串.

喜欢:

Object currentPlayer = new Player();
System.out.println(currentPlayer);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出是Player objecet的引用,因为在对象类中称为toString方法.

那么为什么在之前的例子中我没有看到引用而是直接看到数字呢?通过逻辑,多态的规则说:如果你在"父"变量中有一个"子"对象,那么这个对象在里面,remanis相同,但是他被用作对象的一个​​对象,所以他可以只使用class对象只是对象的方法,所以真的很奇怪,我没有看到引用而是直接的数字.

我希望你明白我的意思.

Bra*_*don 4

您解释推理的最后一段有点不正确。

那么为什么在之前的例子中我没有看到参考文献而是直接看到了数字?从逻辑上讲,多态性的规则是这样的:如果你在“父亲”变量中有一个“子”对象,那么这个对象在内部,reman是相同的,但他被用作对象的一个​​实例,所以他可以只 使用类对象,所以只是对象的方法,所以很奇怪,我没有看到引用,而是直接看到数字。

开头是正确的,但我加粗的部分是你从中得出的错误结论。

您是正确的,通过多态性,对象确实保留了它的任何类型,但是引用类型(变量的类型)定义了您可以用它做什么。然而,引用类型并没有描述对象的作用

这就是多态性背后的意图。它是一种抽象,用于定义可以做什么与其工作方式分开。例如,如果您有以下示例:

public class Vehicle {
    public int getWheelCount() {
        return 1;
    }
}

public class Car extends Parent {
    public int getWheelCount() {
        return 4;
    }

    public void blowHorn() {
        System.out.println("Honk honk!");
    }
}

public class Bicycle extends Parent {
    public int getWheelCount() {
        return 2;
    }
}

Car car = new Car();
car.getWheelCount();  // 4
car.blowHorn();  //"Honk honk!"

Vehicle v = new Car();
v.getWheelCount()  // 4
v.blowHorn();  // COMPILE ERROR HERE!  Unknown method

Bicycle b = new Bicycle();
b.getWheelCount();  // 2

Vehicle v = new Bicycle();
v.getWheelCount();  // 2
Run Code Online (Sandbox Code Playgroud)

您可以从中得出结论,当重写子类中的方法时,始终会调用子版本。无论您将其称为车辆还是汽车,汽车始终是汽车。但是,通过将其称为车辆,您只能调用在所有车辆上定义的方法。

为了将其与示例联系起来,所有Vehicle对象都有车轮大小,因此 getWheelCount() 始终可调用,无论是 Vehicle.getWheelCount() 还是 Car.getWheelCount()。然而,Car.getWheelCount() 是执行的,因为 Car 覆盖了它。

如果引用类型为Vehicle,则无法调用,blowHorn()因为该方法仅在 Car 上可用。

回到你的例子,整数就是整数。

Object i = new Integer(5);
i.toString();  // 5
Run Code Online (Sandbox Code Playgroud)

这会打印 5,因为 i 是整数。Integer 类重写了 toString。引用类型(您引用对象的类型)仅决定您可以调用哪些方法,但不决定调用该方法的哪个父/子类版本。