Difference Interfaces between Abstract Classes
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
Interface vs Base class
Interface vs Abstract Class (general OO)
Abstract class vs Interface in Java
号
所以我在编程课程中学习了接口和抽象类。这两个主题似乎非常相似。我知道两者都与继承有关,但两者有什么区别?
抽象类可以在方法体中包含代码,这在接口中是不允许的。
有两个主要区别。
抽象类可以包含方法,而接口不能包含方法。
我通常这样想:
- 如果希望类强制其他类编写方法,请使用接口。
- 如果您希望一个类为多个类保存一个公共方法,请使用一个抽象类。
小精灵
例如,您可能想要创建一个
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 } |
号
另一方面,假设你有一个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 } } |
注意抽象类也可以有未定义的方法(比如接口)。所以你可以把
接口-要编写的强制方法(即强制
抽象类-为子类提供通用方法。
接口具有必须由实现它的类定义的方法。
抽象类类似。但是,在抽象类中,它可以包含继承类自动能够调用的方法定义。
底线:如果所有实现类的方法定义完全不同,则使用接口。如果继承类共享某些定义,并且对某些方法具有不同的定义,则使用抽象类。
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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 } } |