1

看看下面的代码示例:

public class Test{

   public static void main(String[] args){

        System.out.println(new Test());


       System.out.println(new Test(){

        public String toString(){
             return "manual override";
         }

       });



      System.out.println(new Test(){

              public String gm(){
                    return  "manual gm";
               }
        }.gm());
     }  //end of main method

   public String gm(){
     return "gm";
    }
}

可能有人认为该toString()方法在匿名内部类中被覆盖,这是一个完全不同的类。
但是覆盖代码仍然驻留在同一个类中。那么,是否有理由得出结论,在某些情况下 [如上所述],可以覆盖同一类中的方法?

4

7 回答 7

3

首先,你还没有在你的Test.java类中定义 toString 。

其次,当你创建一个匿名类时,它在概念上就像创建一个子类。因此,只要父方法不是最终方法,就允许在匿名类中进行覆盖。

主要是,否则在同一类中无法覆盖。

于 2012-06-13T09:34:39.223 回答
2

答案是否定的,你不能在一个类中覆盖相同的方法。匿名内部类是一个不同的类。

于 2012-06-13T09:33:54.853 回答
1

上面的代码覆盖了Object类的toString()方法。所以你不能说它在同一个类中覆盖。现在它也覆盖了一个超类方法,这里的超类是Object,它是所有类的超类。

于 2012-06-13T09:34:12.247 回答
0

不,您只能覆盖子类中的方法。

public String toString(){
         return "manual override";
     }

在您的情况下,您正在覆盖Object's toString()方法而不是Test类方法。

于 2012-06-13T09:37:06.037 回答
0

在一个类中,我们不能有具有相同签名的方法。这是因为在同一个类中不需要覆盖方法。

因此在同一个类中覆盖方法是不可能的,如果我们想使用相同的方法名,我们可以通过改变签名来重载方法。

于 2012-06-13T09:44:32.993 回答
0

关于“现实世界的用例”,我确实在 Manning 的“JUnit Recipes” 2005 的第 2.5 节中找到了上述程序的实际用法。

于 2013-06-17T17:49:26.753 回答
0
public class Counter {
private int count;
// a simple integer instance variable
public Counter( ) { }
// default constructor (count is 0)
public Counter(int initial) { count = initial; }
// an alternate constructor
public int getCount( ) { return count; }
// an accessor method
public void increment( ) { count++; }
// an update method
public void increment(int delta) { count += delta; }
// an update method
public void reset( ) { count = 0; }
// an update method
}

这个函数不是在同一个类下覆盖吗?

于 2017-05-25T14:56:57.937 回答