0

我还是 Java 新手,有些概念仍然让我感到困惑。我想在我的主要课程中的 strummer 课程中运行 vibrate。vibrate 方法不能存在于我的主类中,因为它是一个抽象方法(我假设)。我想从我的主类中调用此方法,但我不确定如何,因为我收到“对非静态方法的静态引用”错误。我对为什么这不起作用有一个非常基本的想法,但是我需要知道假设它在 playTheSound 方法中不起作用,您将如何调用此方法。

这是代码

public void playTheSound() {
    // set up MediaPlayer
    MediaPlayer mp = new MediaPlayer();
    switch (i) {
    case 1:
        mp = MediaPlayer.create(this, R.raw.cmaj);
        mp.start();
        strummer.vibrate(pattern, repeat);
        break;
    }

}   
}

 abstract class strummer {

public abstract void vibrate (long[] pattern, int repeat);

 }
4

4 回答 4

1

首先,Strummer 一个抽象类,因此你不能直接实例化它。您必须创建一个子类,例如MyStrummer extends Strummer,它会覆盖 Strummer 中的任何抽象方法。

public abstract class Strummer
{
    public abstract void vibrate(long[] pattern, int repeat);//This is only the signature.
}

public class MyStrummer extends Strummer
{
   public void playTheSound() {
      this.vibrate();
      //Do your stuff over here
   }
   public void vibrate(long[] pattern, int repeat){//Overriding the method
      //Write vibrate method details here.
   }
}
于 2013-05-15T12:27:22.223 回答
0

你至少需要两节课。

// Strummer.java
abstract class Strummer {
    public abstract void vibrate (long[] pattern, int repeat);
    protected long[] pattern;  // Not recommended, but this 
    protected int repeat;      // allows the vibrate call to work.
    public void playTheSound(int i) {
        MediaPlayer mp = new MediaPlayer();
        switch (i) {
            case 1:
                mp = MediaPlayer.create(this, R.raw.cmaj);
                mp.start();
                vibrate(pattern, repeat);
                break;
            case 2:
                // stuff
                break;
            // more stuff
        }
    }   
}

和(在同一个包中)

//RealStrummer.java
public class RealStrummer extends Strummer {
    private int mode;

    public RealStrummer(int mode, long[] pattern, int repeat) {
        this.mode = mode;
        this.pattern = pattern;
        this.repeat = repeat;
    }
    public void vibrate() {
        // stuff
    }
    public void play() {
        playTheSound(mode);
    }
    public static void main(String[] args) {
        RealStrummer rs = new RealStrummer(1, new long[] {1L, 3L, 2L}, 10);
        rs.play();
    }
}

现在,您可能想要重新组织模式并重复实例变量以避免使用protected. 但是,请注意,非抽象RealStrummer定义了一个具体的vibrate方法(尽管我不知道它应该包含什么)。
Strummer可以调用它,即使它只声明它。由于您无法创建Strummer实例,所以没关系。

于 2013-05-15T12:46:27.030 回答
0

Stummer ob = new Your_class_Name () ;

// Your_class_Name= 在其中playTheSound()创建您的方法

ob.playTheSound() ;

于 2013-05-15T12:39:33.247 回答
0

当您在抽象类中声明方法抽象时,继承抽象类的类必须实现抽象方法。下面的例子:

public abstract class strummer
{
    public abstract void vibrate(long[] pattern, int repeat);
}

public class yourClass extends strummer
{
   public void playTheSound()
   {
      this.vibrate();
      ...
   }


   // The vibrate method MUST be implemented here
   // since we inherited from an abstract class!
   public void vibrate(long[] pattern, int repeat)
   {
      // write vibrate method here.
   }

}
于 2013-05-15T12:27:47.943 回答