抽象类
1、抽象类不能直接实例化
abstract class Shape {
abstract public void draw();
}
Shape shape = new Shape(); //编译出错 Shape是抽象的,无法实例化
2、抽象方法不能有具体的实现
abstract class Shape {
abstract public void draw() {
//错误写法,抽象方法不能有具体的实现
}
}
//正确写法
abstract class Shape {
abstract public void draw();
}
3、抽象方法不能是private的
abstract class Shape {
abstract private void draw();
}
//编译出错 非法的修饰符组合:abstract和private
4、抽象类中可以包含其他的非抽象方法,也可以包含字段,这个非抽象方法和普通方法的规则都是一样的,可以被重写,也可以被子类直接调用
5、一个普通类若是继承了抽象类,一定要重写抽象类中的抽象方法
abstract class Shape {
abstract public void draw();
}
class Cycle extends Shape {
@Override
public void draw() {
System.out.println("⚪");
}
}
6、如果一个类继承了抽象类,但是又不想重写这个抽象方法,那就把这个类也设置为抽象类,但是迟早都是要重写的
接口
1、接口不能进行实例化
interface Shape {
void draw();
}
Shape shape = new Shape();//错误 接口不能进行实例化
2、接口中的方法不能有具体的实现
interface Shape {
void draw() {
//错误,接口中的方法不能有具体的实现
}
}
3、接口当中default修饰的方法才能有具体的实现
interface Shape {
default public void draw() {
}
}
4、接口当中的成员变量默认为public static final,接口当中的方法默认为public abstract,接口中的静态方法默认为public
联系与区别
No | 区别 | 抽象类 | 接口 |
1 | 结构组成 | 普通类+抽象类 | 抽象方法+全局变量 |
2 | 权限 | 各种权限 | public |
3 | 子类使用 | 使用extends关键字继承抽象类 | 使用implement关键字实现接口 |
4 | 关系 | 一个抽象类可以实现若干接口 | 接口不能继承抽象类,但接口可以使用extends关键字继承多个父接口 |
5 | 子类限制 | 一个子类只能继承一个抽象类 | 一个父类可以实现多个接口 |