如何在抽象类中调用函数?

时间:2013-05-15 12:18:51

标签: java android methods abstract vibrate

我还是Java的新手,有些概念仍然让我感到困惑。我想在我的主班上的strummer班中振动。振动方法不能存在于我的主类中,因为它是一种抽象方法(我假设)。我想从我的主类调用这个方法,但我不知道如何,因为我得到“静态引用非静态方法”错误。我有一个非常基本的想法,为什么这不起作用,但我需要知道如何调用这个方法假设它不会在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 个答案:

答案 0 :(得分: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.
   }
}

答案 1 :(得分: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.
   }

}

答案 2 :(得分:0)

Stummer ob = new Your_class_Name();

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

ob.playTheSound();

答案 3 :(得分: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实例,这没关系。