一,抽象类的概述
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果有一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,举个例子:比如我现在有个Animal类,此时我定义一个action方法去概括这些动物们行为习惯,比如🐦会飞,🐕会跑,🐟会游,,但当你想通过一个动物的行为去找到具体的动物时,又非常的困难,因为大部分的动物都会飞、跑、游。所以此时的信息,不足以让Animal这个类给出具体的对象,我们就不能实例化Animal。只有当一个类中给出的信息足够时,我们才能去实例化这个类,就例如:我有Dog这个类,我在这个类中定义了name、age、color、sex等属性,此时的信息足够全面,我们就可以实例化该对象,就像下面这个代码:
class Dog{
public int age;
public String name;
public String sex;
public String color;
}
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
二、抽象方法
1、抽象方法的描述
1. 在Java中,我们通过在类的前面添加关键字abstract(抽象)来定义一个抽象类。就像下面这个代码一样:
这里请注意抽象方法是不能被实例化的,如图所示:
2.我们将“只有方法声名,没有方法体”的一类方法叫做抽象方法 ,就是用关键字abstract修饰。需要注意的是,如果一个方法已经确定是抽象方法,那么它绝不能再有方法体,即不能出现大括号,而是在它的后面加个()就ok了。如图所示:
还有一点值得注意的是:如果这个类中已经有抽象方法了,那么定义它的这个类也必须是抽象类了 ,如图:
也就是:拥有抽象方法的类一定是抽象类,但是抽象类不一定拥有抽象方法。
2、抽象方法的特点
- 当一个普通的类 继承了这个抽象类之后,这个普通类一定要重写这个抽象类当中 所有的抽象方法
如图所示:
如果不进行重写的话,则idea会报错:
那么有人会问如果重写的方法比较多咋办?
我的回答是简单:直接按下快捷键Alt+insert,就会跳出下面这几个选项,选择重写方法,然后选择你要重写的对象即可。
抽象方法不能被 private 和 static 修饰,因为定义抽象方法的目的就是将方法的具体实现延迟子类,最终是要被子类重写,但被这些修饰后,将不能进行重写。
final 和 abstract 是不能同时存在的。因为抽象类既然不能实例化对象,那么抽象类只能被继承,但当那个父类被final修饰过后,是不可以被继承的,所以二者不可以同时出现
如果你不信,非要试试,就会出现下面这种情况:
3、抽象类的成员:
3.1成员变量:
- 抽象类既可以有静态的成员变量,也可以有非静态的成员变量
- 既可以有静态的成员常量,也可以有非静态的成员常量
3.2成员方法:
- 抽象类既可以有(非私有的)抽象方法(注意抽象方法一定是非私有非静态非final,因为abstract关键字与private关键字,static关键字,final关键字不能同时存在);
- 也可以有非抽象方法(非抽象方法就可以用private,final和static关键字来修饰了,具体使用时,根据实际需求合理应用)
3.3构造器:
- 抽象类可以和非抽象类一样拥有构造器,并且支持构造器的重载
3.4 总结:
以上均为废话
大家只要记住抽象方法要在子类重写即可,还要记住重写方法的格式就欧克了
三、练习
讲了这么多,也没有写一份完整的代码,那么接下来,我就手把手教大家如何去写。
那我们就以图形为例:
1,首先我们来定义一个类叫做:Shape,这个Shape这个类是一个大类,所以我们就把它定为抽象类,如图:
2,那我想在这个类当中画出一个矩形,一朵花,那我们就在这个抽象类当中来定义一个抽象方法draw,如图:
3,那么接下来我们就开始写子类,既然我们要打印出矩形和花,那我们不妨以Rect和Flower来分别命令两个子类,并对其进行重写,如图:
4,接下来,我们来开始编写启动项的代码:
这里我们就开始实例化两个子类,并调用我们的draw方法,如图:
输出结果,如图所示:
完整版代码:
abstract class Shape{
public abstract void draw();//被abstract修饰的方法,称为抽象方法,该方法可以没有具体的实现
}
class Rect extends Shape{
@Override
public void draw() {
System.out.println("矩形");
}//重写了抽象方法。ALT+INSERT
}
class Flower extends Shape{
@Override
public void draw() {
System.out.println("❀");
}
}
public class Test {
public static void main(String[] args) {
Rect rect = new Rect();
rect.draw();
Flower flower = new Flower();
flower.draw();
}
}