1.抽象类
1.1概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
举例:
- 蔬菜
- 动物
- 水果
- 形状
1.2语法
abstract class Shape { public abstract void draw();//可以不写方法体,也可以写 /*public void draw() { System.out.println("画图形"); }*/ } public class Test4 { public static void main(String[] args) { //Shape shape = new Shape();//抽象类 ,抽象类不能被实例化 } }
抽象类也属于类,内部可以包含普通方法和属性
既然抽象类不能被实例化,那么抽象类被用来做什么呢?
答:继承
1.3特性
1.3.1抽象方法不能被private,final,static修饰
因为抽象是指事物的共性被抽离出来,是一个概念而非具体的实现
具体的实现是由继承它的子类去完成的
当用private,final,static修饰抽象方法,子类就不能够重写draw方法了
1.3.2抽象类必须被继承,并且继承后子类要重写父类中的抽象方法
abstract class Shape { public abstract void draw(); /*public void draw() { System.out.println("画图形"); }*/ } class Rect extends Shape { @Override public void draw() { System.out.println("画矩形"); } } class Circle extends Shape { @Override public void draw() { System.out.println("画圆形"); } } class Flower extends Shape { @Override public void draw() { System.out.println("❀"); } }
1.3.3抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
此时的Cat类是一个普通类,不能包含抽象方法
1.3.4抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
abstract class Shape { public Shape() { } public abstract void draw(); /*public void draw() { System.out.println("画图形"); }*/ } class Rect extends Shape { public Rect() { super();//抽象类的构造方法 } @Override public void draw() { System.out.println("画矩形"); } }
1.4抽象类的作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类.。然后让子类重写抽象类中的抽象方法。
那普通的类也可以被继承,普通的方法也可以被重写,为什么一定要用抽象类和抽象方法呢?
答:用抽象类相当于多了编译器检验
如图:
当子类没有重写draw方法时,编译器会报错
当类为普通类时就不会报错
这是因为抽象类的主要作用是被继承