
Java röportajı: OOP hakkında sorular
1. Java'nın özellikleri nelerdir?
Cevap:-
OOP kavramları:
- nesne yönelimi
- miras
- kapsülleme
- polimorfizm
- soyutlama
-
Ç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.
-
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.
- Multithreading: JVM
main thread
, . Bir programcı, Thread sınıfından türeterek veya arabirimi uygulayarak birden çok iş parçacığı oluşturabilirRunnable
.
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 bilinirsuperclass
ve 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 {
}
Animal
ve 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:- Yeni bir nesne oluşturulduğunda, program onu oluşturmak için uygun yapıcıyı kullanır.
- 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.
- Açıkça hiçbir oluşturucu oluşturulmamışsa, otomatik olarak boş bir oluşturucu oluşturulur.
- Bir yapıcı geçersiz kılınabilir.
- 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: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.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.protected
package-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 sunarprotected
.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.

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?

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
ArrayList
sı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 ekleradd(int index, Object o)
— Bu yöntem, belirli bir dizinde bir nesne ekleradd(Collection<Object> c)
— Bu yöntem, nesnelerin bir listesini ekleradd(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.
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öntemdirdefault
. Ö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öntemIterable
arayü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()
A
fooB()
foo()
B
16. Soyut metotlar ve sınıflar nelerdir?
Java'daabstract
ayrılmış bir kelimedir. Soyut sınıfları ve yöntemleri belirtmek için kullanılır. Öncelikle tanımlara ihtiyacımız var. abstract
Soyut 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
17. String, StringBuilder ve StringBuffer arasındaki fark nedir?
String
değ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. 
name = "pen";
Sabit dizi havuzu şöyle görünür: 
String
değerler bir yığında saklanır. Bir değer değiştirilirse, yeni değer eskisinin yerini alacaktır.String Buffer
senkronize edilir ve bu nedenle iş parçacığı güvenlidir.- İplik güvenliği nedeniyle performansı zayıftır.
StringBuffer name = “book”;


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).
- 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çinint
aşağıdakileri yazmalıyız:
int[] intArray = new int[100];
Bu sözdiziminden birkaç sonuç çıkarılabilir:
- Bir dizi bildirildiğinde türü bilinir. Tip biliniyorsa, dizideki her hücrenin boyutu da bilinir.
- Tüm dizinin boyutu biliniyor.
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.
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 isenull
, kutudan çıkarma sırasında bir NullPointerException
atı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?
Anahtarfinal
kelime değişkenlerde, metotlarda ve sınıflarda kullanılabilir.
- Bir son değişkenin değeri, başlatıldıktan sonra değiştirilemez.
- Son sınıf kısırdır :) Çocuk sahibi olamaz.
- Nihai bir yöntem, bir alt öğe tarafından geçersiz kılınamaz.
Nihai değişkenler
Java bize bir değişken bildirmek ve ona bir değer atamak için iki yol sunar:- Bir değişken bildirebilir ve daha sonra başlatabilirsiniz.
- Bir değişken bildirebilir ve hemen bir değer atayabilirsiniz.
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ü iseimmutable
, 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 birfinal
değ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ıffinal
genişletilemez. Daha basit bir ifadeyle, başka hiçbir sınıf onu miras alamaz. final
JDK'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 final
bö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
GO TO FULL VERSION