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

Java 继承和调用方法(实例与非实例),java,swing,object,inheritance,extend,Java,Swing,Object,Inheritance,Extend,下面的示例代码继承自JFrame,因此我的add()方法继承自容器(JPanel)。我想知道以下几点: 直接使用该方法而不是创建对象并调用该方法的实例有什么好处?我们这样节省内存吗?我知道创建一个对象并不是没有内存的,所以我想这可能是扩展这段特定代码的好处之一 为什么要调用以下方法的实例: fc.setSize(280125);//宽度和高度 fc.可设置大小(false) fc.setLocationRelativeTo(空) fc.setVisible(真) 我们继承了所有这些方法,所以我天

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

  • 直接使用该方法而不是创建对象并调用该方法的实例有什么好处?我们这样节省内存吗?我知道创建一个对象并不是没有内存的,所以我想这可能是扩展这段特定代码的好处之一
  • 为什么要调用以下方法的实例:

    fc.setSize(280125);//宽度和高度

    fc.可设置大小(false)

    fc.setLocationRelativeTo(空)

    fc.setVisible(真)

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

    代码:

    导入java.awt.FlowLayout;
    导入java.awt.event.ActionEvent;
    导入java.awt.event.ActionListener;
    导入javax.swing.JButton;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JTextField;
    公共类FC2扩展了JFrame{
    JTextField ftext,ctext;
    按钮f2c,c2f;
    公共FC2(字符串标题){
    超级(标题);
    JLabel f=新JLabel(“华氏”);
    JLabel c=新JLabel(“摄氏度”);
    ftext=新的JTextField(5);
    ctext=新的JTextField(5);
    f2c=新的JButton(“>>”);
    
    c2f=新的JButton("你应该阅读
    静态
    和非
    静态
    方法的区别-你继承的方法只在非
    静态
    上下文中有效,而你的
    -方法在
    静态
    上下文中。不要把这两件事混在一起!

    你应该阅读
    静态的区别de>和非
    静态
    方法-您继承的方法仅在非
    静态
    上下文中有效,而您的
    main
    -方法在
    静态
    上下文中有效。不要混淆这两种方法!

    您能解释一下创建一个实例以在main中调用这些方法是如何使它们在stat中有效的吗ic上下文?我不太明白为什么使用实例可以解决这个问题。在静态上下文中创建对象的实例就像在非静态上下文中创建对象的实例一样——只是如果没有表示非静态部分的对象,就不能直接从静态到非静态跨越边界。为什么我们需要如果我们在不创建对象的情况下访问同一类中的方法,那么方法是静态的?这背后的原因是什么?我看不出这有什么必要或好处。主方法是静态的,以便能够启动/引导应用程序-否则,Java系统程序必须能够实例化对象并调用方法来启动您的Java程序。我更喜欢将main方法分解到自己的类中,以拥有一个与程序本身无关的、但从命令行启动它的独特程序入口点。抱歉,我进行了编辑。我的意思是,如果我们从同一类访问方法,为什么我们必须使这些方法成为静态的。假设我有一个类a和方法B我在main中调用方法B(也在类A中)不创建对象。为什么方法B需要是静态的?我假设它需要是静态的与继承/多态性有关?你能解释一下创建一个实例来调用这些方法是如何使它们在静态上下文中有效的吗?我不太明白为什么使用实例可以解决问题e、 在静态上下文中创建对象的实例就像在非静态上下文中创建对象的实例一样,只是如果没有表示非静态部分的对象,就不能直接从静态到非静态跨越边界。但是,如果我们从与创建一个对象?这背后的原因是什么?我看不出这有什么必要或好处。main方法是静态的,以便能够启动/引导应用程序-否则,Java系统程序必须能够实例化对象并调用方法来启动Java程序。我更喜欢将main方法考虑到自己的类中有一个不同的程序入口点,它与程序本身无关,只是从命令行启动。对不起,我做了编辑。我的意思是,如果我们从同一个类访问这些方法,为什么我们必须使它们成为静态的。假设我有一个带有方法B的类,我在main中调用方法B(也在类a中)没有创建对象。为什么方法B需要是静态的?我假设它需要是静态的与继承/多态性有关?
    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);
            }
        }
    }