English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基础教程

Java 流程制御

Java 配列

Java 面向对象(I)

Java 面向对象(II)

Java 面向对象(III)

Java 例外処理

Java リスト(List)

Java Queue(キュー)

Java Map集合

Java Set集合

Java 输入输出(I/O)

Java Reader/Writer

Javaの他のトピック

Java 抽象クラスと抽象メソッド

このチュートリアルでは、Javaの抽象について学びます。Javaの抽象クラスとメソッド、それらのプログラム内での使用方法について学びます。

Javaの抽象クラス

抽象クラスはインスタンス化できないクラスです(抽象クラスのオブジェクトを作成することはできません)。Javaでは、abstractキーワードを使用して抽象クラスを宣言します。

abstract class Animal {
   //属性とメソッド
}

抽象クラスのオブジェクトを作成しようとすると、コンパイルエラーが発生します。例えば、

Animal a1 = new Animal()

以下のコンパイルエラーが発生します:

 動物は抽象であり、インスタンス化することができません

抽象クラスをインスタンス化することはできませんが、その中からサブクラスを作成できます。サブクラスのオブジェクトを作成して、抽象クラスのメンバーにアクセスできます。

詳しく理解する前に、抽象メソッドについて理解する必要があります。

Java 抽象メソッド

同じ抽象キーワードabstractを使用して抽象メソッドを作成します。実装なしで抽象メソッドを宣言します。例えば、

abstract void makeSound();

ここでは、makeSound()は抽象メソッドです。

重要なのは、抽象メソッドを含むことができるのは抽象クラスの1つだけです。抽象メソッドを非抽象クラスに含めるとエラーが発生します。

抽象クラスには抽象メソッドと非抽象メソッドを含むことができます。これは一例です。

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

上記の例では、抽象クラスAnimalを作成しました。このクラスには抽象メソッドmakeSound()と非抽象メソッドdisplayInfo()が含まれています。

抽象クラスの継承

抽象クラスはインスタンス化できません。抽象クラスのメンバーにアクセスするために、それを継承する必要があります。例えば、

サンプル1:抽象クラスの継承

abstract class Animal {
 public void displayInfo() {
   System.out.println("I am an animal.");
 }
}
class Dog extends Animal {
}
class Main {
 public static void main(String[] args) {
   Dog d1 = new Dog();
   d1.displayInfo();
 }
}

出力

I am an animal.

上記の例では、抽象クラスAnimalを作成しました。Animalクラスのオブジェクトを作成することはできません。displayInfo()メソッドにアクセスするために、AnimalのサブクラスDogを継承しました。

それから、Dogのd1オブジェクトがdisplayInfo()メソッドにアクセスします。

抽象メソッドをオーバーライド

Javaでは、サブクラスで親クラスの抽象メソッドをオーバーライドする必要があります。これは、サブクラスが親クラスの抽象メソッドを継承しているためです。

 私たちのサブクラスには抽象メソッドが含まれているため、それらをオーバーライドする必要があります。

注意:子クラスが抽象と宣言された場合、抽象メソッドを強制的にオーバーライドする必要はありません。

サンプル2:抽象メソッドをオーバーライド

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");
   }
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();
      d1.eat();
   }
}

出力

Bark bark.
I can eat.

上記の例では、抽象クラスAnimalを作成しました。このクラスには抽象メソッドmakeSound()と非抽象メソッドeat()が含まれています。

超クラスAnimalからサブクラスDogを継承しました。ここで、サブクラスDogは抽象メソッドdisplayInfo()をオーバーライドしています。

 その後、Dogのオブジェクトdを作成しました。1を使用して、d1.displayInfo()とd1メソッド.eat()

抽象クラスのコンストラクタにアクセス

抽象クラスのコンストラクタにアクセスする方法について説明します。例えば、

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

ここでは、Dogのコンストラクタ内のsuper()を使用してAnimalクラスのコンストラクタにアクセスします。

注意、superは常に子クラスのコンストラクタの最初の文であるべきです。アクセスJavaのスーパーキーワードもっと詳しく知りたい場合は。

なぜJavaの抽象を使用するのか?

抽象はオブジェクト指向プログラミングの重要な概念です。抽象は必要な情報のみを表示し、すべての不必要な詳細を隠します。これにより、よりシンプルで高度なアイデアを使用して、複雑さを管理するために詳細を省略または隠すことができます。

抽象の実際の例はオートバイのブレーキです。ブレーキの機能はわかっています。ブレーキを踏むと、オートバイが停止しますが、ブレーキの機能は私たちにとって隠されています。

抽象の主な利点は、現在の製造者は異なるオートバイに異なるブレーキを使用できるが、ブレーキの機能は同じであることです。

Java抽象の理解を深めるために、一例を挙げてみましょう。

サンプル3:Java抽象

abstract class Animal {
   abstract void makeSound();
}
class Dog extends Animal {
   public void makeSound() {
      System.out.println("バウ バウ.");
   }
}
class Cat extends Animal {
   public void makeSound() {
      System.out.println("ミャウ ");
   }
}
class Main {
   public static void main(String[] args) {
      Dog d1 = new Dog();
      d1.makeSound();
      Cat c1 = new Cat();
      c1.makeSound();
   }
}

出力

バウ バウ
ミャウ

上記の例では、抽象クラスAnimalを作成しました。抽象クラスAnimalには抽象メソッドmakeSound()があります。

Animalクラス内でmakeSound()メソッドを実装することはできません。なぜなら、それぞれの動物が異なる音を発するからです。したがって、Animalのすべてのサブクラスには異なるmakeSound()メソッドの実装があります。

Animalのすべてのサブクラスに対して正しく動作するようにAnimalでmakeSound()を実現することはできません。したがって、AnimalのmakeSound()の実装は隠された状態で保持されます。

 上記の例では、Dogは独自のmakeSound()を実現し、Catは独自のmakeSound()を実現しました。

覚えておくべきポイント

  • abstractキーワードを使用して抽象クラスやメソッドを作成します。

  • 抽象メソッドには実装(メソッドボディ)がありません。

  • 抽象メソッドを持つクラスも抽象クラスでなければなりません。

  • 抽象クラスのオブジェクトを作成することはできません。

  • 抽象クラスの機能を実現するために、その派生子クラスを継承し、その派生子クラスのオブジェクトを作成します。

  • サブクラスは抽象クラスのすべての抽象メソッドをオーバーライドする必要がありますが、サブクラスが抽象クラスとして宣言されている場合、抽象メソッドをオーバーライドする必要はありません。

  • 抽象クラスの参照を使用して、抽象クラスの静的属性やメソッドにアクセスできます。例えば、

    Animal.staticMethod();

Java インターフェース

Javaでは、インターフェースは抽象クラスに似ているが、インターフェースには抽象メソッドが含まれていません。次のチュートリアルでは、インターフェースに関する情報をさらに学びます。