CodeGym /Java Blogu /Rastgele /Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı. B...
John Squirrels
Seviye
San Francisco

Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı. Bölüm 1

grupta yayınlandı
Herkese merhaba bayanlar ve baylar, yazılım mühendisleri! Biraz da mülakat sorularından bahsedelim. Neye hazırlanmanız ve neleri bilmeniz gerektiği hakkında. Bu noktaları ilk kez gözden geçirmek veya incelemek için harika bir zaman. Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 1 Sonunda OOP, Java sözdizimi, Java istisnaları, koleksiyonlar ve çoklu kullanım hakkında sık sorulan sorulardan oluşan oldukça geniş bir koleksiyon elde ettim ve bunu kolaylık sağlamak için birkaç parçaya ayıracağım. Her şeyi bir anda ele almak zor ama umarım bu materyal programcı olarak ilk işlerini bulmaya hazırlananlar için iyi bir temel sağlar. En iyi anlayış ve akılda tutma için, diğer kaynakları da taramanızı tavsiye ederim. Bir konsepte birkaç farklı açıdan yaklaşarak daha derin bir kavrayış elde edebilirsiniz. Önemli:Sadece sürüm 8 öncesi Java'dan bahsedeceğiz. Sürüm 9, 10, 11, 12 ve 13'te gelen tüm yenilikler burada ele alınmayacaktır. Cevapların nasıl geliştirileceğine dair herhangi bir fikir/yoruma açığız . İyi okumalar. Hadi gidelim!

Java röportajı: OOP hakkında sorular

1. Java'nın özellikleri nelerdir?

Cevap:
  1. OOP kavramları:

    1. nesne yönelimi
    2. miras
    3. kapsülleme
    4. polimorfizm
    5. soyutlama
  2. Çapraz platform: Bir Java programı herhangi bir değişiklik yapılmadan herhangi bir platformda çalıştırılabilir. Elbette bunun için kurulu bir JVM (Java sanal makinesi) gerekir.

  3. Yüksek performans: Tam Zamanında (JIT) derleyici, yüksek performansı mümkün kılar. JIT derleyicisi bayt kodunu makine koduna dönüştürür ve ardından JVM yürütmeye başlar.

  4. Multithreading: JVM main thread, . Bir programcı, Thread sınıfından türeterek veya arabirimi uygulayarak birden çok iş parçacığı oluşturabilir Runnable.

2. Miras nedir?

Kalıtım, bir sınıfın başka bir sınıfı miras alabileceği anlamına gelir ( extends anahtar sözcüğünü kullanarak). Bu, devraldığınız sınıfın kodunu yeniden kullanabileceğiniz anlamına gelir. Mevcut sınıf, olarak bilinir superclassve yeni oluşturulan sınıf, subclass. İnsanlar ayrıca ebeveyn ve terimlerini kullandıklarını söylüyor child.

public class Animal {
   private int age;
}

public class Dog extends Animal {

}
Animalve nerede . parent_ Dog_child

3. Kapsülleme nedir?

Bu soru genellikle Java geliştirici pozisyonları için yapılan görüşmelerde sorulur. Kapsülleme, erişim değiştiricileri, alıcıları ve ayarlayıcıları kullanarak uygulamayı gizlemektedir. Bu, geliştiricilerin gerekli olduğunu düşündüğü her yerde harici erişimi engellemek için yapılır. Gerçek hayattan basit bir örnek arabadır. Motorun çalışmasına doğrudan erişimimiz yok. Tek yapmamız gereken anahtarı kontağa sokup motoru çalıştırmak. Kaputun altında gerçekleşen süreçler bizi ilgilendirmez. Ayrıca, motorun çalışmasına müdahale edersek, öngörülemeyen bir duruma yol açabilir, muhtemelen araca zarar verebilir ve bedensel zarara yol açabilir. Tam olarak aynı şey programlamada da olur. Bu Wikipedia'da iyi açıklanmıştır. Ayrıca CodeGym'de kapsülleme hakkında bir makale var .

4. Polimorfizm nedir?

Polimorfizm , bir programın, nesnenin belirli türü hakkında bilgi olmadan, aynı arayüze sahip nesneleri aynı şekilde ele alma yeteneğidir. Söylediği gibi, "bir arayüz - birçok uygulama". Polimorfizm ile paylaşılan davranışlara dayalı olarak farklı nesne türlerini birleştirebilir ve kullanabilirsiniz. Örneğin, iki türevi olan bir Hayvan sınıfımız var: Köpek ve Kedi. Genel Animal sınıfı, herkes tarafından paylaşılan bir davranışa, ses çıkarma yeteneğine sahiptir. Animal sınıfını miras alan her şeyi toplamamız ve "ses çıkar" yöntemini yürütmemiz gerektiğinde polimorfik yetenekleri kullanırız. İşte nasıl göründüğü:

List<Animal> animals = Arrays.asList(new Cat(), new Dog(), new Cat());
animals.forEach(animal -> animal.makeSound());
Başka bir deyişle, polimorfizm faydalıdır. Bu aynı zamanda polimorfik (aşırı yüklenmiş) yöntemler için de geçerlidir. Polimorfizm nasıl kullanılır?

Java sözdizimi hakkında mülakat soruları

5. Java'da yapıcı nedir?

Yapıcılar aşağıdaki özelliklere sahiptir:
  1. Yeni bir nesne oluşturulduğunda, program onu ​​oluşturmak için uygun yapıcıyı kullanır.
  2. Yapıcı bir yöntem gibidir. Ayırt edici özellikleri, dönüş değeri olmaması (void dahil) ve adının sınıfın adıyla aynı olmasıdır.
  3. Açıkça hiçbir oluşturucu oluşturulmamışsa, otomatik olarak boş bir oluşturucu oluşturulur.
  4. Bir yapıcı geçersiz kılınabilir.
  5. Parametreli bir oluşturucu bildirirseniz ancak parametresiz bir kurucuya da ihtiyacınız varsa, otomatik olarak oluşturulmayacağı için ayrı olarak oluşturmalısınız.

6. Hangi iki sınıf Object'i miras almaz?

Hileli sorulara aldanmayın - böyle sınıflar yoktur. Tüm sınıflar, Object sınıfını doğrudan veya ataları aracılığıyla miras alır!

7. Yerel değişken nedir?

Bu, Java geliştiricileri için başka bir popüler mülakat sorusudur. Yerel değişken, bir yöntem içinde tanımlanan ve yöntem yürütüldüğü sürece var olan bir değişkendir. Yürütme biter bitmez, yerel değişkenin varlığı sona erer. İşte main() yönteminde helloMessage adlı yerel bir değişkeni kullanan bir program:

public static void main(String[] args) {
   String helloMessage;
   helloMessage = "Hello, World!";
   System.out.println(helloMessage);
}

8. Örnek değişken nedir?

Örnek değişken, bir sınıf içinde bildirilen bir değişkendir. Bir nesne var olduğu sürece vardır. Örneğin, nectarLoad ve maxNectarLoad olmak üzere iki örnek değişkeni olan bir Bee sınıfımız var:

public class Bee {

   /**
    * Current nectar load
    */
   private double nectarLoad;

   /**
    * Maximum nectar that can the bee can collect.
    */
   private double maxNectarLoad = 20.0;
 
  ...
}

9. Erişim değiştiricileri nelerdir?

Erişim değiştiricileri, sınıflara, yöntemlere ve değişkenlere erişimi özelleştirmek için kullanılan bir mekanizmadır. Artan erişim sırasına göre listelenen aşağıdaki değiştiriciler mevcuttur:
  1. private— Bu erişim değiştirici, yöntemlerde, alanlarda ve yapıcılarda kullanılır. Erişim, tanımlandıkları sınıfla sınırlıdır.
  2. package-private (default)— Bu, sınıflar için varsayılan erişim düzeyidir. Erişim, bir sınıfın, yöntemin, değişkenin veya yapıcının bildirildiği belirli paketle sınırlıdır.
  3. protectedpackage-private— Bu erişim değiştirici, değiştirici ile bir sınıfı miras alan sınıflar için erişim eklenmesiyle aynı erişim seviyesini sunar protected.
  4. public— Bu erişim düzeyi sınıflar için de kullanılır. Bu erişim seviyesi, uygulama genelinde tam erişim olduğu anlamına gelir.
Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 2

10. Yöntem geçersiz kılma nedir?

Bir alt sınıf, üst sınıfının davranışını değiştirmek istediğinde yöntemleri geçersiz kılarız. Ebeveyn metodunda olanı da yapmamız gerekirse, ebeveyn metodunu yürütecek olan çocukta super.methodName() kullanabiliriz. Bundan sonra ek mantığımızı ekleyebiliriz. Uyulması gereken gereksinimler:
  • yöntem imzası aynı olmalıdır
  • dönüş değeri aynı olmalıdır

11. Yöntem imzaları nelerdir?

Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 3Yöntem imzası, yöntem adının ve yöntemin aldığı bağımsız değişkenlerin birleşimidir. Yöntem imzası, yöntemler aşırı yüklenirken bir yöntemin benzersiz tanımlayıcısıdır.

12. Yöntem aşırı yüklemesi nedir?

Yöntem aşırı yüklemesi, aynı eylemi gerçekleştiren birden çok yöntem oluşturmak için yöntem imzasını değiştirdiğimiz bir polimorfizm özelliğidir:
  • aynı isim
  • farklı argümanlar
  • farklı dönüş türleri olabilir
Örneğin, ArrayListsınıfın add()yöntemi aşırı yüklenebilir, bu da giriş argümanlarına bağlı olarak farklı şekillerde ekleme yapmamıza izin verir:
  • add(Object o)— Bu yöntem yalnızca bir nesne ekler
  • add(int index, Object o)— Bu yöntem, belirli bir dizinde bir nesne ekler
  • add(Collection<Object> c)— Bu yöntem, nesnelerin bir listesini ekler
  • add(int index, Collection<Object> c)— Bu yöntem, belirli bir dizinden başlayarak nesnelerin bir listesini ekler.

13. Arayüz nedir?

Java çoklu kalıtımı desteklemez. Bu sınırlamayı aşmak için bildiğimiz ve sevdiğimiz formda arayüzler eklendi ;) Uzun bir süre arayüzlerin herhangi bir uygulama olmadan sadece yöntemleri vardı. Bu cevap bağlamında, onlar hakkında konuşalım. Örneğin:


public interface Animal {
   void makeSound();
   void eat();
   void sleep();
}
Buradan bazı ayrıntılar çıkar:
  • Bir arabirimdeki tüm yöntemler genel ve soyuttur.
  • Tüm değişkenler genel statik finaldir
  • Sınıflar arayüzleri miras almazlar (yani, extends anahtar sözcüğünü kullanmayız). Bunun yerine, sınıflar bunları uygular (yani, implements anahtar sözcüğünü kullanırız). Ayrıca, istediğiniz kadar arayüz uygulayabilirsiniz.
  • Bir arayüzü uygulayan sınıflar, arayüzde bulunan tüm yöntemlerin bir uygulamasını sağlamalıdır.
Bunun gibi:

public class Cat implements Animal {
   public void makeSound() {
       // Method implementation
   }

   public void eat() {
       // Implementation
   }

   public void sleep() {
       // Implementation
   }
}

14. Bir arabirimde varsayılan yöntem nedir?

Şimdi varsayılan yöntemler hakkında konuşalım. Onlar ne için? Onlar kimin için? Bu yöntemler "her iki ele" de hizmet edecek şekilde eklendi. Ne hakkında konuşuyorum? Bir yandan, yeni işlevsellik eklemeye ihtiyaç vardı: lambdalar ve Stream API. Öte yandan, Java'nın meşhur olan geriye dönük uyumluluk özelliğini korumak gerekiyordu. Bunu yapmak için arayüzlerin bazı yeni hazır çözümlere ihtiyacı vardı. Varsayılan yöntemler bize böyle geldi. Varsayılan bir yöntem, anahtar sözcükle işaretlenmiş bir arabirimde uygulanan bir yöntemdir default. Örneğin, arayüzdeki iyi bilinen stream()yöntem Collection. İnanın bu arayüz göründüğü kadar basit değil. Veya aynı derecede ünlü forEach()yöntemIterablearayüz. Ayrıca, varsayılan yöntemler eklenene kadar mevcut değildi. Bu arada, CodeGym'de de buradan okuyabilirsiniz .

15. O halde iki özdeş varsayılan yöntemi nasıl miras alırız?

Varsayılan yöntemin ne olduğuyla ilgili önceki yanıt, başka bir soruyu akla getiriyor. Arabirimlerde yöntemleri uygulayabiliyorsanız, teorik olarak aynı yöntemle iki arabirimi uygulayabilirsiniz. Bunu nasıl yaparız? İşte aynı yöntemle iki farklı arayüz:

interface A {
   default void foo() {
       System.out.println("Foo A");
   }
}

interface B {
   default void foo() {
       System.out.println("Foo B");
   }
}
Ve bu iki arayüzü uygulayan bir sınıfımız var. Ancak A veya B arayüzünde belirli bir yöntemi nasıl seçeriz? Aşağıdaki özel yapı buna izin verir: A.super.foo():

public class C implements A, B {
   public void fooA() {
       A.super.foo();
   }

   public void fooB() {
       B.super.foo();
   }
}
Böylece, metot arayüzün fooA()varsayılan metodunu kullanırken metot arayüzün metodunu kullanacaktır . foo()AfooB()foo()B

16. Soyut metotlar ve sınıflar nelerdir?

Java'da abstractayrılmış bir kelimedir. Soyut sınıfları ve yöntemleri belirtmek için kullanılır. Öncelikle tanımlara ihtiyacımız var. abstractSoyut bir yöntem , soyut bir sınıfta bir uygulama olmadan anahtar kelime kullanılarak bildirilen bir yöntemdir . Yani, bu bir arayüzdeki gibi bir yöntemdir, ancak bir anahtar kelimenin eklenmesiyle, örneğin:

public abstract void foo();
Soyut bir sınıf, aynı zamanda şu anahtar kelimeyle işaretlenmiş bir sınıftır abstract:

public abstract class A {

}
Soyut bir sınıfın birkaç özelliği vardır:
  • soyut bir sınıfın nesnesini yaratamazsınız
  • soyut yöntemlere sahip olabilir
  • soyut yöntemleri de olmayabilir
Bir dizi ortak davranış ve duruma (yani yöntemler ve değişkenler) sahip soyutlama (totoloji için özür dilerim) için soyut sınıflara ihtiyaç vardır. Gerçek hayat örneklerle doludur. Etrafımızdaki her şey. "Hayvan", "Araba", "Geometrik şekil" vb.

17. String, StringBuilder ve StringBuffer arasındaki fark nedir?

Stringdeğerler sabit bir dizi havuzunda saklanır. Bir dizi yaratılır yaratılmaz bu havuzda görünür. Ve onu silemezsiniz. Örneğin:

String name = "book";
Değişken, sabit dizi havuzuna işaret edecektir. Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 4name değişkenini farklı bir değere ayarlayarak, şunu elde ederiz:

name = "pen";
Sabit dizi havuzu şöyle görünür: Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 5Diğer bir deyişle, her iki değer de orada kalır. Dize Tamponu:
  • Stringdeğerler bir yığında saklanır. Bir değer değiştirilirse, yeni değer eskisinin yerini alacaktır.
  • String Buffersenkronize edilir ve bu nedenle iş parçacığı güvenlidir.
  • İplik güvenliği nedeniyle performansı zayıftır.
Örnek:

StringBuffer name = “book”;
Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 6name değişkeninin değeri değişir değişmez, yığındaki değer değişir: Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 7StringBuilder, ile tamamen aynıdır StringBuffer, yalnızca iş parçacığı açısından güvenli değildir. Sonuç olarak, StringBuffer.

18. Soyut sınıf ile arayüz arasındaki fark nedir?

Soyut sınıf:
  • Soyut sınıfların varsayılan bir yapıcısı vardır. Soyut sınıfın soyundan gelen her oluşturulduğunda çağrılır.
  • Hem soyut yöntemleri hem de soyut olmayan yöntemleri içerebilirler. Genel olarak, soyut bir sınıfın soyut yöntemleri olması gerekmez.
  • Soyut olanı miras alan bir sınıf, yalnızca soyut yöntemleri uygulamalıdır.
  • Soyut bir sınıf, örnek değişkenlere sahip olabilir (bkz. Soru #5).
Arayüz:
  • Bir arabirimin yapıcısı yoktur ve başlatılamaz.
  • Yalnızca soyut yöntemler eklenebilir (varsayılan yöntemler hariç).
  • Arabirimi uygulayan sınıflar, tüm yöntemleri uygulamalıdır (varsayılan yöntemler hariç).
  • Arayüzler sadece sabitlere sahip olabilir.

19. Bir dizideki bir elemana erişim neden O(1)'dir?

Bu soru tam anlamıyla son röportajımda soruldu. Daha sonra öğrendiğim gibi, bu sorunun amacı bir kişinin nasıl düşündüğünü görmektir. Açıkçası, bu bilgide çok az pratik değer var. Sadece bilmek yeterlidir. Öncelikle, O(1)' in bir "sabit zaman" algoritmasının zaman karmaşıklığı için gösterim olduğunu açıklığa kavuşturmamız gerekiyor . Başka bir deyişle, bu atama en hızlı yürütme süresini gösterir. Bu soruyu cevaplamak için diziler hakkında bildiklerimizi gözden geçirmeliyiz. Bir dizi oluşturmak için intaşağıdakileri yazmalıyız:

int[] intArray = new int[100];
Bu sözdiziminden birkaç sonuç çıkarılabilir:
  1. Bir dizi bildirildiğinde türü bilinir. Tip biliniyorsa, dizideki her hücrenin boyutu da bilinir.
  2. Tüm dizinin boyutu biliniyor.
Bu nedenle, hangi hücreye yazılacağını anlamak için, sadece belleğin hangi alanına yazılacağını hesaplamamız gerekir. Bir bilgisayar için bu çok kolay. Bilgisayar ayrılan belleğin nerede başladığını, öğe sayısını ve her bir hücrenin boyutunu bilir. Bütün bunlar, yazılacak yerin, dizinin başlangıç ​​yeri + her hücrenin boyutunun indeksle çarpımına eşit olacağı anlamına gelir.

Peki bir ArrayList'teki nesnelere erişirken O(1)'e nasıl ulaşırız?

Bu soru hemen bir öncekini takip ediyor. Gerçek şu ki, ilkelleri tutan bir dizi ile çalışırken, eleman türünün boyutunu önceden (yaratma sırasında) biliyoruz. Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı.  Bölüm 1 - 8Ancak, bu tür bir kalıtım hiyerarşimiz varsa ve A tipi öğeler için bir koleksiyon oluşturmak ve farklı uygulamalar (B, C ve D) eklemek istiyorsak ne yapmalıyız :

List<A> list = new ArrayList();
list.add(new B());
list.add(new C());
list.add(new D());
list.add(new B());
Bu durumda, her hücrenin boyutunu nasıl hesaplarız? Sonuçta, her nesne muhtemelen farklı ek alanlarla farklı olacaktır. Ne yapalım? Burada soru kafanızı karıştıracak şekilde sorulmuştur. Koleksiyonun doğrudan nesneleri depolamadığını biliyoruz. Yalnızca nesnelere yapılan başvuruları saklar. Ve tüm referanslar aynı boyuta sahiptir ve bilinir. Sonuç olarak, burada adresleri bir önceki sorudakiyle aynı şekilde hesaplıyoruz.

21. Otomatik kutulama ve kutudan çıkarma

Tarihsel arka plan: otomatik kutulama ve kutudan çıkarma, JDK 5'teki ana yeniliklerden bazılarıdır. Otomatik kutulama , ilkel bir türden karşılık gelen bir sarmalayıcı sınıfına otomatik dönüştürme işlemidir. Kutudan çıkarma, otomatik kutulamanın tam tersidir. Bir sarmalayıcı sınıfı ilkel sınıfa dönüştürme işlemidir. Ancak bir sarmalayıcının değeri ise null, kutudan çıkarma sırasında bir NullPointerExceptionatılır.

İlkel öğeler ve bunlara karşılık gelen sarmalayıcılar

İlkel sarmalayıcı sınıfı
mantıksal boole
int tamsayı
bayt Bayt
karakter Karakter
batmadan yüzmek Batmadan yüzmek
uzun Uzun
kısa Kısa
çift Çift

// Otomatik kutulama gerçekleşir:

  • bir sarmalayıcı sınıfına bir referansa bir ilkel atarken:

    Java 5'ten ÖNCE:

    
    // Manual boxing (the way it was BEFORE Java 5).
    public void boxingBeforeJava5() {
       Boolean booleanBox = new Boolean(true);
       Integer intBox = new Integer(3);
       // And so on for other types
    }
    
    After Java 5:
    // Automatic boxing (the way it became in Java 5).
    public void boxingJava5() {
       Boolean booleanBox = true;
       Integer intBox = 3;
       // And so on for other types
    }
    
  • bir ilkel, bir sarmalayıcı bekleyen bir yönteme argüman olarak iletildiğinde:

    
    public void exampleOfAutoboxing() {
       long age = 3;
       setAge(age);
    }
    
    public void setAge(Long age) {
       this.age = age;
    }
    

// Kutudan çıkarma gerçekleşir:

  • sarmalayıcı sınıfın bir örneğini ilkel bir değişkene atadığımızda:

    
    // BEFORE Java 5:
    int intValue = new Integer(4).intValue();
    double doubleValue = new Double(2.3).doubleValue();
    char c = new Character((char) 3).charValue();
    boolean b = Boolean.TRUE.booleanValue();
    
    // And after JDK 5:
    int intValue = new Integer(4);
    double doubleValue = new Double(2.3);
    char c = new Character((char) 3);
    boolean b = Boolean.TRUE;
    
  • Aritmetik işlemler sırasında. İşlemler yalnızca ilkel türler için geçerlidir, bu nedenle ilkel türler için kutunun açılması gereklidir.

    
    // BEFORE Java 5:
    Integer integerBox1 = new Integer(1);
    Integer integerBox2 = new Integer(2);
    
    // A comparison used to require this:
    integerBox1.intValue() > integerBox2.intValue()
          
    // In Java 5
    integerBox1 > integerBox2
    
  • bir sarmalayıcı sınıfının bir örneğini karşılık gelen ilkel öğeyi alan bir yönteme geçirirken:

    
    public void exampleOfAutoboxing() {
       Long age = new Long(3);
       setAge(age);
    }
    
    public void setAge(long age) {
       this.age = age;
    }
    

22. Son anahtar kelime nedir ve nerede kullanılır?

Anahtar finalkelime değişkenlerde, metotlarda ve sınıflarda kullanılabilir.
  1. Bir son değişkenin değeri, başlatıldıktan sonra değiştirilemez.
  2. Son sınıf kısırdır :) Çocuk sahibi olamaz.
  3. Nihai bir yöntem, bir alt öğe tarafından geçersiz kılınamaz.
Üst düzey konuları ele aldık. Şimdi daha derine dalalım.

Nihai değişkenler

Java bize bir değişken bildirmek ve ona bir değer atamak için iki yol sunar:
  1. Bir değişken bildirebilir ve daha sonra başlatabilirsiniz.
  2. Bir değişken bildirebilir ve hemen bir değer atayabilirsiniz.
İşte son değişkenlerin bu kullanımlarını gösteren bir örnek:

public class FinalExample {

   // A static final variable that is immediately initialized:
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";

   // A final variable that is not initialized, but will only work if you
   // initialize it in the constructor:
   final long creationTime;

   public FinalExample() {
       this.creationTime = System.currentTimeMillis();
   }

   public static void main(String[] args) {
       FinalExample finalExample = new FinalExample();
       System.out.println(finalExample.creationTime);

       // The final FinalExample.FINAL_EXAMPLE_NAME field cannot be accessed
//    FinalExample.FINAL_EXAMPLE_NAME = "Not you're not!";

       // The final Config.creationTime field cannot be accessed
//    finalExample.creationTime = 1L;
   }
}

Son bir değişken sabit olarak kabul edilebilir mi?

Nihai değişkenlere yeni değerler atayamadığımız için bunlar sabit değişkenler gibi görünüyor. Ancak yalnızca ilk bakışta: Değişkenin veri türü ise immutable, evet, bu bir sabittir. Ancak veri tipi mutable, yani değiştirilebilir ise, bir değişken tarafından başvurulan nesnenin değerini değiştirmek için yöntemler ve değişkenler kullanmak mümkün olacaktır final. Bu nedenle sabit olarak adlandırılamaz. Aşağıdaki örnek, bazı son değişkenlerin gerçekten sabit olduğunu, diğerlerinin ise değiştirilebildikleri için sabit olmadığını göstermektedir.

public class FinalExample {

   // Immutable final variables
   final static String FINAL_EXAMPLE_NAME = "I'm likely the final one";
   final static Integer FINAL_EXAMPLE_COUNT  = 10;

   // Mutable final variables
   final List<String> addresses = new ArrayList();
   final StringBuilder finalStringBuilder = new StringBuilder("Constant?");
}

Yerel son değişkenler

Bir yöntem içinde bir finaldeğişken oluşturulduğunda buna değişken denir local final:

public class FinalExample {

   public static void main(String[] args) {
       // You can do this
       final int minAgeForDriveCar = 18;

       // Or you can do this, in a for-each loop:
       for (final String arg : args) {
           System.out.println(arg);
       }
   }

}
Geliştirilmiş bir for döngüsünde final anahtar sözcüğünü kullanabiliriz, çünkü döngünün her yinelemesinden sonra yeni bir değişken oluşturulur. Bunun normal bir for döngüsü için geçerli olmadığını, bu nedenle bir derleme zamanı hatası alacağımızı unutmayın.

// The final local j variable cannot be assigned
for (final int i = 0; i < args.length; i ++) {
   System.out.println(args[i]);
}

son sınıf

Olarak bildirilen bir sınıf finalgenişletilemez. Daha basit bir ifadeyle, başka hiçbir sınıf onu miras alamaz. finalJDK'daki bir sınıfın mükemmel bir örneği String'dir. Değişmez bir sınıf yaratmanın ilk adımı, onu olarak işaretlemek ve finalböylece genişletilmesini engellemektir:

public final class FinalExample {
}

// Compilation error!
class WantsToInheritFinalClass extends FinalExample {
}

Nihai yöntemler

Bir yöntem final olarak işaretlendiğinde buna son yöntem denir (mantıklı, değil mi?). Bir alt sınıfta nihai bir yöntem geçersiz kılınamaz. Bu arada, Object sınıfının wait() ve notify() yöntemleri nihaidir, dolayısıyla bunları geçersiz kılma olanağımız yoktur.

public class FinalExample {
   public final String generateAddress() {
       return "Some address";
   }
}

class ChildOfFinalExample extends FinalExample {

   // Compilation error!
   @Override
   public String generateAddress() {
       return "My OWN Address";
   }
}

Java'da final nasıl ve nerede kullanılır?

  • Bazı sınıf düzeyinde sabitleri tanımlamak için final anahtar sözcüğünü kullanın;
  • Değiştirilmesini istemediğiniz nesneler için nihai değişkenler oluşturun. Örneğin, günlük tutma amacıyla kullanabileceğimiz nesneye özgü özellikler.
  • Bir sınıfın uzatılmasını istemiyorsanız, onu final olarak işaretleyin.
  • Değişmez bir sınıf oluşturmanız gerekiyorsa, onu final yapmanız gerekir.
  • Bir yöntemin uygulanmasının alt öğelerinde değişmemesini istiyorsanız, yöntemi olarak işaretleyin final. Uygulamanın değişmediğinden emin olmak için bu çok önemlidir.

23. Değişken ve değişmez türler nelerdir?

değişken

Değişken nesneler, oluşturulduktan sonra durumu ve değişkenleri değiştirilebilen nesnelerdir. Değişken sınıflara örnek olarak StringBuilder ve StringBuffer verilebilir. Örnek:

public class MutableExample {

   private String address;

   public MutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // This setter can change the name field
   public void setAddress(String address) {
       this.address = address;
   }

   public static void main(String[] args) {

       MutableExample obj = new MutableExample("First address");
       System.out.println(obj.getAddress());

       // We are updating the name field, so this is a mutable object
       obj.setAddress("Updated address");
       System.out.println(obj.getAddress());
   }
}

değişmez

Değişmez nesneler, nesne oluşturulduktan sonra durumu ve değişkenleri değiştirilemeyen nesnelerdir. Bir HashMap için harika bir anahtar, sence de öyle değil mi? :) Örneğin, String, Integer, Double vb. Örnek:

// We'll make this class final so no one can change it
public final class ImmutableExample {

   private String address;

   ImmutableExample(String address) {
       this.address = address;
   }

   public String getAddress() {
       return address;
   }

   // We remove the setter

   public static void main(String[] args) {

       ImmutableExample obj = new ImmutableExample("Old address");
       System.out.println(obj.getAddress());

       // There is no way to change this field, so it is an immutable object
       // obj.setName("new address");
       // System.out.println(obj.getName());

   }
}
Bir sonraki bölümde koleksiyonlarla ilgili soru ve cevapları ele alıyoruz. GitHub'daki profilim Java Core için en iyi 50 iş görüşmesi sorusu ve yanıtı. Bölüm 2
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION