java - para - manual de programacion android pdf
¿Por qué puedo tener un miembro público en una clase no pública? (4)
class MyClass
{
public static final int num=90;
}
- ¿Por qué se me permite crear un miembro público en una clase no pública?
- ¿Hay otra forma de acceder a este miembro que no conozca (excepto a través del nombre de la clase)?
Como su pregunta fue sobre los members , abordaré ambos campos y métodos (no estático; la respuesta de Anthony Accioly toca otro buen caso de uso, que también incluye campos estáticos).
Si bien en muchas situaciones esto es solo una consecuencia ambigua de la gramática del idioma (en particular: campos públicos en clases no públicas, como en su fragmento de ejemplo), existen muy buenas razones para la necesidad de poder usar métodos públicos en no-idiomas. Clases públicas.
Ampliando Mik378''s respuesta Mik378''s , considere, por ejemplo, lo siguiente (ejemplo elaborado):
import ...;
class BleebleAscendingComparator implements Comparator<Bleeble> {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
class BleebleDescendingComparator implements Comparator<Bleeble> {
@Override public int compare (Bleeble o1, Bleeble o2) { ... }
}
public class BleebleView {
public enum SortMode { ASC, DESC };
public Comparator<Bleeble> getDisplayOrderComparator (SortMode mode) {
if (mode == SortMode.ASC)
return new BleebleAscendingComparator();
else
return new BleebleDescendingComparator();
}
}
No puede crear una instancia de una de esas implementaciones de Comparator
directamente fuera de ese contexto, pero deben anular los métodos públicos de Comparator
, y su funcionalidad es accesible a través de una interfaz de Comparator
.
Este mismo razonamiento se aplica, por ejemplo, a clases internas private
o protected
. Si no pudiera declarar los métodos public
, no tendría forma de anular public
métodos public
de interfaces que heredan o las clases que extienden.
Ejemplos prácticos:
Usted usa esto cada vez que invalida un método público en una clase interna anónima (por ejemplo, cada vez que invalida
public void actionPerformed
en unActionListener
anónimo).Considere cualquier clase no pública que le gustaría almacenar en un
HashMap
.hashCode()
los públicosequals()
yhashCode()
en esa clase no pública, y la implementación deHashMap
puede acceder a ellos independientemente del hecho de que la clase no sea pública.El
public toString()
menudo anulado es otro ejemplo común de un miembro público de una clase potencialmente no pública.Un ejemplo más complejo es el uso de
java.sql.Driver
en java.sql.DriverManager (en general, los diseños de tipo de fábrica hacen un uso intensivo de este concepto): una implementación del controlador SQL puede no hacer públicas las clases de implementación (por ejemplo, Oracle el controlador produce objetos deConnection
no públicos).Mucho más ... si te fijas en ejemplos de esto, ¡te sorprenderás de lo común que es!
Cuando declara una variable public
, esencialmente se convierte en exactamente eso; Se puede ver a lo largo de todo su programa, sin ningún tipo de captadores / preparadores especiales. La clase no necesariamente tiene que ser public
para que sus miembros también sean públicos.
Recuerde, en Java solo puede tener 1 clase pública por unidad de compilación (archivo. java
), y esa clase pública debe tener el mismo nombre que la unidad de compilación. Aparte de eso, no "posee" la propiedad de la palabra clave public.
El hecho de que haya declarado num
como public
y static
permite decir System.out.println (MyClass.num). El atributo public
permite obtener la variable num
directamente. Por lo tanto, no tiene que crear un método para devolver num
para usted. Porque es público, también se puede decir.
MyClass mc = new MyClass();
System.out.println(mc.num);
Sin embargo, dado que también agregó la declaración static
, solo debe acceder a ella a través del nombre de la clase, es decir, MyClass.num
Punto para llevar a casa: las variables públicas pueden existir en cualquier tipo de clase, y te permiten acceder a ellas sin la necesidad de captadores y definidores. Las clases públicas, sin embargo, no son las únicas clases que pueden poseer variables públicas.
Cuando un método public
que pertenece a una clase adjunta A
devuelve una referencia (referencia public
supertipo, como una interfaz) a su clase interna B
con alcance predeterminado , el cliente externo (fuera del paquete de A) solo puede llamar a los métodos de B
pero puede t CREARSE ejemplares nuevos de B
Si los métodos de B
no fueran public
, el cliente externo no podría alcanzarlos y, lo que es peor, causaría un error de compilación, ya que no implementa bien su interfaz.
Este modelado podría ser útil en un cierto contexto, para mejorar el diseño del código.
No olvide que las clases con acceso default
pueden ser subclasificadas por clases public
en el mismo paquete.
package package1;
class MyDefaultClass {
public static final int MY_CONSTANT = 0xCAFEBABE;
}
public class PublicExporter extends MyDefaultClass {
}
Ahora la clase public
actúa como un puente, y puede consumir miembros public
MyDefaultClass
de otros paquetes.
package package2;
import package1.PublicExporter;
public class Consumer {
public static void main(String[] args) {
System.out.printf("%x/n", PublicExporter.MY_CONSTANT);
}
}
Los consumidores pueden incluso importar miembros estáticos:
import static package1.PublicExporter.MY_CONSTANT;
public class Consumer {
public static void main(String[] args) {
System.out.printf("%x/n", MY_CONSTANT);
}
}