Java抽象クラス
Javaの「抽象」クラスとメソッドの使用方法
Abstraction
は、カプセル化と継承とともに、オブジェクト指向プログラミングの3つのコア原則の1つです。
抽象化は、プログラムの複雑さを軽減し、コードを読みやすくする1つの方法です。 Javaでは、抽象化により次のことが可能になります。
- クラスの特定の詳細のみを表示し、
- そのクラスの他のすべての詳細を非表示にします。
抽象化は、Javaのクラスとメソッドの両方に適用できます。
このチュートリアルでは、Javaでの抽象化の基本、抽象クラスの使用方法、および抽象メソッドの使用方法について説明します。また、この重要な概念をよりよく理解するのに役立ついくつかの例についても説明します。
Java抽象化
オブジェクト指向プログラミングは、オブジェクトとクラスを使用してデータとメソッドを表すプログラミングの一種です。オブジェクトとクラスを使用すると、コードの繰り返しを減らし、プログラムをより効率的にすることができます。
Javaはオブジェクト指向プログラミング言語です。そのため、オブジェクトやクラスを操作するために使用される多くの機能が含まれています。抽象化はそれらの機能の1つです。抽象化により、Javaのクラスに特定の情報のみを表示できます。
Javaで抽象化が使用される例は、クラスとメソッドの2つです。
Java抽象クラス
Javaでは、抽象クラスはオブジェクトを作成できないクラスです。つまり、抽象クラスをインスタンス化することはできません。
参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。
平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。
Javaで抽象クラスを作成するには、abstractキーワードを使用できます。 Javaの抽象クラスの例を次に示します。
abstract class BankAccount { // Code here }
これは抽象クラスであるため、このクラスでオブジェクトを作成しようとすると、プログラムはエラーを返します。
たとえば、BankAccountというクラスのインスタンスを作成しようとしたとします。このインスタンスをlucyAccountと呼び、Lucyの銀行情報を保存する必要があります。ルーシーは私たちの顧客の一人です。次のコードを使用して、このインスタンスの作成を試みます。
BankAccount lucyAccount = new BankAccount();
ただし、このコードを実行すると、プログラムは次のように戻ります。
BankAccount is abstract; cannot be instantiated
ご覧のとおり、オブジェクトに抽象クラスを割り当てることはできません。
ただし、抽象クラスからサブクラスを作成することはできます。次のセクションでは、抽象クラスからサブクラスを作成する方法について説明します。
抽象クラスの継承
前述したように、オブジェクトに抽象クラスを割り当てることはできません。したがって、抽象クラスのコンテンツ、つまりそのクラスに関連付けられている属性とメソッドにアクセスするには、inherit
する必要があります。 クラス。
銀行の銀行口座情報を保存するプログラムを作成しているとします。私たちのプログラムには、BankAccountとCheckingAccountの2つのクラスが含まれます。 BankAccountは、銀行口座を操作するための属性とメソッドを格納する親クラスになります。 CheckingAccountは、これらのメソッドを継承する子クラスになります。
この例では、BankAccountは抽象クラスです。確認用アカウントの作成にのみ使用します。
BankAccountクラスとCheckingAccountクラスを操作するために使用できるコードは次のとおりです。
abstract class BankAccount { public void viewAccountNumber() { System.out.println("Account number: #1932042"); } } class CheckingAccount extends BankAccount { } class Main { public static void main(String[] args) { CheckingAccount lucyAccount = new CheckingAccount(); lucyAccount.viewAccountNumber(); } }
コードは次のようになります:
Account number: #1932042
この例では、次の3つのクラスを作成しました。
- 銀行口座 。これは抽象クラスです。
viewAccountNumber()
というメソッドが含まれています 。 BankAccountは抽象クラスであるため、クラスのオブジェクトを作成することはできません。 - CheckingAccount 。これは子クラスです。子クラスとして、BankAccountクラスの属性とメソッドを継承します。
- メイン 。このクラスには、メインプログラムのコードが含まれています。
メインプログラムでは、CheckingAccountクラスのインスタンスを作成し、それをlucyAccountと呼びます。 lucyAccountはオブジェクトです。プログラムで3つのクラスを作成した後、メソッドviewAccountNumber()
でlucyAccountオブジェクトを使用しました。 。
次の表は、この例の主要部分をまとめたものです。
NAME | タイプ | 説明 |
銀行口座 | 抽象/親クラス | 銀行口座を操作するための属性とメソッドを格納します。 |
CheckingAccount | 子クラス | 親クラスのメソッドを継承します。 |
メイン | クラス | メインプログラムのコードが含まれています。 |
lucyAccount | オブジェクト | 私たちのプログラムの実際のアプリケーション。 |
Javaでの継承について詳しく知りたい場合は、こちらの完全ガイドをお読みください。
Java抽象メソッド
クラスに加えて、メソッドも抽象化できます。
抽象メソッドを宣言するときは、上記と同じ抽象キーワードを使用します。内容は指定せず、抽象クラス内でのみ抽象メソッドを宣言できます。
Javaの抽象メソッドの例を次に示します。
abstract void checkBalance();
この例では、checkBalance()
という抽象メソッドを作成しました。 。このメソッドには本体がありません。つまり、メソッドに関連付けられたコードはありません。
前の銀行の例に戻りましょう。そのプログラムには抽象メソッドが含まれています:lucyAccount.viewAccountNumber();
。
この抽象的な方法を使用して、プログラムで顧客の銀行口座番号を表示できるようにしました。上記の例(前のセクションから)では、BankAccountの親クラスは子クラスの一種のテンプレートとして機能します。
この場合、子クラスはさまざまな種類の銀行口座です。これは、お客様が複数の種類の銀行口座を持っている可能性があり、それぞれの種類の口座で同じ機能を実行したい場合があるためです。上で作成した子クラスは、CheckingAccountです。
上記の例からお客様に戻りましょう。ルーシーは当座預金口座を持っていますが、普通預金口座と仲介口座も持っている場合があります。 Lucyの各アカウントのアカウント番号を表示できるようにしたいと考えています。これを行うには、これら2つの追加のアカウントタイプの子クラスを作成します。それらをSavingsAccount、BrokerageAccountと呼ぶことができます。
BankAccount親クラスを作成したので、3つのアカウントタイプすべてのアカウント番号を効率的かつ最小限のコード繰り返しで表示できます。
以下のコードでは、abstractキーワードを2回使用しています。まず、抽象クラス(BankAccount)を宣言します。次に、後で顧客のアカウント番号を表示するようにプログラムに指示するのに役立つ抽象メソッドを宣言します。その抽象メソッド宣言は次のとおりです。abstractvoidviewAccountNumber();
。次に、viewAccountNumber()
を初期化します CheckingAccount子クラスのメソッド。コードは次のとおりです:
abstract class BankAccount { abstract void viewAccountNumber(); } class CheckingAccount extends BankAccount { public void viewAccountNumber() { System.out.println("Checking account number: #1932042"); } } class Main { public static void main(String[] args) { CheckingAccount lucyAccount = new CheckingAccount(); lucyAccount.viewAccountNumber(); } }
コードは次のようになります:
Checking account number: #1932042
この例では、前の例と同じ出力が返されますが、注意すべきコードの違いがいくつかあります。それらは:
- 抽象メソッドの宣言。 この例では、BankAccountという抽象クラスを宣言しています。このクラスには、
viewAccountNumber()
という抽象メソッドが含まれています 。 - 抽象メソッドの拡張。 BankAccountクラスはCheckingAccountクラスを介して拡張されます。 CheckingAccountクラスは、BankAccountメソッドに格納されている値を継承します。
CheckingAccountクラスでは、viewAccountNumber()
というメソッドを定義します。 —これはCheckingAccountオブジェクトにのみアクセスできます。次に、顧客のアカウント番号を確認するために、CheckingAccountオブジェクトを作成します。
Java抽象化の例
Java抽象クラスと抽象メソッドの両方について説明したので、Javaでの抽象化の完全な例を調べることができます。そのために、上記の銀行口座の例で説明したすべてのものをまとめます。
当座預金口座と普通預金口座の2種類の銀行口座を提供する銀行を運営しているとします。銀行口座の所有者が自分の口座番号を確認できるプログラムを作成することにしました。
私たちの銀行では、銀行口座が当座預金口座の場合、口座番号は顧客のID番号で始まり、555で終わります。口座が貯蓄口座の場合、口座番号は777で終わります。
次のコードを使用して、このプログラムを作成できます。
abstract class BankAccount { abstract void viewAccountNumber(); } class CheckingAccount extends BankAccount { public void viewAccountNumber() { System.out.println("Checking account number: #1932042555"); } } class SavingsAccount extends BankAccount { public void viewAccountNumber() { System.out.println("Savings account number: #1932042777"); } } class Main { public static void main(String[] args) { CheckingAccount ellieCheckingAccount = new CheckingAccount(); ellieCheckingAccount.viewAccountNumber() SavingsAccount ellieSavingsAccount = new SavingsAccount(); ellieSavingsAccount.viewAccountNumber(); } }
コードは次のようになります:
Checking account number: #1932042555 Savings account number: #1932042777
この例では、クラスを作成し、それをBankAccountと呼びました。このクラスには、viewAccountNumber()
という1つの抽象メソッドがありました。 。
アカウントの種類ごとにアカウント番号の割り当てが異なるため、viewAccountNumber()
を実装することはできません。 BankAccountクラスのメソッド。代わりに、BankAccountクラスの各サブクラスはviewAccountNumber()
を実装します メソッド。
この例では、CheckingAccountクラスは、顧客のIDで始まり555で終わる番号としてアカウント番号を割り当てます。SavingsAccountクラスは、顧客のIDで始まり777で終わる番号としてアカウント番号を割り当てます。
このコードでは、Ellieという顧客のCheckingAccountクラスのインスタンスを初期化します。このインスタンスにはellieCheckingAccountという名前が割り当てられ、viewAccountNumber()
を呼び出します。 アカウントの番号を表示する方法。これは次を返します:
Checking account number: #1932042555
また、ellieSavingsAccountと呼ばれるSavingsAccountクラスのインスタンスを初期化し、viewAccountNumber()
を呼び出します。 アカウントの番号を表示する方法。これは次を返します:
Savings account number: #1932042777
結論
Abstraction
オブジェクト指向プログラミングの重要な機能です。これにより、クラスまたはメソッドの特定の詳細を非表示にして、重要な情報のみを表示できます。 Javaで抽象クラスとメソッドを作成するには、abstract
を使用します キーワード。
このチュートリアルでは、例を挙げて、抽象化がどのように機能するか、抽象化が役立つ理由、およびJavaで抽象メソッドとクラスを作成する方法について説明しました。これで、プロのプログラマーのようにJavaで抽象クラスとメソッドを操作する準備が整いました。
-
Javaのスーパーキーワード
スーパー変数は直接の親クラスインスタンスを参照します。 スーパー変数は、直接の親クラスメソッドを呼び出すことができます。 super()は、直接の親クラスコンストラクターとして機能し、子クラスコンストラクターの最初の行である必要があります。 オーバーライドされたメソッドのスーパークラスバージョンを呼び出す場合、superキーワードが使用されます。 例 class Animal { public void move() { System.out.println("Animals can move");
-
Javaでの集約
集約とはHAS-A関係を指します。最初に例を見てみましょう- 例 public class Vehicle{} public class Speed{} public class Van extends Vehicle { private Speed sp; } これは、クラスVanHAS-ASpeedを示しています。 Speed用に別のクラスを用意することで、speedに属するコード全体をVanクラス内に配置する必要がなくなり、複数のアプリケーションでSpeedクラスを再利用できるようになります。 オブジェクト指向機能では、ユーザーはどのオブジェクトが実際の作業を