2014-02-11 35 views
1

我有下面的示例代码,它从JFrame继承,因此我的add()方法从容器(JPanel)继承。我想了解以下内容:继承和调用方法(实例vs非实例)

  1. 什么是使用方法,而不是直接创建一个对象,并调用该方法的一个实例的好处?我们这样节省记忆吗?我知道创建一个对象不是免费的,所以我想这也许是延长这段代码的好处之一。
  2. 为什么我们称之为一个实例如下方法:

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

    fc.setResizable(false);

    fc.setLocationRelativeTo(null);

    fc.setVisible(true);

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

代码:

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); 
     } 
    } 
} 

回答

4

你应该阅读有关的static和非static方法的差异 - 你是继承方法是static背景下,而你main - 方法在非static背景下才有效。不要混合这两样东西!

+0

你能解释一下如何创建一个实例来调用主要的这些方法,使它们的行为使它们在静态上下文中有效?我不是很了解为什么使用实例可以解决问题。 – user2644819

+0

在静态上下文中创建对象的实例就像在非静态上下文中创建对象的实例一样 - 只是你不能直接将边界从静态变为非静态,而没有代表非静态部分的对象。 – Smutje

+0

为什么如果我们要从同一个类访问一个方法而不创建一个对象,我们是否需要使方法成为静态的?这背后的原因是什么?我没有看到这方面的需要或好处。 – user2644819