Un fichier java peut-il avoir plusieurs classes?

Réponses:

128

Oui il peut. Cependant, il ne peut y avoir qu'une seule classe publique de niveau supérieur par .javafichier et les classes publiques de niveau supérieur doivent avoir le même nom que le fichier source.

Le but d'inclure plusieurs classes dans un fichier source est de regrouper les fonctionnalités de support associées (structures de données internes, classes de support, etc.) avec la classe publique principale. Notez qu'il est toujours acceptable de ne pas le faire - le seul effet est sur la lisibilité (ou non) de votre code.

Sean Reilly
la source
1
Je pense que c'est une bonne idée de le faire si vous voulez garder ces classes supplémentaires privées, afin qu'elles puissent être complètement modifiées plus tard sans rien casser en dehors qui utilise accidentellement ces classes.
Erich Kitzmueller
3
Il est là pour la compatibilité 1.0 (avant les classes imbriquées). C'est une grosse erreur de langue. Le plus grand avantage de son utilisation est que les IDE ont une gestion des fichiers sans espoir.
Tom Hawtin - tackline
25
Une classe publique de premier niveau par fichier. Il peut y avoir autant de classes internes publiques par fichier que vous le souhaitez.
erickson
@Tom, quelle partie pensez-vous être une erreur, des classes internes ou plusieurs classes de premier niveau par fichier?
finnw le
@finnw Plusieurs classes de niveau supérieur par fichier. C'est tellement faux. Où est java.awt.LightweightDispatcher?
Tom Hawtin - tackline
17

Si vous souhaitez implémenter une classe publique, vous devez l'implémenter dans un fichier portant le même nom que cette classe. Un seul fichier peut contenir une classe publique et éventuellement des classes privées. Ceci est utile si les classes ne sont utilisées qu'en interne par la classe publique. De plus, la classe publique peut également contenir des classes internes.

Bien qu'il soit bien d'avoir une ou plusieurs classes privées dans un seul fichier source, je dirais qu'il est plus lisible d'utiliser des classes internes et anonymes à la place. Par exemple, on peut utiliser une classe anonyme pour définir une classe Comparator à l'intérieur d'une classe publique:

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

    }
  };

La classe Comparator nécessitera normalement un fichier séparé pour être publique. De cette façon, il est livré avec la classe qui l'utilise.

kgiannakakis
la source
1
Ce n'est pas vraiment une classe privée si elle est dans le fichier sans modificateur. Vous ne pouvez pas avoir une classe privée sans que ce soit une classe interne, car si vous l'avez fait, qui pourrait l'utiliser?
Bjorn
10

Oui, autant que vous le souhaitez!

MAIS, une seule classe "publique" dans chaque fichier.

Alberto
la source
6

Un fichier .java est appelé une unité de compilation. Chaque unité de compilation peut contenir n'importe quel nombre de classes et d'interfaces de niveau supérieur. S'il n'y a pas de types publics de niveau supérieur, l'unité de compilation peut être nommée n'importe quoi.

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

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

Il ne peut y avoir qu'une seule classe / interface publique dans une unité de compilation. Le cu doit être nommé exactement comme ce type public de niveau supérieur.

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

Points importants sur la méthode principale - partie 1

Partie 2

(Points concernant le nombre de classes et leurs niveaux d'accès couverts dans la partie 2)

Utsav
la source
5

Oui, vous pouvez créer plus d'une classe publique, mais il doit s'agir d'une classe imbriquée.

public class first {

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

    public class demo1
    {

        public class demo2
        {

        }
    }
}
Ganesh
la source
4

Outre les classes internes anonymes, une autre utilisation est les classes internes privées qui implémentent une interface publique ( voir cet article ). La classe externe peut accéder à tous les champs et méthodes privés de la classe interne.

Cela vous permet de créer deux classes étroitement couplées, telles qu'un modèle et sa vue, sans exposer les implémentations de l'un ou l'autre. Un autre exemple est une collection et ses itérateurs.

Rich Apodaca
la source
4

En général, il devrait y avoir une classe par fichier. Si vous organisez les choses de cette façon, lorsque vous recherchez une classe, vous savez que vous devez uniquement rechercher le fichier portant ce nom.

L'exception est lorsqu'une classe est mieux implémentée en utilisant une ou plusieurs petites classes d'assistance. En général, le code est le plus simple à suivre lorsque ces classes sont présentes dans le même fichier. Par exemple, vous pourriez avoir besoin d'une petite classe wrapper «tuple» pour transmettre des données entre les appels de méthode. Un autre exemple est celui des classes «tâche» implémentant Runnable ou Callable. Ils peuvent être si petits qu'ils sont mieux combinés avec la classe parent qui les crée et les appelle.

Confusion
la source
4

Oui 200% ,

Exemple:

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

Oui, c'est possible, mais il ne peut y avoir qu'une seule classe publique dans un package car le compilateur java crée le fichier .Class qui porte le même nom que le nom de la classe publique, donc s'il y a plus d'une classe publique, il serait difficile de sélectionner compilateur que quel devrait être le nom du fichier de classe.

Meetu Choudhary
la source
1

Varie ... Un tel exemple serait une classe anonyme (vous en rencontrerez beaucoup lors de l'utilisation d'écouteurs d'événements et autres).

laginimaineb
la source
1

Je pense que cela devrait être "il ne peut y avoir qu'une seule classe publique de niveau supérieur NON-STATIQUE par fichier .java". N'est-ce pas?

VacancesCactus
la source
Vous devriez poser ceci comme une question plutôt que de répondre ici.
Ashish Kumar
1

Si vous souhaitez implémenter un singleton, c'est-à-dire une classe qui s'exécute dans votre programme avec une seule instance en mémoire tout au long de l'exécution de l'application, l'un des moyens d'implémenter un singleton est d'imbriquer une classe statique privée dans une classe publique . Ensuite, la classe privée interne ne s'instancie que lorsque sa méthode publique pour accéder à l'instance privée est appelée.

Consultez cet article du wiki,

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

Le concept prend du temps à se développer.

chrismjh
la source
1

Dans un fichier .java, il ne peut y avoir qu'une seule classe publique de premier niveau dont le nom est le même que le fichier, mais il peut y avoir plusieurs classes internes publiques qui peuvent être exportées vers tout le monde et accéder aux champs / méthodes de la classe externe, par exemple : AlertDialog.Builder (modifié par 'public static') dans AlertDialog (modifié par 'public')

Baoyang
la source
1

Oui Vous pouvez avoir plus d'une classe dans un fichier .Java. Mais vous devez rendre l'un d'eux public. et enregistrez le fichier .java avec le même nom que le nom de la classe publique. lorsque vous compilerez ce fichier .java, vous obtiendrez des fichiers .class séparés pour chaque classe définie dans le fichier .java.

En dehors de cela, il y a trop de méthodes pour définir plus d'une classe dans un fichier .java.

  1. utiliser le concept des classes intérieures.
  2. Utilisez le concept de classes anonymes.
Gaurav Varshney
la source
1

Oui ! Le fichier .java ne peut contenir qu'une seule classe publique.

Si vous voulez que ces deux classes soient publiques, elles doivent être placées dans deux fichiers .java: A.java et B.java.

Rakesh Singh
la source
2
Je ne suis pas sûr que votre réponse ajoute quelque chose de plus à partir des 12 autres réponses
aller au
1

Oui, vous pouvez avoir plus d'une classe dans un fichier .java. Au plus l'un d'entre eux peut être public. Les autres sont des packages privés. Ils NE PEUVENT PAS être privés ou protégés. Si l'un d'entre eux est public, le fichier doit porter le nom de cette classe. Sinon, TOUT peut être donné à ce fichier comme nom.

Avoir plusieurs classes dans un fichier signifie que ces classes sont dans le même package. Ainsi, toutes les autres classes qui se trouvent à l'intérieur de ce package mais pas dans ce fichier peuvent également utiliser ces classes. De plus, lorsque ce package est importé, la classe d'importation peut également les utiliser.

Pour une enquête plus détaillée, vous pouvez visiter mon article de blog ici .

Merter Sualp
la source
1
Bienvenue dans Stack Overflow! J'apprécie que vous ayez exposé des informations qui n'étaient pas déjà couvertes ici. Vous avez également fait un bon travail en citant votre article de blog tout en déclarant la propriété et en incluant des informations pertinentes ici. Si vous choisissez de contribuer davantage à ce site à l'avenir (et j'espère que vous le faites), assurez-vous de prendre en compte cet article pour vous assurer que vos articles continuent d'être bien reçus si vous citez votre blog.
4castle
0

Il ne peut y avoir qu'une seule classe de premier niveau de classe publique dans un fichier. Le nom de classe de cette classe publique doit être le nom du fichier. Il peut avoir de nombreuses classes internes publiques.

Vous pouvez avoir plusieurs classes dans un seul fichier. Les limites des différents niveaux de visibilité de classe dans un fichier sont les suivantes:

Classes de niveau supérieur:
1 classe publique
0 classe privée
n'importe quel nombre de classes par défaut / protégées

Classes
internes : n'importe quel nombre de classes internes avec n'importe quelle visibilité (par défaut, privée, protégée, publique)

S'il vous plait corrigez moi si je me trompe.

Lakshmikant Deshpande
la source
0

Oui il peut. Cependant, il ne peut y avoir qu'une seule classe publique par fichier .java, car les classes publiques doivent avoir le même nom que le fichier source.

utilisateur3077069
la source