Un file java può avere più di una classe?


Risposte:


128

Sì, può. Tuttavia, può essere presente una sola classe pubblica di primo livello per .javafile e le classi pubbliche di primo livello devono avere lo stesso nome del file di origine.

Lo scopo dell'inclusione di più classi in un file sorgente è di raggruppare le funzionalità di supporto correlate (strutture dati interne, classi di supporto, ecc.) Insieme alla classe pubblica principale. Nota che è sempre OK non farlo: l'unico effetto è sulla leggibilità (o meno) del tuo codice.


1
Penso che sia una buona idea farlo se si desidera mantenere private quelle classi extra, in modo che possano essere completamente modificate in seguito senza rompere nulla al di fuori che utilizzi accidentalmente quelle classi.
Erich Kitzmüller,

3
È disponibile per la compatibilità 1.0 (prima delle classi annidate). È un grosso errore nella lingua. Il più grande vantaggio nell'usarlo è che gli IDE hanno una gestione dei file senza speranza.
Tom Hawtin - tackline

25
Una classe pubblica di primo livello per file. Possono esserci tutte le classi interne pubbliche per file che desideri.
erickson,

@ Tom, quale parte pensi sia un errore, classi interne o più classi di primo livello per file?
Finlandia

@finnw Più classi di primo livello per file. È solo così sbagliato. Dov'è java.awt.LightweightDispatcher?
Tom Hawtin - tackline

17

Se vuoi implementare una classe pubblica, devi implementarla in un file con lo stesso nome di quella classe. Un singolo file può contenere una classe pubblica e opzionalmente alcune classi private. Ciò è utile se le classi vengono utilizzate solo internamente dalla classe pubblica. Inoltre, la classe pubblica può contenere anche classi interne.

Anche se va bene avere una o più classi private in un unico file sorgente, direi che è più leggibile usare invece classi interne e anonime. Ad esempio si può usare una classe anonima per definire una classe Comparator all'interno di una classe pubblica:

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

    }
  };

La classe Comparator richiede normalmente un file separato per essere pubblica. In questo modo viene fornito in bundle con la classe che lo utilizza.


1
Non è realmente una classe privata se è nel file senza modificatore. Non puoi avere una lezione privata senza che sia una classe interna perché se lo facessi, chi potrebbe usarla?
Bjorn

10

Sì, quanti ne vuoi!

MA, solo una classe "pubblica" in ogni file.


6

Un file .java è chiamato unità di compilazione. Ogni unità di compilazione può contenere un numero qualsiasi di classi e interfacce di primo livello. Se non sono presenti tipi pubblici di primo livello, l'unità di compilazione può essere denominata in qualsiasi modo.

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

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

Può esserci solo una classe / interfaccia pubblica in un'unità di compilazione. Il cu deve essere denominato esattamente come questo tipo pubblico di primo livello.

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

Punti importanti sul metodo principale - parte 1

Parte 2

(Punti relativi al numero di classi e ai loro livelli di accesso trattati nella parte 2)


5

Sì, puoi creare più di una classe pubblica, ma deve essere una classe annidata.

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}

4

Oltre alle classi interne anonime, un altro uso sono le classi interne private che implementano un'interfaccia pubblica ( vedere questo articolo ). La classe esterna può accedere a tutti i campi e metodi privati ​​della classe interna.

Ciò consente di creare due classi strettamente collegate, come un modello e la relativa vista, senza esporre le implementazioni di nessuna delle due. Un altro esempio è una raccolta e i suoi iteratori.


4

In generale, dovrebbe esserci una classe per file. Se organizzi le cose in questo modo, quando cerchi una classe, sai che devi solo cercare il file con quel nome.

L'eccezione è quando una classe viene implementata al meglio utilizzando una o più classi di supporto piccole. Di solito, il codice è più semplice da seguire quando quelle classi sono presenti nello stesso file. Ad esempio, potresti aver bisogno di una piccola classe wrapper "tupla" per passare alcuni dati tra le chiamate di metodo. Un altro esempio sono le classi "task" che implementano Runnable o Callable. Possono essere così piccoli da essere combinati al meglio con la classe genitore che li crea e li chiama.


4

Sì 200% ,

Esempio:

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

2

Sì, può, ma può esserci solo 1 classe pubblica all'interno di qualsiasi pacchetto poiché il compilatore java crea il file .Class che ha lo stesso nome del nome della classe pubblica, quindi se sono più di 1 classe pubblica sarebbe difficile selezionarla compilatore che dovrebbe essere il nome del file Class.



1

Penso che dovrebbe essere "ci può essere solo una classe pubblica di primo livello NON STATICO per file .java". Non è vero?


Dovresti porre questa domanda come una domanda piuttosto che rispondere qui.
Ashish Kumar dal

1

Se vuoi implementare un singleton, ovvero una classe che viene eseguita nel tuo programma con una sola istanza in memoria durante l'esecuzione dell'applicazione, allora uno dei modi per implementare un singleton è annidare una classe statica privata all'interno di una classe pubblica . Quindi la classe privata interna crea un'istanza solo quando viene chiamato il suo metodo pubblico per accedere all'istanza privata.

Dai un'occhiata a questo articolo wiki,

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

Il concetto richiede un po 'di tempo per masticare.


1

In un file .java, può esserci solo una classe pubblica di primo livello il cui nome è lo stesso del file, ma potrebbero esserci diverse classi interne pubbliche che possono essere esportate a tutti e accedere ai campi / metodi della classe esterna, ad esempio : AlertDialog.Builder (modificato da 'public static') in AlertDialog (modificato da 'public')


1

Sì Puoi avere più di una Classe in un file .Java. Ma ne hai reso pubblico uno. e salva il file .java con lo stesso nome del nome della classe pubblica. quando compilerai quel file .java, otterrai file .class separati per ogni classe definita nel file .java.

Oltre a questo ci sono troppi metodi per definire più di una classe in un file .java.

  1. utilizzare il concetto di classi interne.
  2. Usa il concetto di classi anonime.

1

Sì ! Il file .java può contenere solo una classe pubblica.

Se vuoi che queste due classi siano pubbliche, devono essere inserite in due file .java: A.java e B.java.


2
Non sono sicuro che la tua risposta aggiunga qualcos'altro dalle altre 12 risposte
vai il

1

Sì, puoi avere più di una classe all'interno di un file .java. Al massimo uno di loro può essere pubblico. Gli altri sono privati ​​del pacchetto. NON POSSONO essere privati ​​o protetti. Se uno è pubblico, il file deve avere il nome di quella classe. Altrimenti QUALCHE COSA può essere data a quel file come nome.

Avere molte classi all'interno di un file significa che quelle classi sono nello stesso pacchetto. Quindi anche qualsiasi altra classe che si trova all'interno di quel pacchetto ma non in quel file può usare quelle classi. Inoltre, quando quel pacchetto viene importato, anche la classe di importazione può utilizzarli.

Per un'indagine più dettagliata, puoi visitare il mio post sul blog qui .


1
Benvenuto in Stack Overflow! Apprezzo che tu abbia esposto informazioni che non erano già state trattate qui. Hai anche fatto un buon lavoro nel citare il tuo post sul blog mentre dichiari la proprietà e includi le informazioni pertinenti qui. Se scegli di contribuire maggiormente a questo sito in futuro (e spero che tu lo faccia), assicurati di considerare questo articolo per assicurarti che i tuoi post continuino ad essere ben accolti se citi il ​​tuo blog.
4castle

0

In un file può essere presente una sola classe pubblica di primo livello . Il nome della classe di quella classe pubblica dovrebbe essere il nome del file. Può avere molte classi interne pubbliche.

Puoi avere molte classi in un unico file. I limiti per i vari livelli di visibilità della classe in un file sono i seguenti:

Classi di primo livello:
1 classe pubblica
0 classe privata
qualsiasi numero di classi predefinite / protette

Classi interne:
qualsiasi numero di classi interne con qualsiasi visibilità (predefinita, privata, protetta, pubblica)

Perfavore, correggimi se sbaglio.


0

Sì, può. Tuttavia, può esserci solo una classe pubblica per file .java, poiché le classi pubbliche devono avere lo stesso nome del file di origine.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.