2014-12-05 88 views
1
package hf; 

import javax.sound.midi.*; 

public class BeatBox1 
{ 
    public static void main(String[] args) 
    { 
     BeatBox1 boom = new BeatBox1(); 
     boom.go(); 
    } 

    public void go() 
    { 
     try 
     { 
      Sequencer player = MidiSystem.getSequencer(); 
      player.open(); 

      Sequence seq = new Sequence(Sequence.PPQ,4); 

      Track track = seq.createTrack(); 

      for(int i = 5;i<125;i+=5) 
      { 
       track.add(makeEvent(144,i,i)); 
       track.add(makeEvent(128,i,i+2)); 
      } 

      player.setSequence(seq); 
      player.start(); 

     } 
     catch(Exception e) 
     { 
      System.out.println("Problem starting the BeatBox"); 
     } 
    } 

    public static MidiEvent makeEvent(int onOff,int note,int time) 
    { 
     MidiEvent event = null; 
     try 
     { 
     ShortMessage a = new ShortMessage(); 
     a.setMessage(onOff,1,note,100); 
     event = new MidiEvent(a,time); 
     return event; 
     } 
     catch(Exception e) 
     { 
      System.out.println("Error in creating Event."); 
     } 
     return event; 
    } 
} 

我在書中找到了上面的示例代碼。他們建議makeEvent方法是靜態的。是什麼原因?make方法makeEvent()是否有任何優點是靜態的?

當makeEvent()變爲非靜態時,程序也能正常運行。有沒有任何性能增益或任何可以通過使方法靜態獲得的優勢?

回答

0

的原因是,你可以訪問到靜態方法的情況下直接創建類

0

它更多的是風格的實例。 makeEvent不訪問BeatBox1的任何字段,並且static使用編譯器確保聲明。

就性能而言,幾乎沒有差別。編譯器將添加一個this作爲非靜態方法的第一個參數,這是字段的訪問方式,但這不應該對性能產生真正的影響。

2

基於一般的面向對象的原則,方法實際上是一個「行爲」,你的類提供給它的實例的公共視圖。一個實例是該類的「抽象存在」的真實生活版本。現在要理解的重要一點是,實例方法是類演示的行爲。班級的行爲與其「狀態」相關聯,即。變量或屬性。對於不同的狀態值,類的相同方法可以顯示不同的行爲,即:執行的操作。因此,作爲一般規則:當方法提供依賴於實例狀態的行爲並且行爲對類是唯一的時,它應該是非靜態的並封裝在類中。這種行爲只能通過定義良好的合同才能向全世界公開,合同通常是公共方法或類別的一個接口。

但是,如果一種方法提供的通用行爲不受任何類或實例狀態的束縛,也不受狀態變化的影響,它應該是靜態的,即:獨立於任何類。一些示例將給定日期轉換爲字符串,或者登錄消息或轉換異常等。

查看適合您的情況。

相關問題