单个文件中的多个类

我在将多个类放入单个文件时遇到问题。 例如,当我的文件看起来像:

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

我在编译期间遇到错误。 我不太确定是什么导致了这一点。 有任何想法吗?

一个Java文件可以包含多个类,其限制条件是只有一个类可以是公共的。 只要从类中删除public关键字,就可以将它们组合到一个Java文件中。

有吃勺的风险

请阅读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; } } } 

是的您可以在一个.java文件中编写所有类,但是您必须只有一个类公开(如果文件名和类名相同)

例:

A级{}

B级{}

C级{}

我假设你是初学者! 只需将所有这些内容粘贴到单个文件TheaterDemo.java 。 并且不要忘记在类声明的开头删除所有public关键字。

一个Java文件最多只能包含一个顶级公共类。 该公共顶级类可以包含任意数量的公共嵌套类。

您可以通过以下任何方法消除编译器错误:

  • 将其他类移动到自己的文件中。 例如: FirstClass.java,SecondClass.javaThirdClass.java
  • 嵌套名称不是文件基名的类。 例如:

     public class FirstClass() { public class SecondClass() {} public class ThirdClass() {} } 
  • 从除名称为文件basename的一个类之外的所有类中删除public限定符。 在Java v1.1中引入嵌套类之后,这种方法变得不那么常见了。 例如,在文件FirstClass.java中,您可以:

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

从Java语言规范, 第7.6节:顶级类型声明 :

当且仅当包存储在文件系统(第7.2节)中时,如果在由类型名称组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则加上一个扩展名(例如.java或.jav):

  • 该类型由声明类型的包的其他编译单元中的代码引用。

  • 该类型被声明为public(因此可以从其他包中的代码访问)。

只需从所有其他类定义中删除public,并将代码粘贴到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 

我看到你已经完成了那种实现。 请参考

  private class CalcButtonListener implements ActionListener 

在你的TheaterWindow课堂上。

通过这样做,您正在创建内部类,即CalcButtonListenerTheaterWindow类的内部类。 您可以扩展到其他类的一些概念。