写在开头
在面向对象的概念中,所有的对象都是通过类来描绘的,
但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
今天我们说一下Java:抽象类
抽象的概述
抽象即无法描述的
抽象方法的定义方法
- 抽象方法只有声明,没有方法主体,需要添加abstract修饰符
- 抽象方法存在的意义,就是等子类来重写,所以没有方法主体 ,只有声明
1 | // 抽象方法 |
抽象类
抽象类中不一定有抽象方法,但是有抽象方法的一定是抽象类
1 | // 抽象类 |
抽象的特点
抽象类和抽象方法,都必须使用abstract 关键字
抽象方法一定要写在抽象类中,抽象类中不一定含有抽象方法
1) 抽象类中,可以没有抽象方法
2) 抽象类中,可以有抽象方法,也可以全是抽象方法抽象类,不能实例化对象,不能new
为什么抽象类,不能new(Animal是抽象类,里面定义了eat()抽象方法)
原因: 如果可以new抽象类,
Animal a = new Animal(); a.eat();
上述案例中: eat() 方法不能执行,因此a.eat()报错,于是,抽象类一律不能实例化对象抽象类和抽象方法的实现
抽象类存在的意义: 就是需要子类来继承
抽象方法存在的意义: 就是需要子类重写
抽象类中普通方法存在的意义: 普通方法,可以让子类直接继承抽象类和抽象方法其实是一种限制,一种编程思路:
例如: 但凡是动物,就都需要吃饭,抽象类,可以是一种规则子类继承了抽象类,尽量要求子类将父类中的所有抽象方法全部重写
1) 如果子类将抽象类中所有抽象方法全部重写,这个子类,就是普通类,实例化子类对象,
通过对象名,调用重写的方法.
2) 如果子类,没有将父类中的所有抽象方法全部重写(一个都没重写,重写一部分),子类就是一个抽象类(抽象方法可以继承),这个子类,不能实例化对象子类重写父类抽象方法注意:
1. 方法名,参数列表,返回值与父类方法一致,权限大于等于父类 2. 去掉abstract关键字 3. 去掉方法声明后面的;然后给方法加上方法体{}
抽象类也可以作为方法的参数和返回值,抽象类也可以使用多态
代码1
1 | // 抽象类 |
1 | // 子类继承抽象类AnimalAbs |
代码2
1 | // 抽象类的测试 |
抽象类中的成员
- 成员变量,private,static,普通成员
抽象类名.静态变量; - 构造方法
原因: 一个类中,有没有构造方法,跟类中能否定义成员变量,有关,与是不是可以实例化对象无关.
抽象类: 就是为了当父类,子类有构造方法,子类构造的第一行,默认隐式super();调用父类中的空参数构造方法 - 方法: 普通方法,抽象方法,静态方法
- 抽象: abstract
修饰类,等着被继承
修饰方法,等着被重写
abstract不能修饰成员变量
总结
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
晚安
今天就到这里了,明天见,加油!