web-dev-qa-db-fra.com

Plusieurs classes dans un seul fichier

Je n'arrive pas à mettre plusieurs classes dans un seul fichier. Par exemple, quand mon fichier ressemble à:

public class FirstClass() {}
public class SecondClass() {}
public class ThirdClass() {}

Je reçois une erreur lors de la compilation. Je ne suis pas tout à fait sûr de ce qui cause ceci. Des idées?

9
Zach Latta

Un fichier Java peut être constitué de plusieurs classes, avec la restriction qu'un seul d'entre elles peut être public. Dès que vous supprimez le mot clé public de vos classes, vous pouvez les combiner dans un seul fichier Java.

22
SiB

Au risque de manger à la cuillère

Veuillez lire http://docs.Oracle.com/javase/tutorial/Java/javaOO/innerclasses.html

import Java.awt.GridLayout;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.text.DecimalFormat;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class TheaterWindow extends JFrame
{
    private JPanel pnlAdultTicketPrice, pnlAdultTicketsSold, pnlChildTicketPrice, pnlChildTicketsSold,
        pnlCalculate, pnlMain;
    private JLabel lblAdultTicketPrice, lblAdultTicketsSold, lblChildTicketPrice, lblChildTicketsSold;
    private JTextField txtAdultTicketPrice, txtAdultTicketsSold, txtChildTicketPrice, txtChildTicketsSold;
    private JButton btnCalculate;

    public TheaterWindow()
    {
        // Sets window title
        setTitle("Theater");

        // Sets layout to BorderLayout
        setLayout(new GridLayout(5,1));

        // Specifies what happens when close button is clicked
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Builds the panels
        buildPanels();

        // Add the panels to the frame's content pane
        add(pnlAdultTicketPrice);
        add(pnlChildTicketPrice);
        add(pnlAdultTicketsSold);
        add(pnlChildTicketsSold);
        add(pnlCalculate);

        // Size the frame to fit all of the panels
        pack();

        // Display the window
        setVisible(true);
    }

    private void buildPanels()
    {
        // Creates labels to display instructions
        lblAdultTicketPrice = new JLabel("Adult ticket price");
        lblChildTicketPrice = new JLabel("Child ticket price");
        lblAdultTicketsSold = new JLabel("Adult tickets sold");
        lblChildTicketsSold = new JLabel("Child tickets sold");

        // Creates text fields that are 10 characters wide
        txtAdultTicketPrice = new JTextField(10);
        txtChildTicketPrice = new JTextField(10);
        txtAdultTicketsSold = new JTextField(10);
        txtChildTicketsSold = new JTextField(10);

        // Creates button with caption
        btnCalculate = new JButton("Calculate");

        // Adds action listener to button
        btnCalculate.addActionListener(new CalcButtonListener());

        // Creates panels
        pnlAdultTicketPrice = new JPanel();
        pnlChildTicketPrice = new JPanel();
        pnlAdultTicketsSold = new JPanel();
        pnlChildTicketsSold = new JPanel();
        pnlCalculate = new JPanel();
        pnlMain = new JPanel();

        // Adds elements to their proper panels
        pnlAdultTicketPrice.add(lblAdultTicketPrice);
        pnlAdultTicketPrice.add(txtAdultTicketPrice);
        pnlChildTicketPrice.add(lblChildTicketPrice);
        pnlChildTicketPrice.add(txtChildTicketPrice);
        pnlAdultTicketsSold.add(lblAdultTicketsSold);
        pnlAdultTicketsSold.add(txtAdultTicketsSold);
        pnlChildTicketsSold.add(lblChildTicketsSold);
        pnlChildTicketsSold.add(txtChildTicketsSold);
        pnlCalculate.add(btnCalculate);

        // Adds all of the above panels to a main panel
        pnlMain.add(pnlAdultTicketPrice);
        pnlMain.add(pnlChildTicketPrice);
        pnlMain.add(pnlAdultTicketsSold);
        pnlMain.add(pnlChildTicketsSold);
        pnlMain.add(pnlCalculate);
    }

    private class CalcButtonListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            // Creates object of Theater
            Theater theater = new Theater();

            // Sets the member variables of Theater to the user's input
            theater.setAdultTicketPrice(Double.parseDouble(txtAdultTicketPrice.getText()));
            theater.setChildTicketPrice(Double.parseDouble(txtChildTicketPrice.getText()));
            theater.setAdultTicketsSold(Integer.parseInt(txtAdultTicketsSold.getText()));
            theater.setChildTicketsSold(Integer.parseInt(txtChildTicketsSold.getText()));

            // Creates DecimalFormat object for rounding
            DecimalFormat dollar = new DecimalFormat("#.##");

            // Display the charges.
            JOptionPane.showMessageDialog(null, "Adult ticket gross: $" +
                    Double.valueOf(dollar.format(theater.getAdultGross())) + "\n" +
                    "Child ticket gross: $" + Double.valueOf(dollar.format(theater.getChildGross())) + "\n" +
                    "Adult ticket net: $" + Double.valueOf(dollar.format(theater.getAdultNet())) + "\n" +
                    "Child ticket net: $" + Double.valueOf(dollar.format(theater.getChildNet())) + "\n" +
                    "Total gross: $" + Double.valueOf(dollar.format(theater.getChildGross())) + "\n" +
                    "Total net: $" + Double.valueOf(dollar.format(theater.getTotalNet())));
        }
    }

    public class Theater
    {
        private double PERCENTAGE_KEPT = 0.20;

        private double adultTicketPrice, childTicketPrice;
        private int adultTicketsSold, childTicketsSold;

        public double getAdultGross()
        {
            return getAdultTicketPrice() * getAdultTicketsSold();
        }

        public double getAdultNet()
        {
            return PERCENTAGE_KEPT * getAdultGross();
        }

        public double getAdultTicketPrice()
        {
            return adultTicketPrice;
        }

        public int getAdultTicketsSold()
        {
            return adultTicketsSold;
        }

        public double getChildGross()
        {
            return getChildTicketPrice() * getChildTicketsSold();
        }

        public double getChildNet()
        {
            return PERCENTAGE_KEPT * getChildGross();
        }

        public double getChildTicketPrice()
        {
            return childTicketPrice;
        }

        public int getChildTicketsSold()
        {
            return childTicketsSold;
        }

        public double getTotalGross()
        {
            return getChildGross() + getAdultGross();
        }

        public double getTotalNet()
        {
            return getChildGross() + getChildNet();
        }

        public void setAdultTicketPrice(double adultTicketPrice)
        {
            this.adultTicketPrice = adultTicketPrice;
        }

        public void setAdultTicketsSold(int adultTicketsSold)
        {
            this.adultTicketsSold = adultTicketsSold;
        }

        public void setChildTicketPrice(double childTicketPrice)
        {
            this.childTicketPrice = childTicketPrice;
        }

        public void setChildTicketsSold(int childTicketsSold)
        {
            this.childTicketsSold = childTicketsSold;
        }
    }
}
4
Arun Manivannan

Oui Vous pouvez écrire toutes vos classes dans un seul fichier .Java, mais vous ne devez avoir qu'une seule classe publique (si le nom de fichier et le nom de classe sont identiques) 

Exemple:

classe A{}

classe B {}

classe C {}

2
Arun Chandravanshi

Je suppose que vous êtes très débutant! Il suffit de copier et coller tous ces contenus dans un seul fichier TheaterDemo.Java. Et n'oubliez pas de supprimer tous les mots clés public au début de la déclaration de classe.

1
shriguru nayak

Un fichier Java peut contenir au plus une classe top-level public. Cette classe publique de niveau supérieur peut contenir un nombre illimité de classes publiques imbriquées.

Vous pouvez éliminer les erreurs de votre compilateur par l’une des approches suivantes:

  • Déplacer les autres classes dans leurs propres fichiers. Par exemple: FirstClass.Java, SecondClass.Java, et ThirdClass.Java .
  • Imbrication des classes dont le nom n'est pas le fichier nom de base. Par exemple:

    public class FirstClass() {
        public class SecondClass() {}   
        public class ThirdClass() {}
    }
    
  • Suppression du qualificatif public de toutes les classes sauf la classe dont le nom correspond au fichier nom de base. Cette approche est devenue moins courante après l'introduction de classes imbriquées dans Java v1.1. Par exemple, dans le fichier FirstClass.Java, vous pourriez avoir:

    public class FirstClass() {}
    class SecondClass() {}   
    class ThirdClass() {}
    

Dans la spécification du langage Java, section 7.6: Déclarations de type de niveau supérieur }:

Si et seulement si les packages sont stockés dans un système de fichiers (§7.2), le système hôte peut choisir d'imposer la restriction selon laquelle il s'agit d'une erreur de compilation si un type est introuvable dans un fichier sous un nom composé du nom du type. plus une extension (telle que .Java ou .jav) si l’un des cas suivants est vrai:

  • Le type est référencé par code dans d'autres unités de compilation du package dans lequel le type est déclaré.

  • Le type est déclaré public (et donc potentiellement accessible à partir du code d’autres packages).

1
Andy Thomas

Il n'y a aucune restriction sur le nombre de fichiers de classe dans un fichier Java.

Mais nous ne pouvons pas avoir plus d’une classe publique par fichier de code source. De plus, le nom du fichier doit correspondre au nom de la classe publique. De même, une classe déclarée comme classe publique Dog {} doit figurer dans un fichier de code source nommé Dog.Java.

Et les fichiers sans classes publiques peuvent avoir un nom qui ne correspond à aucune des classes du fichier.

0
Soban Jawaid

Supprimez simplement public de toutes les autres définitions de classe et collez le code dans le fichier TheaterDemo.Java

public class TheaterDemo
{
    public static void main(String[] args)
    {
        TheaterWindow theaterWindow = new TheaterWindow();
    }
}
//Here class code after removing public

// Here another class code
0
kosa

Je vois que vous avez déjà effectué ce type de mise en oeuvre. Se il vous plaît se référer

    private class CalcButtonListener implements ActionListener

dans votre classe TheaterWindow.

En faisant cela, vous créez des classes internes, c'est-à-dire que CalcButtonListener est une classe interne de TheaterWindow classe. Certains concept, vous pouvez étendre à d'autres classes. 

0
Yogendra Singh