继承和调用方法(实例与非实例)

时间:2014-02-11 21:44:52

标签: java swing object inheritance extend

我在下面的示例代码中继承了JFrame,因此我的add()方法继承自容器(JPanel)。我想知道以下内容:

  1. 直接使用该方法而不是创建对象并调用该方法的实例有什么好处?我们这样节省记忆吗?我知道创建一个对象不是无内存的,所以我想也许这是扩展这段特殊代码的好处之一。
  2. 为什么我们为以下方法调用实例:

    fc.setSize(280,125); // width and height

    fc.setResizable(false);

    fc.setLocationRelativeTo(null);

    fc.setVisible(true);

  3. 我们继承了所有这些方法,所以我天真地尝试在不创建对象的情况下调用它们并将它们用作实例,但我获得了一些错误,抱怨非静态方法被引用为静态上下文。我在构造函数的末尾添加了它们,我没有收到任何问题。在这种情况下,我还想知道如果调用实例而不是直接调用方法有什么好处。它不像我们有多个框架所以我没有看到使用创建对象。

    代码:

    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    public class FC2 extends JFrame {
    
        JTextField ftext, ctext;
        JButton f2c, c2f;
    
        public FC2(String title) {
            super(title);
    
            JLabel f = new JLabel("Fahrenheit");
            JLabel c = new JLabel("Celsius");
    
            ftext = new JTextField(5);
            ctext = new JTextField(5);
            f2c = new JButton(">>>");
            c2f = new JButton("<<<");
    
            setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
            add(f);
            add(f2c);
            add(c);
            add(ftext);
            add(c2f);
            add(ctext);
    
            ActionListener bl = new ButtonListener(this);
    
            // anonymous class for ActionListener parameter
            f2c.addActionListener(bl);
            c2f.addActionListener(bl);
        }
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            JFrame fc = new FC2("F2C Converter");
            fc.setSize(280,125);   // width and height
            fc.setResizable(false);
            fc.setLocationRelativeTo(null);
            fc.setVisible(true);
    
        }
    
    }
    
    class ButtonListener implements ActionListener {
    
        FC2 frame;
    
        public ButtonListener(FC2 frame) {
            this.frame = frame;
        }
    
        public void actionPerformed(ActionEvent e) {
            // get at button label
            String label = e.getActionCommand();
            if (label.equals("<<<")) { // c2f
                String cstr = frame.ctext.getText();
                float c = Float.parseFloat(cstr);
                float f = c*9/5+32;
                String fstr = String.format("%4.1f", f);
                frame.ftext.setText(fstr);
            } else {
                String fstr = frame.ftext.getText();
                float f = Float.parseFloat(fstr);
                float c = (float)((f-32)*5/9.0);
                String cstr = String.format("%4.1f", c);
                frame.ctext.setText(cstr);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:4)

您应该了解static和非static方法的差异 - 您继承的方法仅在非static上下文中有效,而main - 方法在static上下文中。不要混淆这两件事!