Java面向对象基础 --- 抽象类

227 阅读2分钟

这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

前言

抽象类在java中是使用非常广泛的,在源码中经常会遇到抽象类,并且抽象类也是我一直想拿出来讲,拿出来复习的一个点。

image.png

抽象类特性

抽象类可以和类一样拥有类的特征

可以从下面的类看出抽象类拥有类的属性和类的方法的,它是可以作为一个正常的类使用的,但是有个前提,这个前提请看下一个标题。

public abstract class Car {

    String carName;

    String carNubmer;

    public void run(){
        System.out.println("Run Car!!");
    }

}

无法new,无法实例化

在java中类是不允许多继承的,只可以一个类实现多个,而我们的抽象类它很特殊,它是一个类但是它有很多被限定的地方比如下面这个:

image.png 可以看到在编译的时候就在报错了

实现一

如果你就是不想继承他就像在这个类下实现,你可以用内部类来实现,但其本质还是没有实例化抽象类,实例的只不过是不是抽象的匿名实例继承抽象对象从而可以使用这种方式来new Car。

Car car = new Car() {
    @Override
    public void run() {
        super.run();
    }
};

实现二

WuLing通过继承抽象类Car来实现抽象类的内容。一般使用这种实现方式会比较常用。

WuLing wuLing = new WuLing();
wuLing.run();
Car car1 = new WuLing();
car1.run();
public class WuLing extends Car {


    @Override
    public void run() {
        System.out.println("WuLing Run!!");
    }
}

只有方法可以抽象

相信大家也看到了在抽象类与类不同的地方是在定义的时候,抽象类在定义类时被加上了一个abstract字段,注意,这字段只能作用在类和方法上,作用在类上时这个类就是个抽象类,那么他就无法被实例化。而定义在方法上这个抽象类就无法拥有方法体,也就是无法在抽象类中修改方法主题内容。这就相当于把方法的实现交给了继承该类的对象去实现方法。在我看来这相当于一种约束,约束了下面的子类共同都要实现这个特征,也可以扩展自己的特征。


public abstract class Car {

    String carName;

    String carNubmer;
//与上面相比他缺少了方法体,写方法体会报错
    public abstract void run();

}
public class WuLing extends Car {


    @Override
    public void run() {
        System.out.println("WuLing Run!!");
    }
}

WuLing依旧可以实现他的方法,从而达到第二点所说的实例化。

总结

  1. 抽象类是不可以实例化的!!!
  2. 抽象类的方法可以约束子类都要实现这个特征
  3. 抽象字段只能加载方法上,使其变为抽象方法,并且这个方法不能拥有方法体