studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java class public-members

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 un ActionListener anónimo).

  • Considere cualquier clase no pública que le gustaría almacenar en un HashMap . hashCode() los públicos equals() y hashCode() en esa clase no pública, y la implementación de HashMap 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 de Connection 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); } }