2010-02-03 14 views
5

La misma pregunta en código:¿Hay alguna diferencia entre el nivel de acceso predeterminado (paquete) y el público de los métodos en clase con el nivel de acceso predeterminado (paquete)?

class Foo { 

    int getIntProperty() { ... } 

    CustomObject getObjectProperty() { ... } 

    void setIntProperty (int i) { ... } 

    void setObjectProperty (CustomObject obj) { ... } 

    //any other methods with default access level  
} 

VS

class Foo { 

    public int getIntProperty() { ... } 

    public CustomObject getObjectProperty() { ... } 

    public void setIntProperty (int i) { ... } 

    public void setObjectProperty (CustomObject obj) { ... } 

    //any other methods with public access level 
} 

Respuesta

5

hay una diferencia cuando subclase Foo:

public class Bar extends Foo { 

} 

continuación, intente en otro paquete:

new Bar().getIntProperty() 

se compilará en el segundo de sus ejemplos (todos los métodos públicos) pero no a el primero (todos los métodos de acceso predeterminado)

+0

Nota: Bar está en el mismo paquete que Foo – idrosid

+0

Primera respuesta real – Roman

0

las interfaces de aplicación

Sólo puedo imaginar la clase de acceso predeterminado implementa alguna de las interfaces. Luego necesitará los métodos de acceso público para implementarlo (a continuación, se accede a su clase de acceso predeterminada fuera del paquete, a través de la interfaz).

Como cualquier implementación privada/protegida/anónima de una interfaz.

Java Language tiene que soportarlo.

Editar

Imagínese crear una instancia y pasarlo sobre una clase de afuera (como un objeto).

No estoy seguro sobre el control de acceso de reflejo, pero puede ser que la clase externa no pueda acceder mediante reflexión (fuera del paquete) a los métodos predeterminados. Y si son públicos, puedes.

+0

Me imagino que su clase no implementa ninguna interfaz, como se puede ver claramente en el código. – danben

+0

Supongo que no :) pero el código es solo un ejemplo y estaba buscando una diferencia. De todos modos, las respuestas referidas a subclases parecen mucho más prometedoras. – helios

0

Sí & no.

No hay diferencia significativa, al menos en lo que se refiere a otras clases que acceden al método, en el ejemplo que usted proporciona. Pero a veces hay que ...

public interface Bar { 
    CustomObject getObjectProperty(); 
} 

Y Foo implements Bar, en el que es necesario el caso del público, incluso dentro de un paquete de Foo-privada.

2

De http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html parece que los miembros no configurados públicos, en el primer ejemplo, no serían visibles para las subclases de Foo, mientras que los miembros configurados públicos, en el segundo ejemplo, serían visibles para las subclases de Foo.

+0

¿Cómo puedo crear la subclase de Foo en otro paquete? – Roman

+0

Ha - ¡buen punto! Foo no sería visible fuera de su propio paquete. –

+0

No puede crear una subclase de Foo en otro paquete o crear una instancia de este en otro paquete porque no sería "visto" por ese paquete debido a su nivel de acceso predeterminado. – Jon

0

Este es un ejemplo de clase de nivel de paquete con el método de nivel público() para garantizar el nivel de acceso no puede ser más restrictivo que el método reemplazado.

Suponer que el nivel público superclase tiene métodos de nivel de acceso público. y la subclase de nivel de paquete desea heredar esa superclase, entonces también necesita métodos de nivel público. por ejemplo,

public class A { public void method() } 

class B extends A { public void method() } 
Cuestiones relacionadas