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