¿Puede un archivo java tener más de una clase?

Respuestas:

128

Sí puede. Sin embargo, solo puede haber una clase pública de nivel superior por .javaarchivo, y las clases públicas de nivel superior deben tener el mismo nombre que el archivo de origen.

El propósito de incluir múltiples clases en un archivo de origen es agrupar la funcionalidad de soporte relacionada (estructuras de datos internas, clases de soporte, etc.) junto con la clase pública principal. Tenga en cuenta que siempre está bien no hacer esto, el único efecto es en la legibilidad (o no) de su código.

Sean Reilly
fuente
1
Creo que es una buena idea hacerlo si desea mantener las clases adicionales en privado, para que puedan cambiarse completamente más adelante sin romper nada externo que accidentalmente use esas clases.
Erich Kitzmueller
3
Está ahí para compatibilidad con 1.0 (antes de clases anidadas). Es un gran error en el idioma. La mayor ventaja de usarlo es que los IDE tienen un manejo de archivos inútil.
Tom Hawtin - tackline
25
Una clase pública de nivel superior por archivo. Puede haber tantas clases internas públicas por archivo como desee.
erickson
@Tom, ¿qué parte crees que es un error, clases internas o múltiples clases de nivel superior por archivo?
finnw
@finnw Varias clases de nivel superior por archivo. Está tan mal. ¿Dónde está java.awt.LightweightDispatcher?
Tom Hawtin - tackline
17

Si desea implementar una clase pública, debe implementarla en un archivo con el mismo nombre que esa clase. Un solo archivo puede contener una clase pública y, opcionalmente, algunas privadas. Esto es útil si las clases solo las usa internamente la clase pública. Además, la clase pública también puede contener clases internas.

Aunque está bien tener una o más clases privadas en un solo archivo fuente, yo diría que es más legible usar clases internas y anónimas. Por ejemplo, se puede usar una clase anónima para definir una clase Comparator dentro de una clase pública:

  public static Comparator MyComparator = new Comparator() {
    public int compare(Object obj, Object anotherObj) {

    }
  };

La clase Comparator normalmente requerirá un archivo separado para ser pública. De esta forma se incluye con la clase que lo usa.

kgiannakakis
fuente
1
No es realmente una clase privada si está en el archivo sin modificador. No puedes tener una clase privada sin que sea una clase interna porque si la tuvieras, ¿quién podría usarla?
Bjorn
10

¡Sí, tantas como quieras!

PERO, solo una clase "pública" en cada archivo.

Alberto
fuente
6

Un archivo .java se denomina unidad de compilación. Cada unidad de compilación puede contener cualquier número de clases e interfaces de nivel superior. Si no hay tipos públicos de nivel superior, la unidad de compilación puede tener cualquier nombre.

//Multiple.java
//preceding package and import statements

class MyClass{...}
interface Service{...}
...
//No public classes or interfaces
...

Solo puede haber una clase / interfaz pública en una unidad de compilación. El cu se debe nombrar exactamente como este tipo público de nivel superior.

//Test.java
//named exactly as the public class Test
public class Test{...}
//!public class Operations{...}
interface Selector{...}
...
//Other non-public classes/interfaces

Puntos importantes sobre el método principal - parte 1

Parte 2

(Puntos sobre el número de clases y sus niveles de acceso cubiertos en la parte 2)

Utsav
fuente
5

Sí, puede crear más de una clase pública, pero debe ser una clase anidada.

public class first {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    }

    public class demo1
    {

        public class demo2
        {

        }
    }
}
Ganesh
fuente
4

Además de las clases internas anónimas, otro uso son las clases internas privadas que implementan una interfaz pública ( consulte este artículo ). La clase externa puede acceder a todos los campos y métodos privados de la clase interna.

Esto le permite crear dos clases estrechamente acopladas, como un modelo y su vista, sin exponer las implementaciones de ninguna. Otro ejemplo es una colección y sus iteradores.

Rico Apodaca
fuente
4

En general, debería haber una clase por archivo. Si organiza las cosas de esa manera, cuando busque una clase, sabrá que solo necesita buscar el archivo con ese nombre.

La excepción es cuando una clase se implementa mejor utilizando una o más clases auxiliares pequeñas. Por lo general, el código es más fácil de seguir cuando esas clases están presentes en el mismo archivo. Por ejemplo, es posible que necesite una pequeña clase contenedora 'tupla' para pasar algunos datos entre llamadas a métodos. Otro ejemplo son las clases de 'tarea' que implementan Runnable o Callable. Pueden ser tan pequeños que se combinan mejor con la clase padre que los crea y los llama.

Confusión
fuente
4

Sí 200% ,

Ejemplo:

class A {
 void methodDeclaration() { System.out.println("!!!"); }
 }
 class B {
 public static void main(String[] args) {
new A().methodDeclaration();
    }
 }
Shivanandam
fuente
2

Sí, puede, pero solo puede haber 1 clase pública dentro de cualquier paquete, ya que el compilador java crea el archivo .Class que tiene el mismo nombre que el nombre de la clase pública, por lo tanto, si hay más de 1 clase pública, sería difícil seleccionarlo. compilador que cuál debería ser el nombre del archivo de clase.

Meetu Choudhary
fuente
1

Varía ... Un ejemplo de ello serían las clases anónimas (las encontrará muchas cuando use detectores de eventos y demás).

laginimaineb
fuente
1

Creo que debería ser "sólo puede haber una clase pública de nivel superior NO ESTÁTICA por archivo .java". ¿No es así?

VacacionesCactus
fuente
Debería hacer esto como una pregunta en lugar de responder aquí.
Ashish Kumar
1

Si desea implementar un singleton, que es una clase que se ejecuta en su programa con solo una instancia en la memoria durante la ejecución de la aplicación, entonces una de las formas de implementar un singleton es anidar una clase estática privada dentro de una clase pública. . Entonces, la clase privada interna solo se instancia a sí misma cuando se llama a su método público para acceder a la instancia privada.

Consulte este artículo de wiki,

https://en.wikipedia.org/wiki/Singleton_pattern

El concepto toma un tiempo para asimilarlo.

chrismjh
fuente
1

En un archivo .java, solo puede haber una clase pública de nivel superior cuyo nombre sea el mismo que el del archivo, pero puede haber varias clases internas públicas que se pueden exportar a todos y acceder a los campos / métodos de la clase externa, por ejemplo : AlertDialog.Builder (modificado por 'public static') en AlertDialog (modificado por 'public')

Baoyang
fuente
1

Sí. Puede tener más de una clase en un archivo .Java. Pero has hecho público uno de ellos. y guarde el archivo .java con el mismo nombre que el nombre de la clase pública. cuando compile ese archivo .java, obtendrá archivos .class separados para cada clase definida en el archivo .java.

Aparte de esto, hay demasiados métodos para definir más de una clase en un archivo .java.

  1. utilizar el concepto de clases internas.
  2. Utilice el concepto de clases anónimas.
Gaurav Varshney
fuente
1

Si ! El archivo .java solo puede contener una clase pública.

Si desea que estas dos clases sean públicas, deben colocarse en dos archivos .java: A.java y B.java.

Rakesh Singh
fuente
2
No estoy seguro de que su respuesta agregue nada más de las otras 12 respuestas
vaya al
1

Sí, puede tener más de una clase dentro de un archivo .java. Como máximo, uno de ellos puede ser público. Los otros son paquetes privados. NO PUEDEN ser privados ni estar protegidos. Si uno es público, el archivo debe tener el nombre de esa clase. De lo contrario, se puede dar CUALQUIER COSA a ese archivo como su nombre.

Tener muchas clases dentro de un archivo significa que esas clases están en el mismo paquete. Entonces, cualquier otra clase que esté dentro de ese paquete pero no en ese archivo también puede usar esas clases. Además, cuando se importa ese paquete, la clase importadora también puede usarlos.

Para una investigación más detallada, puede visitar la publicación de mi blog aquí .

Merter Sualp
fuente
1
¡Bienvenido a Stack Overflow! Aprecio que haya expuesto información que aún no estaba cubierta aquí. También hiciste un buen trabajo al citar la publicación de tu blog mientras declaraste la propiedad e incluiste información relevante aquí. Si elige contribuir más a este sitio en el futuro (y espero que lo haga), asegúrese de considerar este artículo para asegurarse de que sus publicaciones continúen siendo bien recibidas si cita su blog.
4castle
0

Solo puede haber una clase pública de nivel superior en un archivo. El nombre de clase de esa clase pública debe ser el nombre del archivo. Puede tener muchas clases internas públicas.

Puede tener muchas clases en un solo archivo. Los límites para varios niveles de visibilidad de clase en un archivo son los siguientes:

Clases de nivel superior:
1 clase pública
0 clase privada
cualquier cantidad de clases predeterminadas / protegidas

Clases internas:
cualquier número de clases internas con cualquier visibilidad (predeterminada, privada, protegida, pública)

Por favor, corríjame si estoy equivocado.

Lakshmikant Deshpande
fuente
0

Sí puede. Sin embargo, solo puede haber una clase pública por archivo .java, ya que las clases públicas deben tener el mismo nombre que el archivo fuente.

usuario3077069
fuente