接口与抽象类的异同
| 变量 | 构造方法 | 方法 |
---|
抽象类 | 无限制 | 子类通过构造方法链调用构造方法,抽象类不能用new操作符进行实例化 | 无限制 |
接口 | 所有变量必须是public static final | 没有构造方法。接口不能用new操作符实例化 | 可以包含public 的抽象实例方法、public的默认方法以及public的静态方法 |
归纳
相同点:
- 都不能用new 操作符实例化
- 都是用来指定多个对象的多个特征
- 使用方法差不多 子类可以重写方法
- 接口可以为不相关类定义父类型 更灵活
不同点
- 接口的方法和变量有是有限定的 (所有变量必须是public static final,方法可以是public 的抽象实例方法、public的默认方法以及public的静态方法 ) 而抽象类没有限制
- 接口没有构造方法 而抽象类有用于子类继承调用
注意点
- 接口可以继承其他接口但不能继承类
- 一个接口类型的变量可以引用任何实现该接口的类的实例
- 父子关系强的应该用类建模 而弱的“是一种…"关系(类属关系)应该用接口建模
抽象类和接口的具体应用例子
package xx;
public class TestEdible {
public static void main(String[] args) {
Object[] objects = {new Tiger(), new Chicken()};
for(int i = 0; i < objects.length; i++) {
if(objects[i] instanceof Edible)
System.out.println(((Edible)objects[i]).howToEat());
if(objects[i] instanceof Animal)
System.out.println(((Animal)objects[i]).sound());
}
}
}
interface Edible {
public abstract String howToEat();
}
abstract class Animal{
private double weight;
public double getWeight() {
return weight;
}
public abstract String sound();
}
class Chicken extends Animal implements Edible{
@Override
public String howToEat() {
return "Chicken: Fry it";
}
@Override
public String sound() {
return "Chicken: cock-a-doodle-doo";
}
}
class Tiger extends Animal {
@Override
public String sound() {
return "Tiger: RROOAARR";
}
}
输出结果