抽象类
定义:这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstract method), 包含抽象方法的类我们称为 抽象类(abstract class)。
abstract class Shape {
abstract public void draw();
}
在 draw 方法前加上 abstract 关键字, 表示这是一个抽象方法. 同时抽象方法没有方法体(没有 { }, 不能执行具体代码).
对于包含抽象方法的类, 必须加上 abstract 关键字表示这是一个抽象类
注意事项
1.抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰
2.抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。
3.抽象类中可以包含其他的非抽象方法,也可以包含字段。这个非抽象方法和普通方法的规则都是一样的, 可以被重写,也可以被子类直接调用
抽象类的好处:
抽象类存在的最大意义就是被继承
抽象类本身不能被实例化,要想使用只能创建该抽象类的子类,让子类重写抽象类中的抽象方法。
多了一重编译器的校验: 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题 。
接口
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段。而接口中包含的方法都是抽象方法, 字段只能包含静态常量
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 定义一个接口
接口中的方法一定是抽象方法, 因此可以省略 abstract,接口中的方法一定是 public, 因此可以省略 public,Cycle 使用 implements 继承接口. 此时表达的含义不再是 “扩展”, 而是 “实现”
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
3.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
4.接口可以实现多继承 ,一个类可以实现一个或多个接口,实现接口使用implements关键字
5.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
6,接口可以继承接口,用extends
注意:如果要继承父类,继承父类必须在实现接口之前,即extends关键字必须在implements关键字前
接口和抽象类的区别
核心区别:
抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写),
接口中不能包含普通方法, 子类必须重写所有的抽象方法 。