Multiple classes in single file

前端 未结 8 1621
北荒
北荒 2020-11-29 07:57

I\'m having trouble putting multiple classes into a single file. For example, when my file looks like:

public class FirstClass() {}
public class SecondClass(         


        
相关标签:
8条回答
  • 2020-11-29 08:32

    At the risk of spoon-feeding

    Please read 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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-29 08:35

    One Java file can contain at most one top-level public class. That public top-level class can contain any number of public nested classes.

    You can eliminate your compiler errors by any of the following approaches:

    • Moving the other classes into their own files. For example: FirstClass.java, SecondClass.java, and ThirdClass.java.
    • Nesting the classes whose name is not the file basename. For example:

      public class FirstClass() {
          public class SecondClass() {}   
          public class ThirdClass() {}
      }
      
    • Removing the public qualifier from all but the one class whose name is the file basename. This approach has become less common after the introduction of nested classes in Java v1.1. For example, in file FirstClass.java, you could have:

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

    From the Java Language Specification, section 7.6: Top Level Type Declarations:

    If and only if packages are stored in a file system (§7.2), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

    • The type is referred to by code in other compilation units of the package in which the type is declared.

    • The type is declared public (and therefore is potentially accessible from code in other packages).

    0 讨论(0)
提交回复
热议问题