2017-04-24 60 views
25

Aşağıdaki çıktıyı anlayamıyorum.Java devralma alanları

çıktı 10 neden

Ben çizgi A a = new B() sınıf B yeni bir örneğini oluşturur düşünüyorum bilmiyor, ben bu gibi çalışır Neden sonuç 20

class A { 
    int i = 10; 
} 

class B extends A { 
    int i = 20; 
} 

public class MainClass { 
    public static void main(String[] args) { 
     A a = new B(); 

     System.out.println(a.i); 
    } 
} 

olması gerektiğini düşünüyorum .. lütfen açıklamak.

+11

Bu değeri geçersiz değildir:

System.out.println(((B)a).i); 

Sana 1 değişkeni kullanmaya ihtiyacım var Buradayım, –

+2

gölgelisiniz. http://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java –

+0

Polimorfizm, yöntemler için değil, alanlar için işe yaramıyor. 'A' türü için bir değişken kullandınız, ben de 'i' türünde bir kopyasını kullandınız. Alanları ararken, nesnenin sınıfı değil, önemli olan değişkenin türüdür. –

cevap

30

Öncelikle Hiding Fields (vurgu eklenmiştir) bir sınıf içinde

, üst sınıf bir alan olarak aynı ada sahip bir alana bakın onların türleridir bile üst sınıfının saha gizler aslında ın'B arkasında lar i' A sakladığını beri başka deyişle farklı

, bu "miras" değilve A başvuru nesnesini kullanıyorsunuz, böylece alanlarını alıyorsunuz. B b = new B() yaptıysanız, beklendiği gibi 20 görürsünüz.


Gerçek geçersiz kılma beklerseniz, yöntemleri kullanmayı deneyin. Gerçekten, aynı anda her iki bakın bu örneği görmek istiyorsanız

class A { 
    public int get() { 
     return 10; 
    } 
} 

class B extends A { 
    @Override 
    public int get() { 
     return 20; 
    } 
} 


A a = new B(); 
System.out.print(a.get()); // 20 

bakınız.

class A { 
    int i = 10; 
} 

class B extends A { 
    int i = 20; 

    @Override 
    public String toString() { 
     return String.format("super: %d; this: %d", super.i, this.i); 
    } 
} 

Ve

A a = new B(); 
System.out.print(a); // super: 10; this: 20 
1

Üye değişkeni i zaten class A adresinde tanımlanmıştır. aşağıda gösterildiği gibi

Aradığınız şeyi elde etmek için, class B değiştirin:

class B extends A { 
    public B() { 
     i = 20; 
    } 
} 
20

java size bir örnek değişkeni geçersiz kılamaz. Aldığınız çıktı bekleniyor. Java'da, örnek yöntemlerini ve örnek değişkenleri yalnızca geçersiz kılabilirsiniz.

20 çıktı olarak isterseniz, bu örnek değişkenleri üzerinden getter yöntemleri kullanabilirsiniz.

class A { 
    int i = 10; 

    int getI() { 
     return i; 
    } 
} 

class B extends A { 
    int i = 20; 

    int getI() { 
     return i; 
    } 
} 

public class MainClass { 
    public static void main(String[] args) { 
     A a = new B(); 

     System.out.println(a.getI()); 
    } 
} 
10

Polimorfizm Java.Evaluating Değişkenler kararda nedenle her zaman temel sınıf değişkenleri erişilir derleme zamanında alınır alanlar için geçerli değildir.

4

size 2 değişkenleri tanımlamak Çünkü: alt sınıf B, biri ve üst sınıf A aynı adla bir.Bir B için A döküm Eğer

A a = new B(); 
a.i; // refers to A.i 

, bu B.i erişecek:

class A { 
    int i; 

    public A() { 
     i = 10; 
    } 
} 

class B extends A { 
    public B() { 
     i = 20; 
    } 
} 

public class MainClass { 
    public static void main(String[] args) { 
     A a = new B(); 

     System.out.println(a.i); // will print 20 
}