2009-08-28 23 views
12

Bu kodun iki sorusu varKafa karıştırıcı "özel bir yöntemi geçersiz kıl"

public class Override { 
    private void f() { 
     System.out.println("private f()"); 
    } 
    public static void main(String[] args) { 
     Override po = new Derived(); 
     po.f(); 
    } 
} 

class Derived extends Override { 
    public void f() { 
     System.out.println("public f()"); 
    } 
} 

/* 
* Output: private f() 
*/// :~ 

1) Fonksiyon f, Override po referansında nasıl görülebilir;

2) Neden çıktı "private f()"

+0

Fakat bir alt sınıf nesnesiyle yapılan bir başvuru, bir süper sınıfın özel bir yöntemini nasıl arayabilir? Bu bir hata mı ??? –

+0

Hayır, bu bir hata değil, tam olarak çalışması gerektiği gibi. – Jesper

+0

Ancak bu miras kuralları ve geç bağlayıcı kurallar ihlal değil mi? –

cevap

24
  1. main yöntem olup, sınıf Override içinde olmasıdır.

  2. Derse Derived yılında değil bastıran metod f, hiçbir polimorfizmi yoktur. po değişkeninin türü Override olup Override sınıfından f yöntemini alır. sınıf Override yöntem f tüm sınıf Derived görünür değildir

not edin.sınıfındaki f yöntemi, süper sınıfta f yöntemiyle hiçbir ilgisi olmayan farklı bir yöntemdir. Sen nesne kapsamı kurallara göre, sınıfın özel üyeleri ilk olarak kabul edilir çünkü türetilmiş ve onun o özel f başvuran Geçersiz Kılma kapsamında yazılı olarak bile geçersiz kılmak kendi yöntemini erişen

+0

Ama bağlama çalışma zamanında yapıldığında po türetilmiş sınıfın nesnesine sahip olacak, böylece özel bir süper sınıf yöntemini nasıl arayabileceğine. –

+3

Kodunuzun hiçbir yerinde, bir üst sınıfın özel yöntemine çağrı yoktur. Po.f() işlevini çağırdığınızda, geçersiz kılma türü po geçersiz olduğu için Geçersiz Kıl'ın adı verilir. Hiçbir geçersizleme olmadığı için, dinamik bir bağ yoktur (polimorfizm yok) - Java, çalışma zamanında türe bakmaz. – Jesper

2
Override po = new Derived(); 
po.f(); 

ve Özel olarak, Türetilmiş sınıfta geçersiz kılınmamış olduğundan, yalnızca yöntem imzası aynı ise geçersiz kılınır.

Derived po = new Derived(); 
po.f(); 

Thsi en Türetilmiş çağrısı yapacağı doğru kod f

+0

Soru, Java ile ilgili, C# değil. Java'da 'sanal' yoktur. – Jesper

+0

Yorum için teşekkürler, ben de cevapladı. –

0

yöntemin geçersiz kılma üç conditions.child sınıf zorunluluk onun süper class.But aynı ad ve parametreler ve döndürülen değeri vardır sahiptir hem eğer ! geçersiz kılma yok bu yüzden parametre ve döndürülen değer iki yöntem farklı yöntem olsa bile farklılık gösteren ok böyle:!

public class Parent { 
      public int addV(int a,int b){ 
     int s; 
     s = a + b; 
     return s; 
    } 
} 

class Child extends Parent{ 
    public void addV(){ 
     //do...something 
    } 
} 

Eclipse hata konuşmayacağız! çünkü sınıftaki addV yöntemi Child sınıfında addV yöntemiyle farklıdır.

+0

Sadece yöntemin adı ve yayın listesi tam olarak aynı olmalıdır. Çocuğun geri dönüş değeri ebeveynin dönüş değeri alt sınıfı olabilir. Ve atladığınız iki kural daha vardır. Çocukta yöntem en azından ebeveynin sahip olduğu kadar erişilebilir olmalıdır. Ve alt sınıf, yeni kontrol edilmiş istisna veya daha geniş olanları atamaz. – pkkoniec

İlgili konular