İç sınıflar, dilin 1.1 sürümünde Java'ya eklendiğinde, başlangıçta 1.0 uyumlu koda dönüşüm olarak tanımlanıyorlardı. Bu dönüşümün bir örneğine bakarsanız, bir iç sınıfın gerçekte nasıl çalıştığını çok daha net hale getireceğini düşünüyorum.
Ian Roberts'ın cevabındaki kodu düşünün:
public class Foo {
int val;
public Foo(int v) { val = v; }
class Bar {
public void printVal() {
System.out.println(val);
}
}
public Bar createBar() {
return new Bar();
}
}
1.0 uyumlu koda dönüştürüldüğünde, bu iç sınıf Barşu şekilde olur:
class Foo$Bar {
private Foo this$0;
Foo$Bar(Foo outerThis) {
this.this$0 = outerThis;
}
public void printVal() {
System.out.println(this$0.val);
}
}
İç sınıf adı, benzersiz kılmak için dış sınıf adının önüne eklenmiştir. this$0Dış kısmın bir kopyasını tutan gizli bir özel üye eklenir this. Ve bu üyeyi başlatmak için gizli bir kurucu oluşturulur.
createBarYönteme bakarsanız , bunun gibi bir şeye dönüşür:
public Foo$Bar createBar() {
return new Foo$Bar(this);
}
Öyleyse aşağıdaki kodu çalıştırdığınızda ne olacağını görelim.
Foo f = new Foo(5);
Foo.Bar b = f.createBar();
b.printVal();
İlk olarak Foo, valüyeyi 5'e (yani f.val = 5) bir örneğini somutlaştırıyoruz .
Daha sonra f.createBar(), bir örneğini Foo$Barbaşlatan ve this$0üyeyi thisfrom createBar(ie b.this$0 = f) ' den geçirilen değerine başlatan çağırırız .
Son olarak , hangisinin b.printVal()yazdırmaya çalıştığını b.this$0.val, f.valhangisinin 5 olduğunu çağırıyoruz .
Şimdi bu, bir iç sınıfın düzenli bir örneğiydi. BarDışarıdan örnekleme yapılırken neler olduğuna bakalım Foo.
Foo f = new Foo(5);
Foo.Bar b = f.new Bar();
b.printVal();
1.0 dönüşümümüzü tekrar uyguladığımızda, bu ikinci satır şu şekilde olacaktır:
Foo$Bar b = new Foo$Bar(f);
Bu, f.createBar()aramayla neredeyse aynı . Yine bir örnek oluşturuyoruz Foo$Barve this$0üyeyi f'ye başlatıyoruz. Yani yine b.this$0 = f.
Aradığınızda Ve yine b.printVal(), yazdırdığınız b.thi$0.valolan f.val5 olan.
Hatırlanması gereken en önemli şey, iç sınıfın, thisdış sınıftan bir kopyasını tutan gizli bir üyeye sahip olmasıdır . Dış sınıfın içinden bir iç sınıfı başlattığınızda, bu sınıf geçerli değeriyle örtük olarak başlatılır this. İç sınıfı dış sınıfın dışından başlattığınızda, newanahtar sözcük üzerindeki önek aracılığıyla dış sınıfın hangi örneğinin kullanılacağını açıkça belirtirsiniz .