"Merhaba Amigo! Bugünün dersinin konusu tip dönüştürmeleri genişletmek ve daraltmak. İlkel türleri genişletmeyi ve daraltmayı uzun zaman önce öğrendiniz. Seviye 10'da. Bugün bunun referans türleri için nasıl çalıştığı hakkında konuşacağız, yani sınıf örnekleri."

Aslında, her şey oldukça basit. Bir sınıfın kalıtım zincirini hayal edin: sınıf, onun ebeveyni, ebeveynin ebeveyni vb., Object sınıfına kadar. Bir sınıf, miras aldığı sınıfın tüm üye yöntemlerini içerdiğinden , sınıfın bir örneği, türü ebeveynlerinden herhangi biri olan bir değişkene kaydedilebilir .

İşte bir örnek:

kod Tanım
class Animal
{
public void doAnimalActions();
}class Cat extends Animal
{
public void doCatActions();
}class Tiger extends Cat
{
public void doTigerActions();
}
Burada üç sınıf bildirimimiz var: Animal, Cat ve Tiger. Kedi, Hayvanı miras alır. Ve Tiger, Cat'i miras alır.
public static void main(String[] args)
{
Tiger tiger = new Tiger();
Cat cat = new Tiger();
Animal animal = new Tiger();
Object obj = new Tiger();
}
Bir Tiger nesnesi, türü atalarından birininki olan bir değişkene her zaman atanabilir. Tiger sınıfı için bunlar Cat, Animal ve Object'dir.

Şimdi genişletme ve daraltma dönüşümlerine bir göz atalım.

Bir atama işlemi, kalıtım zincirinde (Object sınıfına doğru) yukarı çıkmamıza neden oluyorsa, genişleyen bir dönüşümle (yukarıya aktarma olarak da bilinir) uğraşıyoruz demektir. Zinciri aşağı doğru nesnenin türüne doğru hareket ettirirsek, bu bir daraltıcı dönüşümdür (aşağıya doğru yönlendirme olarak da bilinir).

Kalıtım zincirinde yukarı doğru hareket etmek, daha genel bir türe yol açtığı için genişleme olarak adlandırılır. Ancak bunu yaparken, kalıtım yoluyla sınıfa eklenen yöntemleri çağırma yeteneğimizi kaybederiz.

kod Tanım
public static void main(String[] args)
{
Object obj = new Tiger();
Animal animal = (Animal) obj;
Cat cat = (Cat) obj;
Tiger tiger = (Tiger) animal;
Tiger tiger2 = (Tiger) cat;
}
Türü daraltırken, bir tür dönüştürme operatörü kullanmanız gerekir, yani açık bir dönüştürme gerçekleştiririz.

Bu, Java makinesinin, nesnenin onu dönüştürmek istediğimiz türü gerçekten miras alıp almadığını kontrol etmesine neden olur.

Bu küçük yenilik, yazım hatalarının sayısında çok yönlü bir azalma sağladı ve Java programlarının kararlılığını önemli ölçüde artırdı.

kod Tanım
public static void main(String[] args)
{
Object obj = new Tiger();
if (obj instanceof Cat)
{
Cat cat = (Cat) obj;
cat.doCatActions();
}}
Daha da iyisi, bir çek örneği kullanın 
public static void main(String[] args)
{
Animal animal = new Tiger();
doAllAction(animal);

Animal animal2 = new Cat();
doAllAction(animal2);

Animal animal3 = new Animal();
doAllAction(animal3);
}

public static void doAllAction(Animal animal)
{
if (animal instanceof Tiger)
{
Tiger tiger = (Tiger) animal;
tiger.doTigerActions();
}

if (animal instanceof Cat)
{
Cat cat = (Cat) animal;
cat.doCatActions();
}

animal.doAnimalActions();
}
Ve işte nedeni. Soldaki örneğe bir göz atın.

Biz (kodumuz) ne tür bir nesneyle çalıştığımızı her zaman bilemeyiz. Değişken (Animal) ile aynı türden bir nesne veya herhangi bir alt tür (Kedi, Kaplan) olabilir.

doAllAction yöntemini düşünün. Geçirilen nesnenin türünden bağımsız olarak düzgün çalışır.

Başka bir deyişle, her üç tür için de doğru şekilde çalışır: Hayvan, Kedi ve Kaplan.

public static void main(String[] args)
{
Cat cat = new Tiger();
Animal animal = cat;
Object obj = cat;
}
Burada üç atama işlemimiz var. Hepsi genişleyen dönüşüm örnekleridir.

Burada type cast operatörüne gerek yoktur, çünkü herhangi bir kontrol gerekli değildir. Bir nesne referansı, türü atalarından biri olan bir değişkende her zaman saklanabilir.

"Ah, sondan ikinci örnek her şeyi netleştirdi: kontrolün neden gerekli olduğu ve neden tip dökümünün gerekli olduğu."

"Umarım öyledir. Şu gerçeğe dikkatinizi çekmek istiyorum:"

Bunların hiçbiri bir nesnenin herhangi bir şekilde değişmesine neden olmaz! Değişen tek şey , belirli bir referans değişkeninde çağrılabilecek yöntemlerin sayısıdır .

Örneğin, bir Cat değişkeni, doAnimalActions ve doCatActions yöntemlerini çağırmanıza izin verir. Bir Tiger nesnesine işaret etse bile doTigerActions yöntemi hakkında hiçbir şey bilmiyor.

"Evet, anladım. Düşündüğümden daha kolaydı."