0

可能重复:
接口与基类
接口与抽象类(通用OO)
抽象类与Java中的接口

所以我在我的编程课程中学习接口和抽象类。这两个主题看起来非常相似。我知道它们都与继承有关,但是两者之间有什么区别?

4

4 回答 4

1

抽象类可以在方法体中包含代码,这在接口中是不允许的。

于 2012-11-08T22:10:28.217 回答
0

接口具有必须由实现它的类定义的方法。

抽象类类似。但是,在抽象类中,它可以包含继承类将能够自动调用的方法定义。

底线:如果所有实现类对方法的定义完全不同,请使用接口。如果继承类共享一些定义并且对某些方法有不同的定义,则使用抽象类。

例子:

public interface Shape {
    public float getArea();
    public void doThings();
}

public class Circle implements Shape{
    public float getArea() {
        return Math.PI * R * R;
    }

    public void doThings() { }
}

public abstract class Quadilateral implements Shape {

    public float getArea() { // defined
    return l * h;
    }

    public abstract void doThings(); // left abstract for inheriting classes
}

public class Rectangle extends Quadilateral {
    public void doThings() {
    // does things
    }
}

public class Parallelogram extends Quadilateral {
    public void doThings() {
    // does things
    }
}
于 2012-11-08T22:14:26.630 回答
0

抽象类可以有方法,而接口不能有它们。

我通常是这样想的:

  • 如果你想让一个类强制其他类写方法,使用接口。
  • 如果您希望一个类为多个类保存一个公共方法,请使用抽象类。

因此,例如,您可能想要Animal上课。然后有一个DogCat类。狗和猫都睡觉。所以你希望他们都有一个 sleep 方法。他们的睡眠方式基本相同。因此,您希望Animal该类保存该方法(因为它对于Dogand是相同的Cat

public abstract class Animal {
    public void sleep() {
        //make ZZZZ appear in the air or whatever
    }
}

public class Dog extends Animal {
    //This class automatically has the sleep method
}

public class Cat extends Animal {
    //This class automatically has the sleep method
}

另一方面,假设你有一个SnakeShark类。蛇和鲨鱼都会攻击,但方式不同(毒液与咬人)。所以你可能有一个Attacker接口。

public interface Attacker {
    //We HAVE to have this here
    public void attack(); //Note - we didn't write the method here, just declared
}

public Snake implements Attacker {
    //We HAVE to have this here
    public void attack() {
        //inject venom
    }
}

public Shark implements Attacker {
    public void attack() {
        //rip apart
    }
}

请注意,抽象类也可以有未定义的方法(如接口)。所以你可以public void makeMeanSound();进去Animal然后有Dog咆哮和Cat嘶嘶声。主要区别在于抽象类可以编写实际方法。

接口 - 强制编写方法(即强制SnakeShark拥有该attack()方法)。

抽象类 - 为子类提供通用方法。

于 2012-11-08T22:18:41.177 回答
0

有两个主要区别。

  1. 接口不能包含任何实现。接口只是抽象方法的列表,实现该接口的所有类都必须实现所有这些方法。另一方面,抽象类可以包含一些方法的实现,然后子类可以使用这些方法。
  2. 一个类只能有一个超类,无论是抽象的还是其他的,但是一个类可以实现任意数量的接口。
于 2012-11-08T22:24:54.047 回答