是否可以在Java中覆盖同一类中的方法?

时间:2012-06-13 09:30:40

标签: java oop inheritance override

查看以下代码示例:

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()方法在匿名内部类中被覆盖,这是一个完全不同的类。
但是重写代码仍然存在于同一个类中。那么,是否有理由断定在某些情况下[如上所述],可以覆盖同一类中的方法?

7 个答案:

答案 0 :(得分:3)

首先,您尚未在Test.java类中定义toString。

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

主要是,否则不能在同一课程中覆盖。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

因此在同一个类中重写方法是不可能的,因为我们想要使用相同的方法名称,我们可以通过更改签名来重载方法。

答案 5 :(得分:0)

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

答案 6 :(得分: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
}

Isn;这个函数覆盖在同一个类下吗?