我还是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);
}
答案 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
实例,这没关系。