Java 抽象类和抽象方法

Java 中使用 abstract 声明一个抽象类,抽象类不能被实例化。在本教程中,我们通过示例学习 Java 抽象类和方法,我们还将学习 Java 中的抽象概念。

在本教程中,我们通过示例学习 Java 抽象类和方法,我们还将学习 Java 中的抽象概念。

Java 抽象类

在 Java 中,我们使用 abstract 关键字来声明一个抽象类,抽象类不能被实例化(我们不能创建抽象类的对象)。例如,

abstract class Language {
  // 属性和方法
}
...

抽象类不能被实例化否则会报错

```java
// 如果尝试实例化抽象类,会收到编译错误
Language obj = new Language();

抽象类可以同时具有常规方法和抽象方法。例如,

abstract class Language {

  // 抽象方法
  abstract void method1();

  // 常规方法
  void method2() {
    System.out.println("这是一个常规方法");
  }
}

要了解非抽象方法,请访问 Java 方法。在这里,我们将学习抽象方法。

Java 抽象方法

我们使用相同的 abstract 关键字来创建抽象方法,抽象方法没有方法主体。例如,

abstract void display();

这里, display() 是一个抽象方法。display() 没有方法主体 {...},而是直接使用 ; 结束语句。

如果一个类包含一个抽象方法,那么这个类应该被声明为抽象的。否则会产生错误。例如,

// 错误
// 此类应该声明为 abstract
class Language {

  // 抽象方法
  abstract void method1();
}

示例:Java 抽象类和方法

虽然抽象类不能被实例化,但我们可以从中创建子类。然后我们可以使用子类的对象访问抽象类的成员。例如,

abstract class Language {
  public void display() {
    System.out.println("This is Java Programming");
  }
}

public class Main extends Language {

  public static void main(String[] args) {

    Main obj = new Main();

    // 访问父类抽象类的方法
    obj.display();
  }
}

输出

This is Java Programming

在上面的例子中,我们创建了一个名为 Language 的抽象类,该类包含一个常规方法 display()

我们让 Main 类继承了 Language 抽象类。注意声明,

obj.display();

这里, obj 对象 Main 类的的对象, obj 调用的是继承的 Language 抽象类的 display() 方法。

实现抽象方法

如果抽象类包含任何抽象方法,那么从抽象父类继承的所有子类都必须提供抽象方法的实现。例如,

abstract class Animal {
  abstract void makeSound();

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

class Dog extends Animal {

  // 实现抽象方法
  public void makeSound() {
    System.out.println("Bark bark");
  }
}

public class Main {
  public static void main(String[] args) {

    Dog d1 = new Dog();

    d1.makeSound();
    d1.eat();
  }
}

输出

Bark bark
I can eat.

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

我们让子类 Dog 继承了 父类 Animal,子类 Dog 实现了抽象方法 makeSound()

然后我们使用 Dog 类的对象 d1 来调用方法 makeSound()eat() .

注意:如果Dog 类不提供抽象方法的实现 makeSound()Dog 类也应该声明为抽象类。这是因为子类 Dog 继承了 Animal 类的抽象方法 makeSound()

访问抽象类的构造方法

抽象类可以像普通类一样拥有构造方法。并且我们同样可以使用 super 关键字从子类访问抽象类的构造方法。例如,

abstract class Animal {
   Animal() {
      .
   }
}

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

在这里,我们在子类的构造方法中使用了 super() 访问父类的构造方法。

请注意, super() 应该始终是子类构造方法的第一条语句。访问 Java super 关键字以了解更多信息。

Java 抽象

抽象类和方法的主要用途是在 Java 中实现抽象。

抽象是面向对象编程的一个重要概念,它允许我们隐藏不必要的细节,只显示需要的信息。

这使我们能够通过使用更简单、更高层次的设计管理复杂性,同时省略或隐藏一些实现细节。

抽象的一个实际例子可以是摩托车刹车。我们知道刹车的作用。当我们踩刹车时,摩托车就会停下来。然而,刹车的工作对我们是隐藏的。

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

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

示例 3:Java 抽象

abstract class Animal {
  abstract void makeSound();

}

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

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

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

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

输出

Bark bark.
Meows

在上面的例子中,我们创建了一个 Animal 类作为抽象类表示动物,它有一个抽象方法 makeSound() 表示动物发出的声音。

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

这里, Dog 类和 Cat 类各自实现了自己的 makeSound() 方法。

注意:我们也可以在 Java 中使用接口来实现抽象。要了解更多信息,请访问 Java 接口

总结

  • abstract 关键字可声明抽象类和抽象方法。
  • 抽象方法没有任何实现(方法体)。
  • 包含抽象方法的类也应该是抽象的。
  • 不能创建抽象类的实例。
  • 子类必须覆盖抽象类的所有抽象方法。但是,如果子类被声明为抽象的,则不必覆盖抽象方法。
  • 抽象类可以直接访问静态属性和方法。例如: AbstractClass.staticMethod()