CodeGym /Java Blogu /Rastgele /Operatör Java örneği
John Squirrels
Seviye
San Francisco

Operatör Java örneği

grupta yayınlandı
MERHABA! Bugün instanceof operatöründen bahsedeceğiz , nasıl kullanıldığına dair örnekleri ele alacağız ve nasıl çalıştığına dair bazı yönlere değineceğiz :) Bu operatörle zaten CodeGym'in erken seviyelerinde karşılaştınız. Neden ihtiyacımız olduğunu hatırlıyor musun? Değilse, endişelenme. Birlikte hatırlayalım. Instanceof operatörü , bir X değişkeni tarafından başvurulan bir nesnenin bazı Y sınıflarına göre yaratılıp yaratılmadığını kontrol etmek için gereklidir . Kulağa basit geliyor. Neden bu konuya geri döndük? Her şeyden önce, çünkü artık Java'nın kalıtım mekanizmasına ve OOP'nin diğer ilkelerine aşinasınız. Instanceof operatörü artık çok daha net olacak ve nasıl kullanıldığına dair daha gelişmiş örneklere bakacağız. Hadi gidelim!instanceof operatörü nasıl çalışır - 1Kontrol true olarak değerlendirilirse instanceof operatörünün true, ifade false ise false döndürdüğünü muhtemelen hatırlıyorsunuzdur . Buna göre, genellikle her tür koşullu ifadede ( if…else ) bulunur. Daha basit örneklerle başlayalım:

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof Integer);
   }
}
Sizce konsolda ne gösterilecek? Eh, burada bariz. :) x nesnesi bir Tamsayı, dolayısıyla sonuç true olacaktır . Konsol çıktısı: True Bunun bir String olup olmadığını kontrol etmeye çalışalım :

public class Main {

   public static void main(String[] args) {

       Integer x = new Integer(22);

       System.out.println(x instanceof String); // Error!
   }
}
Bir hatamız var. Ve dikkat edin: derleyici, kodu çalıştırmadan önce hatayı oluşturdu! Integer ve String'in otomatik olarak birbirine dönüştürülemeyeceğini ve kalıtım yoluyla ilişkili olmadığını hemen gördü . Sonuç olarak, String temelinde bir Tamsayı nesnesi oluşturulmaz . Bu uygundur ve garip çalışma zamanı hatalarından kaçınmaya yardımcı olur, bu nedenle derleyici burada bize yardımcı oldu :) Şimdi daha zor olan örnekleri ele almaya çalışalım. Kalıtımdan bahsettiğimize göre, aşağıdaki küçük sınıf sistemi ile çalışalım:

public class Animal {

}

public class Cat extends Animal {

}

public class MaineCoon extends Cat {

}
Bir nesnenin bir sınıfın örneği olup olmadığını kontrol ettiğimizde instanceof'un nasıl davrandığını zaten biliyoruz , ancak ebeveyn-çocuk ilişkisini düşünürsek ne olur? Örneğin, bu ifadelerin ne getireceğini düşünüyorsunuz:

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();

       System.out.println(cat instanceof Animal);

       System.out.println(cat instanceof MaineCoon);

   }
}
Çıktı: Doğru Yanlış Cevaplanması gereken asıl soru, instanceof'un 'bir sınıfa dayalı olarak oluşturulan nesne'yi tam olarak nasıl yorumladığıdır? ' cat instanceof Animal ' true olarak değerlendirilir , ancak kesinlikle bu ifadede hata bulabiliriz. Animal sınıfına dayalı olarak neden bir Cat nesnesi oluşturuldu ? Sadece kendi sınıfına göre yaratılmış değil mi? Cevap yeterince basit ve bunu zaten düşünmüş olabilirsiniz. Bir nesne oluştururken yapıcıların çağrıldığı ve değişkenlerin başlatıldığı sırayı unutmayın. Bu konuyu , sınıf kurucuları hakkındaki makalede zaten ele almıştık . İşte o dersten bir örnek:

public class Animal {

   String brain = "Initial value of brain in the Animal class";
   String heart = "Initial value of heart in the Animal class";

   public static int animalCount = 7700000;

   public Animal(String brain, String heart) {
       System.out.println("Animal base class constructor is running");
       System.out.println("Have the variables of the Animal class already been initialized?");
       System.out.println("Current value of static variable animalCount = " + animalCount);
       System.out.println("Current value of brain in the Animal class = " + this.brain);
       System.out.println("Current value of heart in the Animal class = " + this.heart);
       System.out.println("Have the variables of the Cat class already been initialized?");
       System.out.println("Current value of static variable catCount = " + Cat.catCount);

       this.brain = brain;
       this.heart = heart;
       System.out.println("Animal base class constructor is done!");
       System.out.println("Current value of brain = " + this.brain);
       System.out.println("Current value of heart = " + this.heart);
   }
}

public class Cat extends Animal {

   String tail = "Initial value of tail in the Cat class";

   static int catCount = 37;

   public Cat(String brain, String heart, String tail) {
       super(brain, heart);
       System.out.println("The Cat class constructor has started (The Animal constructor already finished)");
       System.out.println("Current value of static variable catCount = " + catCount);
       System.out.println("Current value of tail = " + this.tail);
       this.tail = tail;
       System.out.println("Current value of tail = " + this.tail);
   }

   public static void main(String[] args) {
       Cat cat = new Cat("Brain", "Heart", "Tail");
   }
}
Ve IDE'de çalıştırırsanız, konsol çıktısı şu şekilde görünecektir: Animal temel sınıf yapıcısı çalışıyor Animal sınıfının değişkenleri zaten başlatıldı mı? AnimalCount statik değişkeninin geçerli değeri = 7700000 Animal sınıfında Brain'in geçerli değeri = Animal sınıfında Brain'in başlangıç ​​değeri Animal sınıfında Heart'ın geçerli değeri = Animal sınıfında Heart'ın başlangıç ​​değeri Cat sınıfının değişkenlerine zaten sahip olun başlatıldı mı? catCount statik değişkeninin geçerli değeri = 37 Hayvan temel sınıf yapıcısı tamamlandı! Brain'in mevcut değeri = Brain Mevcut değer Heart = Heart cat sınıfı kurucusu başladı (Animal kurucusu zaten bitti) catCount statik değişkeninin mevcut değeri = 37 tail'in mevcut değeri = Cat sınıfındaki tail'in başlangıç ​​değeri tail'in mevcut değeri = Kuyruk Şimdi hatırladınız mı? :) Bir temel sınıf varsa, bir nesne oluşturulurken her zaman önce temel sınıfın yapıcısı çağrılır. Bir A nesnesinin B sınıfına dayalı olarak yaratılıp yaratılmadığını belirlemeye çalışırken, instanceof operatörü bu ilke tarafından yönlendirilir . Temel sınıf yapıcısı çağrılırsa, o zaman hiç şüphe olamaz. İkinci kontrol ile her şey daha basit:

System.out.println(cat instanceof MaineCoon);
MaineCoon yapıcısı , Cat nesnesi oluşturulduğunda çağrılmadı , bu mantıklı. Ne de olsa MaineCoon , Cat'in soyundan geliyor , atası değil. Ve Cat için bir şablon değil . Tamam, sanırım bu konuda anlaştık. Ama bunu yaparsak ne olur?:

public class Main {

   public static void main(String[] args) {

       Cat cat = new MaineCoon();

       System.out.println(cat instanceof Cat);
       System.out.println(cat instanceof MaineCoon);


   }
}
Hmm... şimdi bu daha zor. Hadi konuşalım. Bir MaineCoon nesnesi atadığımız bir Cat değişkenimiz var . Bu arada, bu neden işe yarıyor? Bunu yapabiliriz, değil mi? Evet yapabiliriz. Ne de olsa her MaineCoon bir kedidir. Bu tamamen açık değilse, genişleyen ilkel türler örneğini hatırlayın:

public class Main {

   public static void main(String[] args) {

       long x = 1024;

   }
}
1024 sayısı kısadır : onu barındırmak için yeterli bayt olduğundan, kolayca uzun bir değişkene sığar ( oyuncak bebeklerle ilgili örneği hatırlıyor musunuz?). Bir alt nesne her zaman bir üst değişkene atanabilir. Şimdilik bunu unutmayın ve sonraki derslerde bunun nasıl çalıştığını analiz edeceğiz. Peki örneğimizin çıktısı ne?

Cat cat = new MaineCoon();
System.out.println(cat instanceof Cat);
System.out.println(cat instanceof MaineCoon);
instanceof neyi kontrol edecek? Cat değişkenimiz mi yoksa MaineCoon nesnemiz mi? Cevap, bu sorunun aslında basit olmasıdır. İşlecin tanımını tekrar okumanız yeterlidir: Bir X değişkeni tarafından başvurulan bir nesnenin bazı Y sınıflarına göre yaratılıp yaratılmadığını kontrol etmek için instanceof işleci gereklidir . Instanceof operatörü , değişken tipini değil, bir nesnenin kaynağını test eder. Böylece, bu örnekte, programımız her iki durumda da doğru gösterecektir: bir MaineCoon nesnemiz var . Açıktır ki, MaineCoon sınıfı temel alınarak oluşturulmuştur , ancak Cat temel alınarak oluşturulmuştur.ebeveyn sınıfı da!
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION