- class Super{
- void f(){
- }
- int f(){
- return 1;
- }
- }
class Super{
void f(){
}
int f(){
return 1;
}
}
原因在與如果調用時int i = f();可以知道是調用Sub的f()。但是,往往用戶不關心返回值。只是f()。這樣就無法確定到底是哪個。
覆蓋一般情況是不允許的。比如
- class Super{
- void f(){
- }
- }
- class Sub extends Super{
- int f(){
- return 1;
- }
- }
class Super{
void f(){
}
}
class Sub extends Super{
int f(){
return 1;
}
}
編譯會報錯。
但是有辦法可以不同(表面上不同)。比如
- class Grain{
- public String toString(){
- return "Grain";
- }
- }
- class Wheat extends Grain{
- public String toString(){
- return "Wheat";
- }
- }
- class Mill{
- Grain process(){//注意返回值
- return new Grain();
- }
- }
- class WheatMill extends Mill{
- Wheat process(){//注意返回值
- return new Wheat();
- }
- }
- public class CovariantReturn {
- public static void main(String[] args) {
- Mill m = new Mill();
- Grain g = m.process();
- System.out.println(g);
- m = new WheatMill();
- g = m.process();
- System.out.println(g);
- }
- }
class Grain{
public String toString(){
return "Grain";
}
}
class Wheat extends Grain{
public String toString(){
return "Wheat";
}
}
class Mill{
Grain process(){//注意返回值
return new Grain();
}
}
class WheatMill extends Mill{
Wheat process(){//注意返回值
return new Wheat();
}
}
public class CovariantReturn {
public static void main(String[] args) {
Mill m = new Mill();
Grain g = m.process();
System.out.println(g);
m = new WheatMill();
g = m.process();
System.out.println(g);
}
}
這樣是完全可以的,運行結果
Grain
Wheat
其實也並不難理解,因爲子類本身就可以看做是父類。這個是JAVA1.5後引入的一個概念:
協變返回類型