抽象类
-
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
-
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样
-
用abstract修饰的类就是抽象类
-
如果某个类中包含有抽象方法,那么该类就必须定义成抽象类
-
如果一个类是抽象类,但不一定有抽象方法
-
构造方法和静态方法不可以修饰为abstract
抽象方法
- 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现
- 抽象方法必须用abstract关键字进行修饰
如果一个继承了抽象类:
- 要么重写抽象类中的所有方法
- 要么将当前类也声明为抽象类
抽象类不能创建对象
接口
- 使用interface关键字实现接口
- jdk8以后接口还可以定义静态方法,默认方法
- 接口中的默认方法可以通过子类对象访问
- 静态方法还是通过接口名访问
public interface MyInterface {
int num = 10; //所有属性默认为: public static final
public void foo();//所有方法都是:public abstract
//其他方法
}
接口特性
- 接口不可以被实例化
- 实现类必须重写接口中的所有方法
- 实现类可以实现多个接口
- 接口中的变量都是静态常量
接口存在的意义
java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现
接口的定义
interface关键字用来声明一个接口
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n] {
// 声明常量
// 抽象方法
}
接口的使用
类使用implements关键字实现接口。
在类声明中,Implements关键字放在class声明后面。
[访问修饰符] class 类名 implements 接口名1,接口名2……{ }
接口的特性
- 接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字
- 接口中每一个方法也是隐式抽象的,默认为public abstract
- 接口中声明的属性默认为public static final 的
- 接口不是被类继承了,而是要被类实现
- 接口不能实例化对象(无构造方法),但可以声明对象的引用(多态性)
- 多个类可以实现同一个接口
- 一个类可以实现多个接口,但只能继承一个类
- 与继承关系类似,接口与实现类之间存在多态性
- 一个接口能继承其它多个接口
- 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类
接口与抽象类的区别
语法上的区别
- 抽象类里可以有构造方法,而接口内不能有构造方法
- 抽象类中可以有普通成员变量,而接口中不能有普通成员变量
- 抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的
- 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public 、abstract类型
- 抽象类中可以包含静态方法,接口内不能包含静态方法
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义
静态常量
相同点
抽象类和接口都不能用来创建对象