声明:此篇内容源自书籍<Java编程思想>
一、抽象类: 如果一个类包含一个或多个抽象方法,该类必须被定义为抽象的。
简单的抽象类如下:
public abstract class day01_5 { public abstract void f(); }
如果我们想继承一个抽象类,并想创建一个新类,那么就必须为基类中的所有抽象方法提供方法定义,如果不这样做,
那么导出类便也是抽象类,并且编译器会强制让我们用abstract关键字修饰该类
像这样。
class impl extends day01_5{ @Override public void f() { System.out.println("impl f"); } }
可以看出,抽象类就是为了继承才出现的。
包含抽象方法的类是抽象类,但并不是抽象类里不可以有普通方法,抽象类可以有自己的普通方法,自己的域。
public abstract class day01_5 { public String name = "abstract"; public void fun(){ System.out.println("fun"); } public abstract void f(); }
上述代码中,抽象类不仅有普通方法,还有属性。
所以抽象类和普通类到底有哪些不同呢。
1、抽象类不可以实例化
2、继承抽象类的导出类必须将抽象类的抽象方法进行定义,不然导出类也是抽象类
二、下面我们来说一说接口。
首先接口并不是类,而是对类的一组需求描述。
接口中的方法自动属于public,如果你用private或者protected修饰,则会报错。
接口不是类,所以也不能用new关键字去实例化一个接口,但是你可以声明一个接口的变量
接口变量必须引用实现了接口的类对象
接口中不能包含实例域或静态方法,但可以包含常量,也就是说你定的在接口中的域会被自动设为public static final。
如果你读了上述内容,你就有可能去想,为什么Java中已经有了抽类类,为什么还要引入接口呢?
很抱歉,使用抽象类存在这样一个问题,每个类只能扩展一个类。
但每个类可以实现多个接口,这样可以避免多继承的复杂性和低效性。
最后补充一点,在Java SE8中,允许在接口中增加静态方法和default方法。
interface Collection{ public int size(); default boolean isEmpty(){ return size() == 0; } public static void fun(){ System.out.println("123"); } }
三、抽象类与接口的区别
1、抽象类中的普通方法可以提供方法细节,而接口中不行,除非是default或者static方法
2、抽象类中可以有自己的成员变量,而接口中没有,只能定义public static final的常量
3、一个类只能继承一个抽象类,但是却可以实现多个接口