Java学习笔记之---比较接口与抽象类
抽象类是描述事物的本质,接口是描述事物的功能
接口与抽象类的异同
1.一个类只能继承一个父类,但是可以有多个接口
2.抽象类中的抽象方法没有方法体,但是可以有非抽象方法;接口中的方法没有方法体,但是可以通过default或者static拥有方法体
3.如果子类不能重写父类中的抽象方法和接口中的方法,可以把子类变为abstract修饰的
4.子类重写父类的方法时形参不能改变,返回值类型不能改变
5.抽象类中可以包含构造函数,但是接口中不能出现构造函数
6.接口中只能定义静态常量,而抽象类中即可以定义静态常量属性,也可以定义普通属性
7.由default或者static修饰的接口内的方法可以不被子类重写,也可以有方法体
举一个例子:保温杯是水杯,所以水杯应该设计成抽象类,保温杯的功能是保温,所以保温应该设计为接口
实例:杯子类为抽象类,保温和喝为接口,保温杯为子类
public abstract class Cup {
private static String name;
private String color;
//抽象类中可以包含构造函数,但是接口中不能出现构造函数
public Cup(){ }
public Cup(String name,String color){
this.setName(name);
this.setColor(color);
}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
}
public abstract void decorate();
//抽象类中的抽象方法没有方法体,但是可以有非抽象方法
public void lid(){
System.out.println("杯子有盖子");
}
}
public interface Drink { //由default或者static修饰的接口内的方法可以不被子类重写,也可以有方法体 public default void eat(){ System.out.println("杯子可以喝水"); } }
public interface Vacuum { //接口中只能定义静态常量 static int i=1; public void warm(); }
//一个类只能继承一个父类,但是可以有多个接口 public class VacuumCup extends Cup implements Drink,Vacuum{ public VacuumCup(){ } public VacuumCup(String name,String color){ super(name,color); } @Override //子类重写父类的方法时形参不能改变,返回值类型不能改变 public void decorate(){ System.out.println("装饰桌子"); } @Override public void warm(){ System.out.println("杯子可以保温"); } } class CupTest{ public static void main(String[] args){ Cup a=new VacuumCup("aa","red"); System.out.println(a.getName()+":"+a.getColor()); a.decorate(); ((VacuumCup) a).warm(); a.lid(); } }
运行结果:
aa:red
装饰桌子
杯子可以保温
杯子有盖子