可能重复:
接口与基类
接口与抽象类(通用OO)
抽象类与Java中的接口
所以我在我的编程课程中学习接口和抽象类。这两个主题看起来非常相似。我知道它们都与继承有关,但是两者之间有什么区别?
可能重复:
接口与基类
接口与抽象类(通用OO)
抽象类与Java中的接口
所以我在我的编程课程中学习接口和抽象类。这两个主题看起来非常相似。我知道它们都与继承有关,但是两者之间有什么区别?
抽象类可以在方法体中包含代码,这在接口中是不允许的。
接口具有必须由实现它的类定义的方法。
抽象类类似。但是,在抽象类中,它可以包含继承类将能够自动调用的方法定义。
底线:如果所有实现类对方法的定义完全不同,请使用接口。如果继承类共享一些定义并且对某些方法有不同的定义,则使用抽象类。
例子:
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
}
}
抽象类可以有方法,而接口不能有它们。
我通常是这样想的:
因此,例如,您可能想要Animal
上课。然后有一个Dog
和Cat
类。狗和猫都睡觉。所以你希望他们都有一个 sleep 方法。他们的睡眠方式基本相同。因此,您希望Animal
该类保存该方法(因为它对于Dog
and是相同的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
}
另一方面,假设你有一个Snake
和Shark
类。蛇和鲨鱼都会攻击,但方式不同(毒液与咬人)。所以你可能有一个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
嘶嘶声。主要区别在于抽象类可以编写实际方法。
接口 - 强制编写方法(即强制Snake
和Shark
拥有该attack()
方法)。
抽象类 - 为子类提供通用方法。
有两个主要区别。