Merhaba Arkadaslar,
Bu Java yazimda metotlarin donus tipi ile ilgili durumlari inceleyecegiz. Daha once bahsi gecen covariant return type ile baslayalim.
Overrided metotlarda donus tipi degismeyecegegini, fakat covariant /esdeger donus tipi olursa degisebilecegini belirtmistik. Ornek uzerinde inceleyelim ;
public class Car { Car speedUp() { return new Car(); } } class Ford extends Car { @Override Ford speedUp() { return new Ford(); } }
Car sinifinda bulunan speedUp metodu Car donus tipindedir, Ford sinifi Car sinifini kalitmakta ve speedUp metodunu override etmektedir. Burada dikkat ederseniz donus tipimiz Car degil Ford oldu. Iste burada oldugu gibi override edilen metodun donus tipinin altsinif donus tipinde oldugu durumlarda covariant return type gecerli olacaktir.
Cunku Ford IS-A kurali gecerli olacaktir.
Daha once belirttigim gibi overrided metotlarda covariant return type disinda donus tipi degisemeyecegi gibi overloaded metotlarda bu durumda bir kisitlama yoktur donus tipi degisebilir.
void beCool() { } int beCool(int cool) { return 1; }
Donus tipiyle ilgili olarak su kurallari aklimizda bulunduralim;
- Bir object referans tipinde donus tipi soz konusu oldugunda null kullanilabilir;
public JButton createButton() { return null; } public Integer giveMeInt(){ return null; } public String giveMeString() { return null; } public String[] giveMeArray() { return null; } public Double[][] giveMeMatrix() { return null; } public Boolean giveMeBool() { return null; }
- primitive bir donus tipi icin bu durum gecerli degildir.
int beCool(int cool) { return null; //compile error }
- primitive bir donus tipli bir metot icin ; tanimlanan donus tipine implicity/dolayli olarak donusturulebilecek bir donus tipi return ifadesinde kullanilabilir.
public int giveMeInt(){ //return 'c'; //return new Byte((byte)10); return new Short((short)10); } public float giveMeFloat() { //return 'c'; //return new Byte((byte)10); //return new Short((short)10); return 10; }
- primitive bir donus tipli metot icin ; tanimlanan donus tipine explicity/acik bir sekilde cast ederek kullanilabilir.
public int castFloat() { float f = 32.5f; return (int)f; }
- Bir metodun donus tipi olmak zorunda degildir. void donus tipi belirtildiginde return ile bir deger dondurmeye calismak compile error / derleme hatasina yol acacaktir.
void iVoid(){ //return 10; compile error return; }
- Obje referans donus tipine sahip metot icin ; tanimlanan donus tipine implicity /dolayli olarak cast edilebilecek bir donus tipi kullanilabilir.
public Car getCar() { return new Ford(); } public Object getObject() { int [] number = {1,2,3}; return number; }
Burada IS-A kurali gecerlidir, Ford IS-A Car, Array IS-A Object.
IS-A kuralinin interface/arabirimler icin de gecerli oldugunu unutmayalim ;
interface Speedy {} class Subaru implements Speedy { public Speedy getSpeedy() { return new Subaru(); } }