【问题标题】:Java override doubtJava 覆盖疑问
【发布时间】:2011-04-05 02:06:27
【问题描述】:

在下面的程序中,main方法中有一个实现接口的匿名类 TestInt 被实例化并打印。

在打印任何对象时,都会调用其类的 toString 方法。但是类 Foo 也扩展了 Object ,它有一个公共的 String toString() 方法,testInt 接口也是如此。那么我们在 main 中覆盖了哪个函数?一个来自 Object 还是一个来自 TestInt ?

interface TestInt{ String toString(); }
public class Foo {
    public static void main(String[] args) {
        System.out.println(new TestInt() {
            public String toString() { return "foo"; }
        });
    }
}

上面的程序编译运行良好,并生成“foo”作为输出。

【问题讨论】:

  • 嗯,你不是要在这里实例化一个接口吗?这段代码真的有效吗?
  • @Richard 它正在实例化一个实现 TestInt 的匿名内部类。
  • @Richard:我不是 Java 人,但我相信上面的代码是有效的:他正在实例化一个实现 TestIntanonymous 类。
  • @Isaac:它是一个内部类吗?
  • @user691451 是的。 new Foo(){} 是匿名内部类的语法。

标签: java


【解决方案1】:

您正在覆盖 Object#toString()实施TestInt#toString()。但这是一个非常挑剔的区别。由于这些方法具有相同的签名,因此它们在所有实际用途中都是相同的。

【讨论】:

    【解决方案2】:

    您正在实现TestInttoString() 方法并覆盖ObjecttoString 方法。 TestInt 接口规定任何实现它的类也必须实现 toString() 方法,您可能不必这样做,因为本质上是您已经实现的 Object 的子类。要记住的重要一点是继承是一个层次结构。如果您的父级实现了一个方法,并且您实现了一个具有相同签名的方法,那么您将覆盖您的父级。如果你的父母碰巧覆盖了它的父母等等,这并不重要。但是,您可以覆盖您的父母选择不覆盖的祖父母的方法。例如,

    public class Foo{
       public void myMethod(){
         System.out.println("Foo.myMethod");
       }
       public void anotherMethod(){
         System.out.println("Foo.anotherMethod");
       }
     }
    
    public class Bar extends Foo{
       public void myMethod(){
         System.out.println("Bar.myMethod");
       }
    }
    
    public class Bazz extends Bar{
       public void myMethod(){
         System.out.println("Bazz.myMethod");
       }
       public void anotherMethod(){
         System.out.println("Bazz.anotherMethod");
       }
    }
    

    在这种情况下,BarFoo 的子类并覆盖 Foo.myMethod 方法,但不会覆盖 Foo.anotherMethod 方法。 Bazz 又是 Bar 的子类并覆盖 Bar.myMethodFoo.anotherMethod。实际上,您会说它覆盖了Bar.anotherMethod,因为尽管在这种情况下我们知道Bar 没有实现anotherMethod,但在现实世界中您不会知道也不会关心它是否实现了不是。你只知道类Bar有方法anotherMethod.

    【讨论】:

      【解决方案3】:

      我会说两者,但你实际上并没有实现这个接口......接口是一个纯粹的抽象类,因此它的所有方法都没有实现......所以你提供了一个实现并且它是可见的两者 作为接口方法实现(所以你可以引用它来引用接口)以及它是 Object 的 toString() 的重写版本......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多