抽象类:
abstract:抽象方法、抽象类的关键字
abstract class shape{ //抽象类
Public abstract void draw(){ //抽象方法
}
}
- 包含抽象方法的类叫做抽象类;
- 抽象类不能被实例化 ,即不能使用new关键字;
- 抽象类中可以有抽象方法,也可以包含其他的非抽象方法和字段.;(这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用)
- 抽象类存在的最大意义就是为了被继承的;(抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类.,然后让子类重写抽象类中的抽象方法)
- 抽象方法不能是私有(private)的;
- 抽象类一旦被非抽象的类继承就必须要重写该抽象类所包含的抽象方法;
- 如果是抽象类B继承抽象类A,那么对于抽象方法可以选择重写或者不重写;
- 如果另一个类C继承抽象类B,如果在抽象类B中对抽象方法进行了重写,则在抽象类C中不需要再重写抽象方法。
接口:
接口是抽象类的更进一步.。抽象类中还可以包含非抽象方法和字段.;而接口中包含的方法都是抽象方法, 字段只能包含静态常量。
-
接口的关键字:interface
-
接口当中的方法全部不能有具体的实例,都是抽象的方法(默认的public abstract)(接口中只能包含抽象方法.)
-
为使接口当中的方法尽量简洁,一般不写public abstract;
-
接口当中的成员变量默认都是public static final;(接口中只能包含静态常量。)
-
接口是不能被实例化的 ,不能使用关键字new;
-
接口存在的最大意义就是被继承;
-
实现接口的关键字:implements
类和接口之间的关系—>实现;
只要一个普通类实现了这个接口,那么接口当中的方法全部都要进行重写;
只要类跟接口之间存在实现的关系,它就会产生向上转型;
interface IShape {
void draw();
}
class Cycle implements IShape {
@Override
public void draw() {
System.out.println("○");
}
}
public class Test {
public static void main(String[] args) {
IShape shape = new Rect();
shape.draw();
}
}
- 为了实现多继承;( 一个子类只能继承自一个父类,但是可以实现多个接口)
- 类和接口是实现;接口和接口是继承(扩展);
interface A{
void funcA();
}
interface T{
void funcT();
}
// B是对接口A和接口T的扩展,包含了A和T的功能
// 类似于一种多继承
interface B extends A,T{
void funcB();
@Override
public void funcA(){
}
@Override
public void funcT(){
}
}
扩展(extends) vs 实现(implements):
- 扩展指的是当前已经有一定的功能了, 进一步扩充功能;
- 实现指的是当前啥都没有, 需要从头构造出来。
- 自定义类型进行排序的时候一定要实现comparable接口并且重写compareTo方法;
模拟实现排序功能时,传的参数一定是实现了comparable接口的:
public static void sort(Comparable[] array)
- 空接口:标记接口—>标志当前类可以进行克隆;
Cloneable接口当中没有抽象方法,是一个空接口;
抽象类和接口的区别:
核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写);
而接口中不能包含普通方法, 子类必须重写所有的抽象方法。