2011-02-18 38 views
2

我正在學習Java,現在我已經完成了包駝峯,事情進展順利。我可以在我正在學習的大部分事物與我已經知道至少是這個概念的事物之間繪製相似之處。但是,下面的一段代碼到底是怎麼回事?它是某種形式的構造函數還是匿名對象?來自C++程序員的Java問題

Something obj = new Something() 
{ 
    private static final int num = 3; 

    public void meth() 
    { 
    // w/e 
    } 
}; 

回答

2
/** 
* Notice there's only one thing in this that isn't defined: 
* It still needs public abstract void triggerEvent(); 
*/ 
public abstract static class TopButton extends JPanel implements MouseListener { 
     protected ButtonPanel parent; 
     private String text; 
     public TopButton(ButtonPanel bp, String text) { parent = bp; this.text = text; addMouseListener(this); } 
     public void mouseClicked(MouseEvent e) { triggerEvent(); } 
     public void mouseEntered(MouseEvent e) { } 
     public void mouseExited(MouseEvent e) { } 
     public void mousePressed(MouseEvent e) { } 
     public void mouseReleased(MouseEvent e) { } 
     public abstract void triggerEvent(); 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Color oldColor = g.getColor(); 
      Font oldFont = g.getFont(); 
       Font newFont = new Font(oldFont.getName(),oldFont.getStyle(),oldFont.getSize()); 
       g.setFont(newFont); 
       g.setColor(Color.black); 
       g.drawString(text, 20, 20); 
      g.setFont(oldFont); 
      g.setColor(oldColor); 
     } 
    } 

現在,當我實際定義我的按鈕時,我這樣做。通過提供它需要的一條線,唯一使它與其他線不同的線。現在我可以爲每個文件創建一個新文件,併爲每個文件定義一個新類。這很簡單。

private static void loadButtonPanelButtons() { 
    /* This button should tell the parent to bring up the save screen */ 
    TopButton save = new TopButton(buttonPanel,"Save") { 
     public void triggerEvent() { parent.triggerSave(); } 
    }; 
    save.setBorder(LineBorder.createBlackLineBorder()); 
    buttonPanel.add(save); 

    /* This button should tell the parent to bring up the load screen */ 
    TopButton load = new TopButton(buttonPanel,"Load") { 
     public void triggerEvent() { parent.triggerLoad(); } 
    }; 
    load.setBorder(LineBorder.createBlackLineBorder()); 
    buttonPanel.add(load); 

    TopButton addTile = new TopButton(buttonPanel,"Add Tile") { 
     public void triggerEvent() { parent.triggerAddTile(); } 
    }; 
    addTile.setBorder(LineBorder.createBlackLineBorder()); 
    buttonPanel.add(addTile); 

    TopButton saveTiles = new TopButton(buttonPanel,"Save Tiles") { 
     public void triggerEvent() { parent.triggerStyleSave(); } 
    }; 
    saveTiles.setBorder(LineBorder.createBlackLineBorder()); 
    buttonPanel.add(saveTiles); 
} 

現在,當我處理的按鈕被按下,記得在TopButton的定義......有

​​

我們知道triggerEvent()最終被定義。我們可以在每個按鈕的基礎上定義它,當面板被點擊時,無論我們定義triggerEvent()是什麼,它都會被調用。

6

你明白了 - 這會創建一個匿名的內部類Something。另外還有:Nested Classes (The Java Tutorial)Anonymous Classes

+0

這是什麼意思?是否用於擴展類Something以及向其中添加方法和變量,而不實際創建Something2 extends Soemthing類? – Josh 2011-02-18 03:34:02

+1

有時候,你想要定義行爲而不用擔心一個全新的類。通常,它只需要一個(也許是兩個)方法。我將把這移到一個新的代碼格式化答案,我會告訴你。 – corsiKa 2011-02-18 04:05:00

1

這樣的構造創建了一個類的匿名內部類,其中執行該構造,並從Something(不是Something的內部類)派生。

這個想法是快速提供抽象類,接口的實現或覆蓋類的某些功能。 ();}})。start();}});}}});}}。