摘要 Class 及其子类
Abstract Class and Its Subclass
我有以下代码是我在网上找到的,这可能是一个简单的问题,但你的解释对我有很大帮助。
这是名为 SongComponent
的抽象 class
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();
}
}
这是扩展名为 SongGroup
的摘要 class 的 class
import java.util.ArrayList;
import java.util.Iterator;
public class SongGroup extends SongComponent {
ArrayList songComponents = new ArrayList();
String groupName;
String groupDescription;
public SongGroup(String newGroupName, String newGroupDesc){
groupName = newGroupName;
groupDescription = newGroupDesc;
}
public String getGroupName(){
return groupName;
}
public String getGroupDescription(){
return groupDescription;
}
// It overrides the add() method from its superclass
public void add(SongComponent newSongComp){
songComponents.add(newSongComp);
}
public void remove(SongComponent newSongComp){
songComponents.remove(newSongComp);
}
public SongComponent getComponent(int compIndex){
return (SongComponent)songComponents.get(compIndex);
}
public void displaySongInfo(){
System.out.println( getGroupName() + " " +
getGroupDescription());
Iterator songIterator = songComponents.iterator();
while(songIterator.hasNext()){
SongComponent songInfo = (SongComponent)songIterator.next();
songInfo.displaySongInfo();
}
}
}
我的问题是,在什么情况下,add()方法和其他被抽象class覆盖的方法会被调用?例如,当导致抛出 new UnsupportedOperationException 的抽象 class 的方法 add() 将被调用时?
SongComponent
可能有其他不覆盖 add()
的具体子 class(SongGroup
除外)。对于这样的子 classes,调用 add()
将执行基础 class 实现并抛出 UnsupportedOperationException
异常。
SongComponent
的另一种实现方式是将当前抛出 UnsupportedOperationException
的所有方法抽象化,这将强制 SongComponent
的任何具体子 class覆盖它们。
在您的特定情况下,永远不会调用抽象版本。但是您可以创建另一个不覆盖 add()
的子类,该子类将回退到抽象版本。您还可以有一个子类在重写方法中调用 super.add()
。
您可以在您的子类中调用被覆盖的 类 之一,例如通过调用 super.add()
。因为这会引发 UnsupportedOperationException
我不建议这样做。
如果您有另一个子类,例如
class SongWithNoComponents extends SongComponent{
...
}
并且您不在那里覆盖 add()
,抛出 UnsupportedOperationException
,这在这种情况下是有意义的,因为此子类不支持添加其他 SongComponents
。
记住抽象class不能实例化但可以调用。对于几乎完全相同的重复问题,请参考 link
希望对您有所帮助。
SongComponent
的任何子 class,如果不覆盖 add,remove
方法等,将获得 UnsupportedOperationException()
。
在您的示例中,SongGroup
实现(覆盖)了父 class SongComponent
的这些方法,但它没有得到这些异常。如果你再实现一个 class 说 SongGroup2
扩展 SongComponent
不会覆盖这些方法,将得到 UnsupportedOperationException()
我有以下代码是我在网上找到的,这可能是一个简单的问题,但你的解释对我有很大帮助。
这是名为 SongComponent
的抽象 classpublic 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();
}
}
这是扩展名为 SongGroup
的摘要 class 的 classimport java.util.ArrayList;
import java.util.Iterator;
public class SongGroup extends SongComponent {
ArrayList songComponents = new ArrayList();
String groupName;
String groupDescription;
public SongGroup(String newGroupName, String newGroupDesc){
groupName = newGroupName;
groupDescription = newGroupDesc;
}
public String getGroupName(){
return groupName;
}
public String getGroupDescription(){
return groupDescription;
}
// It overrides the add() method from its superclass
public void add(SongComponent newSongComp){
songComponents.add(newSongComp);
}
public void remove(SongComponent newSongComp){
songComponents.remove(newSongComp);
}
public SongComponent getComponent(int compIndex){
return (SongComponent)songComponents.get(compIndex);
}
public void displaySongInfo(){
System.out.println( getGroupName() + " " +
getGroupDescription());
Iterator songIterator = songComponents.iterator();
while(songIterator.hasNext()){
SongComponent songInfo = (SongComponent)songIterator.next();
songInfo.displaySongInfo();
}
}
}
我的问题是,在什么情况下,add()方法和其他被抽象class覆盖的方法会被调用?例如,当导致抛出 new UnsupportedOperationException 的抽象 class 的方法 add() 将被调用时?
SongComponent
可能有其他不覆盖 add()
的具体子 class(SongGroup
除外)。对于这样的子 classes,调用 add()
将执行基础 class 实现并抛出 UnsupportedOperationException
异常。
SongComponent
的另一种实现方式是将当前抛出 UnsupportedOperationException
的所有方法抽象化,这将强制 SongComponent
的任何具体子 class覆盖它们。
在您的特定情况下,永远不会调用抽象版本。但是您可以创建另一个不覆盖 add()
的子类,该子类将回退到抽象版本。您还可以有一个子类在重写方法中调用 super.add()
。
您可以在您的子类中调用被覆盖的 类 之一,例如通过调用 super.add()
。因为这会引发 UnsupportedOperationException
我不建议这样做。
如果您有另一个子类,例如
class SongWithNoComponents extends SongComponent{
...
}
并且您不在那里覆盖 add()
,抛出 UnsupportedOperationException
,这在这种情况下是有意义的,因为此子类不支持添加其他 SongComponents
。
记住抽象class不能实例化但可以调用。对于几乎完全相同的重复问题,请参考 link
希望对您有所帮助。
SongComponent
的任何子 class,如果不覆盖 add,remove
方法等,将获得 UnsupportedOperationException()
。
在您的示例中,SongGroup
实现(覆盖)了父 class SongComponent
的这些方法,但它没有得到这些异常。如果你再实现一个 class 说 SongGroup2
扩展 SongComponent
不会覆盖这些方法,将得到 UnsupportedOperationException()