单个文件中的多个类

时间:2012-10-30 04:41:18

标签: java oop

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

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

我在编译期间遇到错误。我不太确定是什么原因造成的。有什么想法吗?

8 个答案:

答案 0 :(得分:22)

一个Java文件可以包含多个类,但只有一个类可以公开。只要从类中删除public个关键字,就可以将它们合并到一个Java文件。

答案 1 :(得分:4)

有吃勺的风险

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

答案 2 :(得分:2)

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

示例:

A班 { }

B级 { }

C班 { }

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

  • 将其他类移动到自己的文件中。例如: FirstClass.java,SecondClass.java, ThirdClass.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语言规范,section 7.6: Top Level Type Declarations

  

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

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

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

  •   

答案 5 :(得分:0)

只需从所有其他类定义中删除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

答案 6 :(得分:0)

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

    private class CalcButtonListener implements ActionListener

TheaterWindow课程中。

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

答案 7 :(得分:0)

java文件中的类文件数量没有限制。

但是每个源代码文件最多只能有一个公共类。此外,文件名必须与公共类的名称匹配。例如,声明为公共类Dog {}的类必须位于名为Dog.java的源代码文件中。

没有公共类的文件可以具有与文件中任何类都不匹配的名称。