Return type declaration
Overload return type
複習之前提到有關overload的規則:- 程式碼因為需要考慮更多有可能傳入的參數,但呼叫者不需要強迫呼叫另外一個名字不相同的method name。所以需要使用overload
- Overload規則如下:
- 必須變更parameter
- 可以變更return type
- 可以變更access modifier
- 可以宣告新的或範圍更廣的checked exception
- 可以在subclass和superclass間發生。例如superclass的method: getHeight();而subclass繼承後不改寫superClass的getHeight(),另外寫了一個method: getHeight(int years),這樣也叫做overload
如下範例:
public class Car{ int run(){return 0;} }
public class Sedan extends Car{ String run(int miles) {return null;} void run() {}//不合法,沒有修改parameters }
Sedan override superclass Car的run(),修改了return type變成String及回傳多一個int parameter,但第二個void run(){}是非法的,因為只有修改return type是不合法。
Override, return type及Covariant return
複習之前提到有關override和return type有關的規則:
- overriding method的parameters必須和original method的相同,如果不同就不叫做overriding,只是寫了一個新的method
- overriding method的return type必須和original method的相同,或者是subtype (covariant return)
Covariant: Java 5 的新功能 - 允許override method時return type為original type的subtype,如下範例:
public class Car{ Car calculateStuff(){ return new Car();} } public class Sedan extends Car{ Sedan calculateStuff(){ return new Sedan();} }
在Sedan class override calculateStuff()時,回傳type從Car變成subclass Sedan。
在1.4的Java會有錯誤(attempting to use incompatible return type),但在Java 5 Compiler是允許的。
Return value
六大基本注意事項:
- Return type如果是Object reference,可以回傳null
- Array可以當作合法return type
- return type如果是primitive type,可以回傳 可以隱晦upcast的型態
- 也可以回傳需要經過downcast的型態
- return type如果是void,則不能回傳任何東西 (但最後一行如果只return是可以的!)
- return type如果是object reference,可以回傳需要經過downcast
或upcast的type
public Sedan calculateStuff() { return null; }
public int[] order(){ return new int[]{1,2,3}; }
public int characterNum() { char c = 'x'; return c; //byte<char<int<long<float<double }
public double miles() { double d = 12.3; return (float) d; }
public void satHello() { return "Hello!"; //illegal }
public class Sedan extends Car { Car calculateStuff() { return new Sedan(); } }
public Object sayHello() { return "Hello!"; //illegal }
public interface OperateCar {} public class OperateBMW760i implements OperateCar{} public class TestCar{ public OperateCar getCar(){ return new OperateBMW760i(); } }
小技巧:
如果是object reference的return type,只要能夠通過IS-A的測驗(或instanceof回傳true),就能夠當作回傳型態。如:
如果是object reference的return type,只要能夠通過IS-A的測驗(或instanceof回傳true),就能夠當作回傳型態。如:
- OperateBMW760i IS-A OperateCar
- Sedan IS-A Car
- String IS-A Object
沒有留言:
張貼留言