如何在抽象类中访问方法

时间:2015-01-26 20:53:39

标签: java

我有一个抽象类NoiseMaker,我想从Test类访问一个抽象方法makeNoise。我需要将som代码放在doSomething方法中。我只是无法弄清楚要写什么。我想要输出 “尖叫出来:ROAR”

public interface MakeNoiser{
    public void doSomething();
}



public class Test implements MakeNoiser {
    public Test() {}

    public void setNoiseMaker(NoiceMaker nm) {
       nm.makeNoise();
    }

    @Override
    public void doSomething() {
        //What to write in this method to print out "ROAR"?
    }

    public static void main(String[] args) {
        Test t = new Test();
        t.setNoiseMaker(new Scream("ROAR"));
        t.doSomething();
    }    
}



public abstract class NoiseMaker {
    private String noiseName;

    public NoiseMaker(String noiseName) {
        this.noiseName= noiseName;
    }

    public abstract void makeNoise();

    public String getNoiseName() {
        return noiseName;
    }    
}



public class Scream extends NoiseMaker {    
    public Scream(String noiseName) {
        super(noiseName);
    }

    @Override
    public void makeNoise() {
        System.out.println("Scream out load: ");
    }    
}

4 个答案:

答案 0 :(得分:2)

你真的就在那里。你只是忘了在被覆盖的方法中打印出声音。

@Override
public void makeNoise() {
    System.out.println("Scream out load: " + getNoiseName());
}

doSomethingNoiseMaker没有任何关系,所以如果你想做的就是打印出一些噪音,我不知道为什么你会要求这个功能。

我会将拼写错误作为您需要解决的真正问题(NoiceMaker而不是NoiseMaker),但在添加getNoiseName()调用后,其余代码应该可以正常工作

答案 1 :(得分:1)

这是如何在java中使用抽象类。

public class Main {

    public static void main(String[] args) {

        Sounds s = new Sounds() {

            @Override
            public void lol() {
                System.out.print("hi");
            }

        };
        s.lol();
    }

}

abstract class Sounds {
    public abstract void lol();
}

答案 2 :(得分:1)

首先,我发现您的Test课程存在问题。您实施setNoisemaker,但未存储对该NoiseMaker的引用(例如private NoiseMaker myNoiseMaker;中有Test)。因此,您以后无法访问NoiseMaker(在本例中为Scream),以便在其上调用makeNoise()

我会添加上面显示的myNoiseMaker字段,然后在setNoiseMaker()中添加this.myNoiseMaker = nm;。然后,您可以在myNoiseMaker.makeNoise();中致电doSomething()

最后 - 要将“ROAR”附加到您的对帐单,您需要在+ getNoiseName()的{​​{1}}方法中添加makeNoise()

<强> 修改

重新阅读,我想你可能想在Scream方法中附加“ROAR”。在这种情况下 - 我会这样做(所有其他代码保持不变):

doSomething()

答案 3 :(得分:0)

只是从抽象类继承并覆盖抽象方法。你不能调用抽象方法,必须重写它们。

public class Test extend NoiseMaker { public void makeNoice() { System.out.println('hallo'); } }

不需要@Override注释。没有它它会工作。