一、抽象类
(1)相关知识
抽象类是包含抽象方法的类;抽象方法没有方法体。
注意:
- 抽象方法不能实例化
- 抽象方法不能是private
- 抽象类可以包含其他的非抽象方法,也可以包含字段。这个非抽象方法和普通方法的规则是一样的,可以被重写,也可以被子类直接调用。
抽象类的最大作用解释为了被继承。抽象类本身不能被实例化,要想使用,只能创建该抽象类的子类,然后让子类重写抽象类中的抽象方法。
使用抽象类的的场景:实际工作不应该由父类完成,而应该由子类完成,那么此时如果不小心误用成父类了,使用普通类编译器是不会报错的,但是父类是抽象类就会在实例化的时候提示错误,让我们尽早发现问题。
(2)举例
建立一个抽象类
abstract public class Shape {
abstract public void draw();
}
继承并实现这个draw方法
public class Circle extends Shape{
@Override
public void draw() {
System.out.println("⚪");
}
}
测试
public class Test {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
}
}
二、接口
(1)相关知识
接口是抽象类的更进一步,抽象类中还可以包含非抽象方法和字段,而接口中的方法都是抽象方法,字段只能包含静态常量。
- 接口中方法一定是抽象方法,因此可以省略abstract
- 接口中的方法一定是public,因此可以省略public
- 接口不能被单独实例化
- 使用interface定义一个接口
总结:抽象类和接口的区别?
抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写)而接口中不能包含普通方法,子类必须重写所有的抽象方法。
抽象类仍然要遵守“单继承”这样的规则。一个类无法同时继承两个抽象类。接口和单继承无关,一个类可以实现多个接口。
(2)举例
建立一个接口
public interface IShape {
void draw();
}
实现这个接口
public class Circle implements IShape {
@Override
public void draw() {
System.out.println("⚪");
}
}
测试
public class Test {
public static void main(String[] args) {
IShape shape = new Circle();
shape.draw();
}
}