Java 抽象类和抽象方法

抽象类的基本概念:普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通类的结构里面增加抽象方法的组成部分。

Java 抽象类

抽象类是无法实例化的类(我们无法创建抽象类的对象)。在Java中,我们使用abstract关键字声明一个抽象类。

abstract class A {
   //属性和方法
}

如果尝试创建抽象类的对象,则会出现编译错误。例如,

A a1 = new A()

它将产生一个编译错误:

A is abstract; cannot be instantiated

尽管不能实例化抽象类,但是我们可以从中创建子类。我们可以创建子类的对象来访问抽象类的成员。

在详细了解它之前,我们需要了解抽象方法。

抽象类的使用原则:

  1. 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public;

  2. 抽象类不能直接实例化,需要依靠子类采用向上转型的方式处理;

  3. 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类;

  4. 子类(如果不是抽象类)则必须覆写抽象类之中的全部抽象方法(如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。);

Java 抽象方法

我们使用相同的关键字abstract来创建抽象方法。声明了一个抽象方法而没有实现。例如,

abstract void makeSound();

在这里,makeSound()是一种抽象方法。

抽象类可以包含抽象方法和非抽象方法。这是一个实例。

abstract class A {
   public void displayInfo() {
      System.out.println(“I am an A.”);
   }

   abstract void makeSound();
}

在上面的示例中,我们创建了一个抽象类A。它包含一个抽象方法makeSound()和一个非抽象方法displayInfo()。

抽象类的继承

抽象类无法实例化。要访问抽象类的成员,我们必须继承它。例如

示例:抽象类的继承

abstract class A {
 public void displayInfo() {
   System.out.println("I am an A.");
 }
}

class Dog extends A {

}
class Main {
 public static void main(String[] args) {
   Dog d1 = new Dog();
   d1.displayInfo();
 }
}

输出

I am an A.

在上面的示例中,我们创建了一个抽象类A。我们不能创建A类的对象。为了访问A类中的displayInfo()方法,我们继承了A的子类Dog。

然后,我们使用Dog的d1对象访问该displayInfo()方法。

重写抽象方法

在Java中,必须在子类中重写超类的抽象方法。这是因为子类继承了超类的抽象方法。

 因为我们的子类包含抽象方法,所以我们需要重写它们。

注意:如果子类也被声明为抽象,则不必强制重写抽象方法。

示例:覆盖抽象方法

abstract class A {
   abstract void makeSound();

   public void eat() {
      System.out.println("I can eat.");
   }
}

class Dog extends A {

   public void makeSound() {
      System.out.println("Bark bark");
   }
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();
      d1.eat();
   }
}

输出

Bark bark.
I can eat.

在上面的示例中,我们创建了一个抽象类A。该类包含一个抽象方法makeSound()和一个非抽象方法eat()。

我们从超类A继承了一个子类Dog。这里,子类Dog覆盖了抽象方法displayInfo()。

 然后我们创建了Dog的对象d1。使用该对象,我们调用了d1.displayInfo()和d1.eat()方法。

访问抽象类的构造函数

与非抽象类相似,我们使用super关键字从子类访问抽象类的构造函数。例如,

abstract class A {
   A() {
      ….
   }
}

class Dog extends A {
   Dog() {
      super();
      ...
   }
}

在这里,我们使用Dog的构造函数中的super()访问A类的构造函数。

注意,super 始终应是子类构造函数的第一条语句。访问Java超级关键字以了解更多信息。

为什么使用Java抽象?

抽象是面向对象编程的重要概念。抽象仅显示所需的信息,所有不必要的细节都保持隐藏。这使我们能够通过使用更简单,更高级的想法省略或隐藏细节来管理复杂性。

抽象的实际示例可以是摩托车制动器。我们知道刹车的作用。当我们踩刹车时,摩托车将停止。但是,制动器的工作对我们而言是隐藏的。

隐藏制动器工作原理的主要优点是,现在制造商可以为不同的摩托车使用不同的制动器,但是制动器的作用是相同的。

让我们举一个实例来帮助我们更好地理解Java抽象。

示例:Java抽象

abstract class A {
   abstract void makeSound();

}

class Dog extends A {
   public void makeSound() {
      System.out.println("Bark bark.");
   }
}

class Cat extends A {
   public void makeSound() {
      System.out.println("Meows ");
   }
}

class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();

      Cat c1 = new Cat();
      c1.makeSound();
   }
}

输出

Bark bark
Meows

在上面的示例中,我们创建了一个超类A。超类A具有抽象方法makeSound()。

makeSound()方法无法在A内部实现。这是因为每种动物都会发出不同的声音。因此,A的所有子类都有不同的makeSound()实现方法。

我们不能以对A的所有子类都正确的方式在A中实现makeSound()。 因此,A中makeSound()的实现保持隐藏状态。

 在上面的示例中,Dog实现了它自己的makeSound()实现,Cat实现了自己的makeSound()。

要记住的要点

  • 我们使用abstract关键字来创建抽象类和方法。

  • 抽象方法没有任何实现(方法体)。

  • 包含抽象方法的类也应该是抽象的。

  • 我们不能创建抽象类的对象。

  • 为了实现抽象类的功能,我们从其继承子类并创建该子类的对象。

  • 子类必须重写抽象类的所有抽象方法。但是,如果子类被声明为抽象的,则不必强制重写抽象方法。

  • 我们可以使用抽象类的引用来访问抽象类的静态属性和方法。例如,

    A.staticMethod();

编程笔记 » Java 抽象类和抽象方法