2015-04-09 19 views
16
i bu kod parçası için paketin dışında korumalı kurucular kullanmak Neden cant

: i sınıfı genişletilmiş halde hata alıyorum NedenNeden korunan kurucuları pakette kullanamıyorum?

package test; 
public class Check extends Example { 
    void m1() { 
    Example ex=new Example(); //compilation error 
    } 
} 
  1. package code; 
    public class Example{ 
        protected Example(){} 
        ... 
    } 
    

    Check.java?

EDIT açıklayınız:

Derleme hatası:

The constructor Example() is not visible 
+0

Derleme hatasını bilmek sorunun tanımlanmasında oldukça yararlı olabilir ... –

+0

Bir http://stackoverflow.com/questions/5150748/protected-constructor-and-accessibility adresinden bir üst sınıfın korumalı kurucusunu kullanabilirsiniz. Bir alt sınıfın yapıcısında ancak bir üst sınıf örneğini başka bir yerde örneklememek için. – redge

+0

Aşağıdakini aynı ya da daha az neden yapamazsınız public class Örnek {korunan int i;}/* başka bir pakette: */public class Uzantıları denetle Örnek {void m1 (Örnek ex) {ex.i = 2;} } ' – immibis

cevap

3

korunan değiştirici sadece pakette ve paketin dışında alt sınıflarında kullanılır. Example ex=new Example(); kullanarak bir nesne oluşturduğunuzda, varsayılan olarak üst sınıf yapıcıyı çağırır.

Ana sınıf kurucusu korunurken, derleme zamanı hatası alıyorsunuz. JLS 6.6.2.2 uygun örnek 2.

package Super; 

public class SuperConstructorCall { 

    protected SuperConstructorCall() { 
    } 

} 

package Child; 

import Super.SuperConstructorCall; 

public class ChildCall extends SuperConstructorCall 
{ 

    public static void main(String[] args) { 

     SuperConstructorCall s = new SuperConstructorCall(); // Compile time error saying SuperConstructorCall() has protected access in SuperConstructorCall 
    } 
} 

Örnek 2'de aşağıda gösterildiği gibi JSL 6.6.2.2 göre korunan kurucusunu çağırmak gerekir: Zaten Örnek korumalı yapıcısı kullandığınız Aslında

package Super; 

    public class SuperConstructorCall { 

    protected SuperConstructorCall() { 
    } 

} 

package Child; 

import Super.SuperConstructorCall; 

public class ChildCall extends SuperConstructorCall 
{ 

    public static void main(String[] args) { 

     SuperConstructorCall s = new SuperConstructorCall(){}; // This will work as the access is by an anonymous class instance creation expression 
    } 
} 
+1

Hayır' korumalı 'paketleri arasında kullanılabilir. Dersi uzatmak zorundasın. varsayılan paketin kapsamı *. ** Korumalı değiştirici, üyeye yalnızca kendi paketinde (paket-özelde olduğu gibi) ve buna ek olarak, sınıfının bir alt sınıfıyla başka bir pakette erişilebileceğini belirtir.** – TheLostMind

+2

Yine de cevap ikna edici değil, anlayacağımı anladım ki ana sınıf konstrüktörü yani> Örnek() korunur ama bildiğimiz gibi korumalı modiferleri paketin dışında kullanabilirsek, eğer dersi uzatırsak o zaman neden o kadar da yok ' Kurucular için burada çalışıyorum? – Abhilash28

+1

Neden bir üst sınıfın yapıcısını bağımsız olarak aramanız gerekiyor? Varsayılan erişim veya özel olmadıkları takdirde, süper sınıf yöntemlerine doğrudan erişebilirsiniz. –

3

Kontrol örtük bir yapıcı ve kapalı Örnek yapıcı görüşmesi var çünkü:

public Check() { 
    super(); 
} 
9

Genellikle protected yalnızca erişilebilir t demektir o aynı paketteki alt sınıflar veya sınıflar.

6.6.2.2. Qualified Access to a protected Constructor

Let C be the class in which a protected constructor is declared and let S be the innermost class in whose declaration the use of the protected constructor occurs. Then:

If the access is by a superclass constructor invocation super(...), or a qualified superclass constructor invocation E.super(...), where E is a Primary expression, then the access is permitted.

If the access is by an anonymous class instance creation expression new C(...){...}, or a qualified anonymous class instance creation expression E.new C(...){...}, where E is a Primary expression, then the access is permitted.

If the access is by a simple class instance creation expression new C(...), or a qualified class instance creation expression E.new C(...), where E is a Primary expression, or a method reference expression C :: new, where C is a ClassType, then the access is not permitted. A protected constructor can be accessed by a class instance creation expression (that does not declare an anonymous class) or a method reference expression only from within the package in which it is defined.

Örnek olarak, bu

public class Example extends Exception { 

    void method() { 
     Exception e = new Exception("Hello", null, false, false); 
    } 
} 

derleme değil ama bu

public class Example extends Exception { 

    Example() { 
     super("Hello", null, false, false); 
    } 
} 

yapar ve bu nedenle bu

yapar: Ancak burada JLS gelen yapıcıları için kurallar
public class Example { 

    void method() { 
     Exception e = new Exception("Hello", null, false, false) {}; 
    } 
} 

Yani kural Bunlar açık, ama onların arkasındaki sebepleri anladığımı söyleyemem!

+0

yeni bir şey öğrendi;) – kittu

+0

@kittu Öyle yaptım Ben böyle garip kısıtlamalar olduğunu anlayamadım. –

İlgili konular