Kann eine Java-Datei mehr als eine Klasse haben?

Antworten:

128

Ja, kann es. Es kann jedoch nur eine öffentliche Klasse der obersten Ebene pro Klasse geben.java Datei geben, und öffentliche Klassen der obersten Ebene müssen denselben Namen wie die Quelldatei haben.

Der Zweck des Einfügens mehrerer Klassen in eine Quelldatei besteht darin, verwandte Supportfunktionen (interne Datenstrukturen, Supportklassen usw.) zusammen mit der öffentlichen Hauptklasse zu bündeln. Beachten Sie, dass es immer in Ordnung ist, dies nicht zu tun. Der einzige Effekt besteht in der Lesbarkeit (oder nicht) Ihres Codes.

Sean Reilly
quelle
1
Ich denke, es ist eine gute Idee, dies zu tun, wenn Sie diese zusätzlichen Klassen privat halten möchten, damit sie später vollständig geändert werden können, ohne irgendetwas außerhalb zu beschädigen, das diese Klassen versehentlich verwendet.
Erich Kitzmüller
3
Es ist dort für 1.0-Kompatibilität (vor verschachtelten Klassen). Es ist ein großer Fehler in der Sprache. Der größte Vorteil bei der Verwendung ist, dass IDEs eine hoffnungslose Dateiverwaltung haben.
Tom Hawtin - Tackline
25
Eine öffentliche Klasse der obersten Ebene pro Datei. Es können so viele öffentliche innere Klassen pro Datei vorhanden sein, wie Sie möchten.
erickson
@ Tom, welcher Teil ist Ihrer Meinung nach ein Fehler, innere Klassen oder mehrere Klassen der obersten Ebene pro Datei?
Finnw
@finnw Mehrere Klassen der obersten Ebene pro Datei. Es ist einfach so falsch. Wo liegt java.awt.LightweightDispatcher?
Tom Hawtin - Tackline
17

Wenn Sie eine öffentliche Klasse implementieren möchten, müssen Sie sie in einer Datei mit demselben Namen wie diese Klasse implementieren. Eine einzelne Datei kann eine öffentliche und optional einige private Klassen enthalten. Dies ist nützlich, wenn die Klassen nur intern von der öffentlichen Klasse verwendet werden. Zusätzlich kann die öffentliche Klasse auch innere Klassen enthalten.

Obwohl es in Ordnung ist, eine oder mehrere private Klassen in einer einzigen Quelldatei zu haben, würde ich sagen, dass es besser lesbar ist, stattdessen innere und anonyme Klassen zu verwenden. Beispielsweise kann eine anonyme Klasse verwendet werden, um eine Comparator-Klasse innerhalb einer öffentlichen Klasse zu definieren:

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

    }
  };

Die Comparator-Klasse benötigt normalerweise eine separate Datei, um öffentlich zu sein. Auf diese Weise wird es mit der Klasse gebündelt, die es verwendet.

kgiannakakis
quelle
1
Es ist nicht wirklich eine private Klasse, wenn es in der Datei ohne Modifikator ist. Sie können keine Privatklasse haben , ohne dass es sich um eine innere Klasse handelt, denn wenn ja, wer könnte sie nutzen?
Björn
10

Ja, so viele wie du willst!

ABER nur eine "öffentliche" Klasse in jeder Datei.

Alberto
quelle
6

Eine Java-Datei wird als Kompilierungseinheit bezeichnet. Jede Kompilierungseinheit kann eine beliebige Anzahl von Klassen und Schnittstellen der obersten Ebene enthalten. Wenn es keine öffentlichen Top-Level-Typen gibt, kann die Kompilierungseinheit beliebig benannt werden.

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

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

Es kann nur eine öffentliche Klasse / Schnittstelle in einer Kompilierungseinheit geben. Die cu muss genau so benannt sein wie dieser öffentliche Top-Level-Typ.

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

Wichtige Punkte zur Hauptmethode - Teil 1

Teil 2

(Punkte bezüglich der Anzahl der Klassen und ihrer Zugangsstufen in Teil 2)

Utsav
quelle
5

Ja, Sie können mehr als eine öffentliche Klasse erstellen, es muss sich jedoch um eine verschachtelte Klasse handeln.

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}
Ganesh
quelle
4

Neben anonymen inneren Klassen werden auch private innere Klassen verwendet, die eine öffentliche Schnittstelle implementieren ( siehe diesen Artikel) ). Die äußere Klasse kann auf alle privaten Felder und Methoden der inneren Klasse zugreifen.

Auf diese Weise können Sie zwei eng gekoppelte Klassen erstellen, z. B. ein Modell und seine Ansicht, ohne die Implementierungen einer der beiden Klassen verfügbar zu machen. Ein weiteres Beispiel ist eine Sammlung und ihre Iteratoren.

Reiches Apodaca
quelle
4

Im Allgemeinen sollte es eine Klasse pro Datei geben. Wenn Sie die Dinge so organisieren, wissen Sie bei der Suche nach einer Klasse, dass Sie nur nach der Datei mit diesem Namen suchen müssen.

Die Ausnahme ist, wenn eine Klasse am besten mit einer oder mehreren kleinen Hilfsklassen implementiert wird. Normalerweise ist der Code am einfachsten zu befolgen, wenn diese Klassen in derselben Datei vorhanden sind. Beispielsweise benötigen Sie möglicherweise eine kleine Tupel-Wrapper-Klasse, um einige Daten zwischen Methodenaufrufen zu übergeben. Ein weiteres Beispiel sind Aufgabenklassen, die Runnable oder Callable implementieren. Sie können so klein sein, dass sie am besten mit der übergeordneten Klasse kombiniert werden, die sie erstellt und aufruft.

Verwirrtheit
quelle
4

Ja 200% ,

Beispiel:

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

Ja, aber es kann nur eine öffentliche Klasse in einem Paket geben, da der Java-Compiler die .Class-Datei erstellt, die denselben Namen wie der öffentliche Klassenname hat. Wenn mehr als eine öffentliche Klasse vorhanden ist, ist die Auswahl schwierig Compiler, wie der Name der Klassendatei lauten soll.

Meetu Choudhary
quelle
1

Variiert ... Ein solches Beispiel wäre eine anonyme Klasse (bei der Verwendung von Ereignis-Listenern und dergleichen werden Sie häufig auf diese stoßen).

Laginimaineb
quelle
1

Ich denke, es sollte "es kann nur eine NICHT-STATISCHE öffentliche Klasse der obersten Ebene pro Java-Datei geben" sein. Ist es nicht?

HolidayCactus
quelle
Sie sollten dies als Frage stellen, anstatt hier zu antworten.
Ashish Kumar
1

Wenn Sie einen Singleton implementieren möchten, dh eine Klasse, die in Ihrem Programm mit nur einer Instanz im Speicher während der Ausführung der Anwendung ausgeführt wird, besteht eine der Möglichkeiten zum Implementieren eines Singletons darin, eine private statische Klasse in einer öffentlichen Klasse zu verschachteln . Dann instanziiert sich die innere private Klasse nur, wenn ihre öffentliche Methode zum Zugriff auf die private Instanz aufgerufen wird.

Schauen Sie sich diesen Wiki-Artikel an,

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

Das Konzept braucht eine Weile, um weiter zu kauen.

chrismjh
quelle
1

In einer Java-Datei kann es nur eine öffentliche Klasse der obersten Ebene geben, deren Name mit der Datei identisch ist. Es können jedoch auch mehrere öffentliche innere Klassen vorhanden sein, die an alle exportiert werden können und beispielsweise auf die Felder / Methoden der äußeren Klasse zugreifen können : AlertDialog.Builder (geändert durch 'public static') in AlertDialog (geändert durch 'public')

Baoyang
quelle
1

Ja Sie können mehr als eine Klasse in einer Java-Datei haben. Aber Sie haben einen von ihnen öffentlich gemacht. und speichern Sie die Java-Datei mit demselben Namen wie der Name der öffentlichen Klasse. Wenn Sie diese Java-Datei kompilieren, erhalten Sie separate Klassendateien für jede in der Java-Datei definierte Klasse.

Abgesehen davon gibt es zu viele Methoden, um mehr als eine Klasse in einer Java-Datei zu definieren.

  1. Verwenden Sie das Konzept der inneren Klassen.
  2. Verwenden Sie das Konzept anonymer Klassen.
Gaurav Varshney
quelle
1

Ja ! Die Java-Datei kann nur eine öffentliche Klasse enthalten.

Wenn diese beiden Klassen öffentlich sein sollen, müssen sie in zwei Java-Dateien abgelegt werden: A.java und B.java.

Rakesh Singh
quelle
2
Ich bin mir nicht sicher, ob Ihre Antwort etwas mehr aus den 12 anderen Antworten hinzufügt
gehe zum
1

Ja, Sie können mehr als eine Klasse in einer Java-Datei haben. Höchstens einer von ihnen kann öffentlich sein. Die anderen sind paketprivat. Sie können nicht privat oder geschützt sein. Wenn eine öffentlich ist, muss die Datei den Namen dieser Klasse haben. Andernfalls kann dieser Datei ALLES als Name zugewiesen werden.

Wenn sich viele Klassen in einer Datei befinden, befinden sich diese Klassen im selben Paket. Alle anderen Klassen, die sich in diesem Paket, aber nicht in dieser Datei befinden, können diese Klassen ebenfalls verwenden. Wenn dieses Paket importiert wird, kann die importierende Klasse sie auch verwenden.

Für eine detailliertere Untersuchung können Sie meinen Blog-Beitrag hier besuchen .

Merter Sualp
quelle
1
Willkommen bei Stack Overflow! Ich weiß es zu schätzen, dass Sie Informationen dargelegt haben, die hier noch nicht behandelt wurden. Sie haben auch Ihren Blog-Beitrag gut zitiert, während Sie das Eigentum erklärt und relevante Informationen hier aufgenommen haben. Wenn Sie in Zukunft mehr zu dieser Website beitragen möchten (und ich hoffe, dass Sie dies tun), lesen Sie diesen Artikel , um sicherzustellen, dass Ihre Beiträge weiterhin gut aufgenommen werden, wenn Sie Ihr Blog zitieren.
4castle
0

Es kann nur eine öffentliche Klasse der obersten Klasse in einer Datei geben. Der Klassenname dieser öffentlichen Klasse sollte der Name der Datei sein. Es kann viele öffentliche innere Klassen haben.

Sie können viele Klassen in einer einzigen Datei haben. Die Grenzen für verschiedene Ebenen der Klassensichtbarkeit in einer Datei sind wie folgt:

Klassen der obersten Ebene:
1 öffentliche Klasse
0 private Klasse
Beliebig viele Standard- / geschützte Klassen

Innere Klassen:
Beliebig viele innere Klassen mit beliebiger Sichtbarkeit (Standard, privat, geschützt, öffentlich)

Bitte korrigieren Sie mich, wenn ich falsch liege.

Lakshmikant Deshpande
quelle
0

Ja, kann es. Es kann jedoch nur eine öffentliche Klasse pro Java-Datei geben, da öffentliche Klassen denselben Namen wie die Quelldatei haben müssen.

user3077069
quelle