为什么使用抽象类而不是接口?

sug*_*nya 8 java oop abstract-class interface

例如,房地产建造者正在建造一个有许多单位的公寓.除卧室外,公寓的所有客房均采用相同的设计.卧室设计留给拥有公寓的人们,即; 床的房间可以是不同的设计,适合不同的公寓.

我可以通过以下abstract类来实现这一点:

public abstract class Flat
{
    //some properties

    public void livingRoom(){
       //some code
    }

    public void kitchen(){
       //some code
    }

    public abstract void bedRoom();

    }
}
Run Code Online (Sandbox Code Playgroud)

implementation类是如下:

public class Flat101 extends Flat
{
    public void bedRoom() {
        System.out.println("This flat has a customized bedroom");
   }        

}
Run Code Online (Sandbox Code Playgroud)

或者,我可以使用interface而不是abstract类来实现相同的目的,如下所示:

class Flat
{
  public void livingRoom(){ 
       System.out.println("This flat has a living room");
  }

  public void kitchen(){
     System.out.println("This flat has a kitchen");
  } 
}

interface BedRoomInterface
{
  public abstract void bedRoom();
}

public class Flat101 extends Flat implements BedRoomInterface
{
   public void bedRoom() {
    System.out.println("This flat has a customized bedroom");
   }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是:为什么应该选择使用interface(或)为什么我应该选择使用abstract类?

Ken*_*hoi 6

这取决于您的意图或用例.但总的来说,你应该更喜欢接口而不是抽象类(Bloch的Effective Java中的第18项).抽象类更脆弱,因为有人可能会修改抽象类来改变从中扩展的其他类的行为(这是一般性陈述).

使用接口更灵活,因为如果你有BedroomInterface和LivingRoomInterface,那么你可以让FlatInterface实现两个接口,然后Flat101实现类实现FlatInterface(而不是从Flat扩展然后实现接口).这看起来更清晰,后来你可以拥有ExecutiveFlatInterface,不仅有卧室和起居室,还有猜测空间,那么Flat102可以实现它.

选项2是让Flat101从Flat延伸,然后Flat实现BedroomInterface和LivingRoomInterface.这实际上取决于您想要做什么以及可能需要哪些方法.