1. 抽象类

1.1 抽象类是什么

💢💢在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。


我们先来看一个简单的例子🌰


// 抽象类和抽象方法需要被 abstract 关键字修饰

abstract class Animal {

   // 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体

   abstract void eat();

   // 抽象类也是类,也可以增加普通方法和属性

   public double getArea(){

       return area;

   }

   protected double area; // 面积

}

初看上面是不是没啥问题,但是当我们对这个类进行实例化的时候,就会发现:




像这样的类是不是就没有包含足够的信息来描绘一个具体的对象,因此也就不能直接去实例化对象了。那我们应该怎么解决这个实例化问题呢?


// 抽象类和抽象方法需要被 abstract 关键字修饰

abstract class Animal {

   // 抽象类中的方法一般要求都是抽象方法,抽象方法没有方法体

   abstract void eat();

   // 抽象类也是类,也可以增加普通方法和属性

   public double getArea(){

       return area;

   }

   protected double area; // 面积

}

public class Test{

   public static void main(String[] args) {

       Animal animal = new Animal() {

           @Override

           void eat() {

               System.out.println("重写");

           }

       };

   }

}

只需要对 abstract类的抽象方法实例化之后进行重写即可。


注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法


1.2 抽象类特性

🍉抽象类不能直接实例化对象,无法创建对象,抽象类是被子类来继承的


Animal animal = new Animal();

// 编译出错

Error:(30, 23) java: Animal是抽象的; 无法实例化

🥑抽象方法不能是 private 的


abstract class Animal {

   abstract private void eat(); //抽象方法不能是 private 的

}

// 编译出错

Error:(4, 27) java: 非法的修饰符组合: abstract和private

🥝抽象方法不能被final和static修饰,因为抽象方法要被子类重写


public abstract class Animal {

 abstract final void methodA();

 abstract public static void methodB();

}

// 编译报错:

// Error:(20, 25) java: 非法的修饰符组合: abstract和final

// Error:(21, 33) java: 非法的修饰符组合: abstract和static

🍋🟩抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰


abstract class Animal {

   abstract void eat();

   // 抽象类也是类,也可以增加普通方法和属性

   public double getArea(){

       return area;

   }

   protected double area; // 面积

}

class Dog extends Animal{

   @Override

   void eat() {

       // 重写

   }

}

abstract class Cat extends Animal{

   

}


🥬其他特性:


抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量