0

In which of the following case i get output "Hello World" ?

class A{

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

}

public class B extends A{

public void print(){
        //replace code that displays "Hello World"
    }

    public static void main(String args[]){
        new B().print();
    }

}

一、System.out.println(new A());

二、System.out.println(new B());

III.System.out.println(this);

1. only I
2. I and III
3. I and II
4. all I,II and III

它的answer is 4all I,II and III

i understood about I but why II and III is also right ?

EDIT : Also specify which section of jls provides this specification ?

4

3 回答 3

2

B 类是 A 类的扩展,因此 B继承了 A 拥有的所有方法(即 B 的 toString() 也将返回“Hello World”)。这就是为什么当您在 B 类对象(即 this 和 new B())上调用 print() 时,它会说“Hello World”。

如果您希望它返回不同的字符串,则必须再次重新定义/覆盖 B 类中的 toString() 函数。

于 2013-08-16T14:29:01.457 回答
1

如果你在类中引用一个方法,它会在同一个类中搜索,如果在超类中找不到搜索,依此类推,直到你到达Object该类。

每当你这样做System.out.println(object)时,它总是toString()会调用对象的方法。如果您不实现它,toString()则会调用超类。

  • 因为System.out.println(new B());toString()的超类A被称为B不是覆盖它。

  • 对于System.out.println(this);; asthis指的是 class 的对象B,再次调用toString()超类A的 asB并没有覆盖它。

于 2013-08-16T14:30:04.147 回答
0
  • System.out.println(new A());

    创建了 A 的新对象,并且默认情况下直接打印对象时将调用 toString() 方法。

  • System.out.println(new B());

    为 B 创建了新对象。现在您将一个对象作为参数传递给 println()。所以默认情况下再次调用 toString()。但是由于您尚未在 B 类中定义 toString(),因此将调用 A 类的 toString()

  • System.out.println(this);

    这与第二种情况相同。

ps 为了更好地理解,将 B 类中的 print() 方法更改为 toString()。然后你就可以看出区别了。

于 2013-08-16T14:56:39.640 回答