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?
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.
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;
}
}
}
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 {}
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.
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:
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).
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.
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
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.