2012-01-27 5 views
6

gelen yöntem miras yöntemin görünürlüğünü azaltmak olamaz bu derleyici hata var:ebeveynden

You cannot reduce the visibility of a inherited method.

Aşağıdaki kodu var

İşte
class Parent {  
    public void func() { 
     System.out.println("in Parent"); 
    } 
} 

public class TestClass extends Parent {  
    public static void main(String args[]) { 
     parent obj=new TestClass(); 
     obj.addTest(); 
    } 

    private void func() { 
     System.out.println("in child");   
    } 
} 

üst sınıf vardır kamu ve tarafından geçersiz func() yöntem özel alt sınıf TestClass. Şimdi derleyici görünmezliği azaltamayacağım hatasını atar. Teknik olarak söylemek gerekirse, TestClass nesnesini üst nesne türüne atama yaptığımda, func() yöntemi geçersiz kıldığından, TestClass'ın func() işlevi her zaman çağrılacak, o zaman neden görünürlükle ilgilenmeliyiz? Bu hatanın arkasındaki sebep nedir? Birisi bana açık bir şekilde açıklayabilir mi?

cevap

20

alt sınıf void func() yöntemi için private görünürlüğünü vardır, ama üst sınıf görünürlük public sahiptir çünkü. Bu verseydiniz zamanında patlayacağını kodunuzu derlemek için izin verildi ise

:

parent p = new TestClass(); 
p.func(); // boom - func is public in parent, but TestClass's impl is private, so no access would be allowed 

bu, yapmak "düzeltmek" için alt sınıf en func yöntem public:

public class TestClass extends parent { 
    ... 
    public void func() { // give it public visibility 
     System.out.println("in child");   
    } 
} 


Ve standart adlandırma kuralları kullanın lütfen; Bu durumda "sınıfları büyük harfle başlamalıdır" - yani Parent değil parent

+0

Teşekkürler Bohemain. Sebebi var. Adlandırma standartlarını belirttiğiniz için teşekkür ederiz. – Mojoy

+0

Merhaba .. Bu, süper sınıfta kamuya açık bir yöntem için neden çocuk sınıfında korumalı bir değişiklik yapamadığımı düşünmemi sağlıyor? Korunan değiştirici herhangi bir paketin paket ve alt türleri içinde erişilebilir beri! – Mojoy

+0

'korumalı' yöntemleri diğer rasgele sınıflar tarafından görülemez, ancak üstyazının' public' yöntemi de aynı nedenden dolayı geçerlidir. * Görünürlükteki herhangi bir * azalma bir hatadır. – Bohemian

11

section 8.4.8.3 of the Java Language specification Gönderen:

The access modifier (§6.6) of an overriding or hiding method must provide at least as much access as the overridden or hidden method, or a compile-time error occurs. In more detail:

  • If the overridden or hidden method is public, then the overriding or hiding method must be public; otherwise, a compile-time error occurs.
  • If the overridden or hidden method is protected, then the overriding or hiding method must be protected or public; otherwise, a compile-time error occurs.
  • If the overridden or hidden method has default (package) access, then the overriding or hiding method must not be private; otherwise, a compile-time error occurs.

Note that a private method cannot be hidden or overridden in the technical sense of those terms. This means that a subclass can declare a method with the same signature as a private method in one of its superclasses, and there is no requirement that the return type or throws clause of such a method bear any relationship to those of the private method in the superclass.

Sonuçta, sadece bir private yöntemi beklediğiniz içinde kod tarafından çağrılacak Aynı sınıf - eğer bir kamu yöntemini geçersiz kılmasından dolayı çağrılmış olsaydı, bu oldukça kafa karıştırıcı olurdu.

2

Bu mantıklı yapmak mümkün değil, bunu düşünmek durumunda ..

nedeni ebeveyn ise bir (yani siz ana türü kullanabilirsiniz olarak etrafında alt nesne geçebileceği olmasıdır TestClass örneğine başvuru tipi).

örn. Orada

parent p = new TestClass(); 

belki bu yöntemi parent türlerini kullanan ve aramaları başka bir kod:

ör izin vermeyerek, bu gerekli değildir sağlıyor -

public static void aMethod(parent aParent){ 
    p.func(); 
} 

Eğer çalışma zamanı istisnası çeşit atmak zorunda kalacak sonra aMethod(p) çağıran yöntemin görünürlüğünü azaltmak mümkün olsaydı.

İlgili konular