2014-12-05 40 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

基于一般的面向对象的原则,方法实际上是一个“行为”,你的类提供给它的实例的公共视图。一个实例是该类的“抽象存在”的真实生活版本。现在要理解的重要一点是,实例方法是类演示的行为。班级的行为与其“状态”相关联,即。变量或属性。对于不同的状态值,类的相同方法可以显示不同的行为,即:执行的操作。因此,作为一般规则:当方法提供依赖于实例状态的行为并且行为对类是唯一的时,它应该是非静态的并封装在类中。这种行为只能通过定义良好的合同才能向全世界公开,合同通常是公共方法或类别的一个接口。

但是,如果一种方法提供的通用行为不受任何类或实例状态的束缚,也不受状态变化的影响,它应该是静态的,即:独立于任何类。一些示例将给定日期转换为字符串,或者登录消息或转换异常等。

查看适合您的情况。

相关问题