java - 解释以下 Java 程序的输出

标签 java inheritance

package com.test;

public class Main {

    public static void main(String[] args) {

        System.out.println(new B().toString());
    }
}


package com.test;

class A {

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.getClass().getName();
    }
}

package com.test;

public class B extends A {

}

该程序给出输出 com.test.B 但如果我将 A 类的 toString 方法更改为

@Override
public String toString() {
    return "hello";
}

然后它打印你好。为什么?

最佳答案

在第一次函数调用时,方法是:

@Override
public String toString() {
        // TODO Auto-generated method stub
        return this.getClass().getName();
}

由于此方法是从 B 类实例调用的,因此 this.getClass() 引用 B 类对象。因此 getName() 函数打印

com.test.B

如果通过创建A类对象来调用相同的函数,那么输出将是,

com.test.A

当您将 toString 函数更改为:

@Override
public String toString() {
    return "hello";
}

它将返回 hello,因为您已返回 hello 作为返回值。

现在,如果您确实想了解@Override,请将此代码添加到B类中,并在A类中让返回hello的函数存在

@Override
public String toString() {
     // TODO Auto-generated method stub
     return this.getClass().getName();
}

尝试上面的代码,并从类 A 和类 B 实例对象调用 toString 函数。那么就会更清楚@Override的作用以及它是如何工作的

关于java - 解释以下 Java 程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19923712/

相关文章:

c++ - findcontours 断言失败

java - 搜索数组中的最高值,即使是平局

java - 如何将 ObjectGraphMeasurer.measure(object) 的结果转换为字节?

java - 是否可以移动 JMenuBar 而无需将其添加到 JPanel 中

java - 大括号下的语句是否首先加载?

python - 如何使用具有多重继承的数据类特殊方法?

Java Android :Add array 15times in one second How?

Java 返回值(在 try/catch 子句中)

java - 在不移动迭代器的情况下从链表返回值

c++ - 无法在赋值运算符中访问基类的 protected 方法