6、抽象类
在面向对象中,所有的对象都是通过类来实例化出来的。
但是并不是所有的类,都可以用来实例化一个对象的。
这就是 抽像类。
# 抽象类
语法:
abstract class{
private String name; //可以有自己的普通变量
default void testAmethod() {//可以有自己的普通方法
}
abstract method(); //抽象方法一定是 ; 结尾,没有{}方法体
}
abstract 关键字表示抽象类
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
既然是抽象类,它描述的内容都是抽象的,而对象是具体的,自然而然就无法实例化了。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用,这就是抽象类的意义,在上一个例子中:
public class Car {
void drive() {
System.out.println("平平无奇地开车");
}
}
class WuLingHongGuang extends Car {
@Override
void drive() {
System.out.println("我在开五菱宏光");
}
}
基本上不会使用
Car car = new Car();
car.drive(); //平平无奇地开车
这种方法去使用Car
类。
那我就无须写这个方法了:
void drive() {
System.out.println("平平无奇地开车");
}
反正也没什么类要调用。
哈C我在考驾照前,根本不懂车是怎么开的, 驾校的车是台桑塔纳,教练和我说开车要先系安全带、然启动、拉手刹,巴拉巴拉一大堆,最后才能开车。
public class Car {
void drive() {
System.out.println("系安全带");
System.out.println("启动");
System.out.println("拉手刹");
//TODO
System.out.println("平平无奇地开车");
}
}
我暴富的那一天,我买回来的宝马,它没有拉杆手刹,因为它有电子档位,我也不需要盯着后视镜倒车,因为它有自动泊车功能。
这和教练说的不太一样,他说的太具体了,我的宝马不是这样的,教练欺骗了我.....
我现在只需要它是可以 开(drive()
) 就可以了,剩下的步骤我自己研究我的宝马就可以了~
我们可以使用抽象类来处理Car
:
public abstract class Car {
abstract void drive();
}
class BaoMa extends Car {
@Override
void drive() {
System.out.println("系安全带");
System.out.println("启动");
System.out.println("我在开宝马");
}
}
class Test{
public static void main(String[] args) {
// Car car = new Car(); //不能实例化,会报错
BaoMa baoMa = new BaoMa();
baoMa.drive();
}
}
这样 抽象类只需要告诉子类定义的方法,你只需要按照我的方法去重写就可以了,具体实现什么功能、怎么做,留给子类自己实现。
# 总结
抽象类特点:
抽象类是抽象的,不是具体的,所以抽象类不能被实例化。但是它仍然具有类的功能,成员变量、成员方法和构造方法的访问方式和普通类一样,也可以实现接口、继承类。
由于抽象类不能实例化对象,所以抽象类必须被继承,除非该子类也是抽象类。(不然抽象就没意思了)。所以,类的声明、方法体 就不能使用
final
去修饰,final表示不可继承和修改,但是变量可以使用final修饰。(static 表示常量,final 表示不可改变,而抽象方法是一定要被重写的)如果一个类包含抽象方法,那么该类必须是抽象类。(但是抽象类可以有非抽象方法)。
抽象类中的抽象方法的访问类型可以是public,protected、默认类型。
构造方法不能声明为抽象方法。
eg:
public abstract class Employee extends Person implements People{
{
public final String a ="1";
static {
System.out.println("我是抽象类的static代码块");
}
public static void test(){
System.out.println("我是抽象类的static方法");
}
public abstract void abstrartMethod();
public void abstrartMethod2() {
System.out.println("抽象类也可以拥有非抽象方法");
}
}