抽象类及其子类

时间:2015-12-11 08:18:51

标签: java subclass abstract

我在互联网上找到了以下代码,这可能是一个简单的问题,但您的解释对我很有帮助。

这是名为SongComponent的抽象类

public function addarray($arrayname, $array = array()) {
    $this->$arrayname = array_merge($this->$arrayname, $array);     
}

这是扩展名为SongGroup

的抽象类的类
public abstract class SongComponent {

    public void add(SongComponent newSongComponent){

        throw new UnsupportedOperationException();

    }
    public void remove(SongComponent newSongComponent){

        throw new UnsupportedOperationException();

    }

    public SongComponent getComponent(int componentIndex){

        throw new UnsupportedOperationException();

    }

    public String getSongName(){

        throw new UnsupportedOperationException();

    }

    public String getBandName(){

        throw new UnsupportedOperationException();

    }

    public int getReleaseYear(){

        throw new UnsupportedOperationException();

    }

    public void displaySongInfo(){

        throw new UnsupportedOperationException();

    }




}

我的问题是,在什么情况下,将调用add()方法和已被覆盖的抽象类的其他方法?例如,当调用导致抛出新的UnsupportedOperationException的抽象类的方法add()时?

5 个答案:

答案 0 :(得分:3)

SongComponent可能有其他具体的子类(SongGroup除外)不会覆盖add()。对于这样的子类,调用add()将执行基类实现并抛出UnsupportedOperationException异常。

SongComponent的另一种实现方法是使当前抛出UnsupportedOperationException的所有方法都是抽象的,这会强制SongComponent的任何具体子类覆盖它们。

答案 1 :(得分:2)

您可以在子类中调用其中一个重写的类,例如致电super.add()。因为这将引发UnsupportedOperationException我不建议这样做。

如果你有另一个子类,例如

 class SongWithNoComponents extends SongComponent{
      ...
   }

你没有覆盖add()那里,抛出UnsupportedOperationException,这在这种情况下是有意义的,因为这个子类不支持添加其他SongComponents

答案 2 :(得分:1)

在您的特定情况下,永远不会调用抽象版本。但是您可以创建另一个不覆盖add()的子类,这些子类将回退到抽象版本。你也可以有一个在重写方法中调用super.add()的子类。

答案 3 :(得分:1)

请记住,抽象类无法实例化,但可以调用。有关几乎完全重复的问题,请参阅link

我希望这会有所帮助。

答案 4 :(得分:1)

SongComponent的任何子类,不会覆盖add,remove方法等,将获得UnsupportedOperationException()

在您的示例中,SongGroup实现(覆盖)父类SongComponent的这些方法,并且它不会获得这些异常。如果您再实施一个课程SongGroup2SongComponent扩展UnsupportedOperationException()不会覆盖这些方法,则会获得node_modules/jquery-ui/jquery-ui.js