2014-02-11 55 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