what is abstraction java learn with examples
このチュートリアルでは、Javaでの抽象化とは何かをプログラミング例とともに説明します。また、抽象クラスとは何か、なぜそれが使用されるのかについても学びます。
このJAVAシリーズでは、抽象化、カプセル化、継承、ポリモーフィズムの4つの柱としても知られるオブジェクト指向プログラミング(OOP)の重要な機能について説明します。
OOPの最初の柱は「抽象化」です。 「抽象化とは、データを選択して、関連する情報のみをユーザーに表示するプロセスです。」
学習内容:
OOPでの抽象化
簡単に言うと、抽象化はオブジェクトの関連する属性のみを「表示」し、不要な詳細を「非表示」にします。
例えば、 私たちが車を運転しているとき、私たちは車のスタート/ストップ、加速/ブレーキなどの車の運転だけに関心があります。実際のスタート/ストップメカニズムや加速/ブレーキプロセスが内部でどのように機能するかには関心がありません。私たちはそれらの詳細には興味がありません。
私たちが懸念しているのは、これらの操作の「抽象的な」ビューであり、車を前進させて目的地に到達するのに役立ちます。これは抽象化の簡単な例です。
したがって、車にはすべてのメカニズムとプロセスがありますが、エンドユーザーの観点、つまり車のドライバーの観点からは、これらのプロセスの抽象的なビューにのみ関心があります。
抽象化により、プログラミングの労力が軽減され、それによって複雑さが軽減されます。アプリケーションを使用するエンドユーザーは、特定の機能がどのように実装されているかを気にする必要はありません。彼/彼女は必要に応じて機能を使用することができます。
したがって、抽象化では、イベントではなくアイデアを扱います。これは、実装の詳細をユーザーから隠し、機能のみをエンドユーザーに公開することを意味します。これにより、ユーザーは「どのように実行するか」ではなく、「何を実行するか」だけを知ることができます。
OOPでの抽象化には、2つのタイプがあります。
#1)データの抽象化
データの抽象化では、主に複雑なデータ型を作成し、それらの実装を非表示にします。実装の詳細に立ち入ることなく、これらのデータ型を操作するための操作のみを公開します。
このアプローチの利点の1つは、ユーザーに公開される動作を変更せずに、いつでも実装を変更できることです。
#2)制御の抽象化
コントロールの抽象化は、アプリケーションの一部であるすべてのコントロールステートメントを収集し、それらを1つの単位として公開します。この機能は、このコントロールユニットを使用して作業機能を実行する必要がある場合に使用されます。
コントロールの抽象化は構造化プログラミングのメインユニットを形成し、コントロールの抽象化を使用して、単純な関数を複雑なフレームワークに定義できます。
Javaでの抽象化とは
JavaはOOP言語であるため、抽象化はJava言語の重要な機能および構成要素の1つと見なすことができます。 Javaでは、抽象化は抽象クラスとインターフェースを使用して実装されます。
では、Javaで抽象化を実装するにはどうすればよいでしょうか。 Javaは、抽象化を実装するための非アクセス修飾子「abstract」を提供します。この抽象修飾子はクラスとメソッドで使用できますが、変数では使用できません。
インターフェースは完全な抽象化を提供します。つまり、メソッドのプロトタイプのみを提供し、その実装は提供しません。抽象クラスは、少なくとも1つのメソッドを実装してはならない部分的な抽象化を提供します。
このチュートリアルでは、抽象クラスを使用した抽象化について詳しく説明します。以降のチュートリアルでは、インターフェイスについて詳しく説明します。
Java抽象化の例
以下の例を考えてみましょう。
//abstract class abstract class Car{ abstract void accelerate(); } //concrete class class Suzuki extends Car{ void accelerate(){ System.out.println('Suzuki::accelerate'); } } class Main{ public static void main(String args()){ Car obj = new Suzuki(); //Car object =>contents of Suzuki obj.accelerate(); //call the method } }
出力:
上記の単純な抽象化の例には、クラスCarがあります。このクラスのCarには、加速するための抽象的なメソッドがあります()。次に、このクラスを鈴木クラスに継承します。鈴木クラス内では、acceleratedメソッドを実装しています。
上記の例は、抽象クラスが定義され、継承され、プログラムで使用される方法を示しています。
Java抽象クラスとは
Javaが抽象クラスとインターフェースを使用して抽象化を実装することはすでに述べました。まず、抽象クラスについてすべて調べてみましょう。
抽象クラスは、キーワード「abstract」で宣言されたクラスとして定義でき、インスタンス化できないという制限があります。
抽象クラスには、抽象メソッド(実装のないメソッド)がある場合とない場合があります。 JVMに関する限り、抽象クラスは完全な動作を持たない不完全なクラスです。
抽象クラスの一般的な構文を以下に示します。
abstract class { public abstract void abstractMethod(); public void normalMethod() { //method body } }
上記の抽象クラスの構文に示されているように、抽象クラスには抽象メソッドと非抽象メソッドを含めることができます。キーワード「abstract」はクラス宣言の前にあります。
一言で言えば、抽象クラスは以下のように記述できます。
Javaの抽象メソッド
抽象メソッドは、実装なしで「abstract」キーワードが前に付いたメソッドです。抽象メソッドは、抽象クラス内で宣言されます。
抽象メソッドは、実装がないためにクラスを不完全にするメソッドです。したがって、クラスに抽象メソッドを含めると、当然、クラスは不完全になります。
抽象メソッドをサブクラスに実装することで使用できます。つまり、クラスは抽象クラスを継承し、抽象クラスで宣言されたすべての抽象メソッドのコードをオーバーライドして実装または提供します。
したがって、サブクラスの抽象メソッドをオーバーライドすることが必須になります。抽象メソッドがサブクラスにも実装されていない場合は、サブクラスも「抽象」として宣言する必要があります。
抽象メソッドの一般的な宣言は次のとおりです。
概要 ボイド methodName(parameter_list);
抽象メソッドを作成するときは、次のルールを覚えておく必要があります。
- 1つ以上の抽象メソッドを含むクラスは抽象クラスです。
- 他の特定のキーワードは、abstractキーワードと一緒に使用しないでください。
したがって、次の組み合わせはJavaでは違法です。
- 最後の
- 抽象ネイティブ
- 抽象静的
- 抽象プライベート
- 抽象同期
- 抽象strictfp
抽象クラスと抽象メソッドの例を実装しましょう。
//abstract class abstract class Bank{ abstract int getInterestRate(); } //concrete class class Citi extends Bank{ int getInterestRate(){return 7;} } //concrete class class HSBC extends Bank{ int getInterestRate(){return 6;} } class Main{ public static void main(String args()){ Bank b; b = new Citi (); // concrete class object System.out.println('Citi Rate of Interest is: '+b.getInterestRate()+'%'); b = new HSBC (); // concrete class object System.out.println('HSBC Rate of Interest is: '+b.getInterestRate()+'%'); } }
出力:
上記の例では、Bankクラスがあります。このクラスには、抽象メソッドgetInterestRate()があります。次に、Bankクラスから継承するICICIとBOIの2つのクラスを宣言します。これらのクラスは両方とも、それぞれの利率を返すことによってgetInterestRate()メソッドを実装します。
次に、mainメソッドで、銀行オブジェクトを作成します。まず、銀行オブジェクトにはICICIクラスのオブジェクトが含まれており、金利が表示されます。次に、BOIオブジェクトが作成され、金利が表示されます。
したがって、Bankクラスは、金利を取得できるスケッチまたは構造の一種であると見なすことができます。この構造から、必要な数の具象クラスを作成し、各銀行オブジェクトのそれぞれの金利を取得できます(これはmainメソッドに表示されます)。
Javaでの抽象クラスの使用は何ですか
実際には独自の実装がないのに、なぜ抽象クラスを使用するのですか?
上記の質問への回答に加えて、次の例では抽象クラスの使用方法も示します。
車両の例を考えてみましょう。車両にはさまざまな種類があります。車、スクーター、バイク、モペット、バスなどがあります。車両にはさまざまな種類がありますが、種類に関係なく、すべての車両に共通する特性や属性がいくつかあります。
例えば、 各車両には、モデル、シャーシ番号、色などがあります。各車両には、スタート、ストップ、加速、ブレーキなどの機能があります。これで、各車両には、他の車両にも共通の上記のプロパティと方法があります。車両利用者であると同時に、私たちはいくつかの側面に興味がないかもしれません。
例えば、 人が車を運転している場合、彼/彼女が興味を持っているのは、車両を始動および停止するか、車両を加速またはブレーキすることだけです。彼/彼女は、車両がどのように始動または停止するかを知ることに興味がありません。関数の抽象的な動作にのみ関心があり、詳細には関心がありません。
上記のサンプルシステムをソフトウェアアプリケーションに表現したい場合、どのように設計しますか?まず、いくつかの抽象化を実装します。これで、いくつかの関数が一般的であることがわかりましたが、各モデルに応じて、これらの関数の実装は異なります。
まず、抽象クラス「Vehicle」を宣言します。
このシステムを以下に示します。
したがって、抽象クラスVehicleがあり、Vehicleの各モデルを表す具体的なクラスがあります。説明のために、車、自転車、スクーターの3つのモデルのみを使用しました。
以下に示すのは、上記のシステムのクラス階層です。
abstract class Vehicle{ abstract void start () ; abstract void stop (); abstract void accelerate (); abstract void brake (); } class Car extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Bike extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Scooter extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} }
したがって、Vehicle抽象クラスと、Car、Bike、Scooterの3つのクラスがあります。これらの各クラスは、Vehicleクラスを拡張し、各抽象メソッドをオーバーライドします。
したがって、一般に、表現する共通のメソッドまたは操作を備えたシステムを表現する必要がある場合は常に、外側の視点のみをユーザーに提示するために、抽象化を行います。その結果、共通のメソッドを取り出して抽象メソッドとして表現し、これらの抽象メソッドを共通の抽象クラスに収集します。
抽象クラスとして表されるシステムのアウトラインと抽象メソッドとしての操作を取得したら、指定された抽象クラスから任意の数のクラスを派生させ、抽象メソッドをオーバーライドして、各クラスにこれらの操作を実装できます。
このようにして、システムを設計することが有用になります。
会社のWebサイトからの詳細情報を傍受するために使用できるユーティリティは何ですか?
抽象クラスとインターフェース
上記の抽象クラスを見てきました。インターフェースは、抽象化を実装するさらに他の構成要素です。インターフェースはコントラクトであり、インターフェースを実装するクラスはこれらのコントラクトを尊重する必要があります。
インターフェイスのコントラクトは、実装されていないメソッドに他なりません。インターフェイス内には、メソッドのプロトタイプのみがあります。インターフェイス内にメソッドの単一の実装はありません。
次のようなインターフェイス宣言がある場合:
public interface interfaceA{ void myInterfaceMethod (); }
次に、interfaceAを実装するクラスは、「myInterfaceMethod」をオーバーライドする必要があります。
クラスのメソッドをオーバーライドしない場合、そのクラスは抽象として表されます。
abstract class TestClass implements interfaceA{ // not a compulsion to override myInterfaceMethod. }
インターフェースについては、後で別のチュートリアルを行います。
次に、Javaの抽象クラスとインターフェイスの違いについて説明します。
抽象クラスとインターフェースの違い
抽象クラス | インターフェース |
---|---|
抽象クラスには、パブリックメンバーとは別に、プライベートデータメンバーまたは保護されたデータメンバーを含めることができます。 | インターフェイスメンバーはデフォルトでパブリックです。 |
抽象クラスは、抽象および/または非抽象メソッドを持つことができます。 | インターフェイスは抽象メソッドのみを持つことができます。 |
要約には、最終変数が含まれる場合と含まれない場合があります。 | インターフェイスは、デフォルト変数として変数を最終決定できます。 |
抽象クラスは、final、static、non-static、またはnon-final変数を持つことができます。 | インターフェイスは、最終変数と静的変数のみを持つことができます。 |
抽象クラスは、インターフェースの実装を提供する場合があります。 | インターフェイスは抽象クラスを実装できません。 |
抽象クラスは、「extends」キーワードを使用して継承されます。 | インターフェイスは、「implements」キーワードを使用して実装されます。 |
抽象クラスは、他のクラスを拡張したり、複数のインターフェイスを実装したりできます。 | インターフェイスは別のインターフェイスのみを実装できます。 |
Javaで抽象クラスとインターフェイスを使用する場合
抽象クラスを使用する場合とJavaアプリケーションでインターフェイスを使用する場合の決定は、目前の問題を完全に理解した後でインテリジェントに行う必要があります。以下に示すように、考慮しなければならない2つの側面があります。
部分的な振る舞いを持つ抽象クラス
抽象クラスは完全に実装されていない可能性があることを私たちは知っています。それらは部分的な動作をする可能性があります。一方、インターフェースには実装がありません。したがって、抽象クラスと実装のどちらかを選択する必要がある場合は、アプリケーションのこの側面を考慮する必要があります。
つまり、最初に、設計しているアプリケーションに、抽象クラスで分離できる共通の部分的な実装があるかどうかを判断する必要があります。
例えば、 Webアプリケーションを設計していると考えてください。このためには、サーブレット、REST APIなどのWebテクノロジを使用する必要があります。これらの各Webテクノロジには、開発中のアプリケーションに関係なく実装されるいくつかの手法または手順があります。次に、カスタマイズしたアプリケーションを構築します。
したがって、この場合、Webテクノロジーが実行する必要のある明確なコードを抽象クラスに入れることができます。このためのインターフェースはありますか?いいえ。これは、インターフェースに実装を含めることができないためです。
契約のみのインターフェース
インターフェイスには、その一部であるコントラクトまたはメソッドがあることがわかっています。これらのメソッドは単なるプロトタイプです。これらのインターフェイスをクラスに実装してから、メソッドをオーバーライドする必要があります。
ここで、Javaコレクションフレームワークのマップインターフェイスについて考えてみましょう。 HashMap、TreeMap、HashTableなどの多くのクラスがこのインターフェースを実装しています。これらのクラスにはそれぞれ異なる実装があります。それらには、抽象クラスで表すことができる一般的な動作はありません。
つまり、メソッドプロトタイプを使用してインターフェイスを設計し、各クラスを実装します。
このように、抽象クラスとインターフェイスのどちらかを選択する前に、各要素を適切に比較検討する必要があります。
抽象化とカプセル化の違い
抽象化とOOPのもう1つの重要な機能、つまりカプセル化の違いについて説明しましょう。
抽象化 | カプセル化 |
---|---|
情報を取得して抽象化するプロセス | 情報をバインドするプロセス。 |
抽象化手法は、設計レベルまたはインターフェースレベルです。 | カプセル化メカニズムは実装レベルです。 |
抽象化は詳細を隠します。 | カプセル化により、情報が1つのユニットにバインドされ、情報セキュリティが確保されます。 |
抽象化は、抽象クラスとインターフェースを使用して実装されます。 | アクセス修飾子、つまりpublic、private、protectedおよびdefaultは、カプセル化で役割を果たします。 |
抽象化では、複雑で詳細なデータがユーザーから隠されている間、唯一の抽象的なビューがユーザーに提示されます。 | カプセル化では、データは1つの単位としてバンドルされ、アクセス修飾子とゲッターおよびセッターメソッドを使用して保護またはアクセス可能にすることができます。 |
よくある質問
Q#1)抽象化とデータ隠蔽は同じですか?
回答: いいえ、抽象化とデータ隠蔽は同じではありません。しかし、どちらもオブジェクト指向プログラミングの重要な機能です。抽象化は背景の詳細を隠すプロセスですが、データの隠蔽はデータを直接アクセスから隔離する手法です。
Q#2)抽象化の利点は何ですか?
回答: 抽象化のいくつかの利点を以下に示します。
- 背景の詳細を非表示にし、抽象ビューのみをユーザーに公開することで、抽象化によりコードがよりシンプルで読みやすくなります。
- 抽象化は不要な詳細を保護するため、コードが小さくなります。
- コードの保守は、抽象化しないと複雑で困難になる可能性があります。
Q#3)なぜ抽象化がそれほど重要なのですか?
回答: 抽象化により、重要であり、世界に漏洩した場合に混乱を招く可能性のある背景の詳細を隠すことができます。背景の詳細を非表示にし、必要なインターフェイスのみをユーザーに公開することで、抽象化によりアプリケーションが簡素化されます。
Q#4)リアルタイムの例で抽象化について説明してください。
回答: 幾何学的形状、車両などを含む多くのリアルタイムの抽象化の例があります。さらに別の例は、ATM(現金自動預け払い機)です。 ATMは、現金の引き出し、残高の確認、送金などの操作をサポートしています。ただし、これらの操作が内部でどのように機能するかはわかりません。
必要な操作を選択して実行するためのユーザーインターフェイスを備えたモニターのみが提供されます。
Q#5)カプセル化せずに抽象化を実現できますか?
回答: 抽象化は実装の詳細を保護し、カプセル化はオブジェクトの詳細を非表示にします。オブジェクトは実世界の抽象的な形であり、その詳細はカプセル化を使用して隠されています。したがって、抽象化にはカプセル化が必要です。
結論
このチュートリアルでは、Javaでの抽象化について詳しく説明しました。抽象化は、ユーザーから不要な詳細を隠す手法です。ユーザーには、関連する詳細へのアクセスのみが許可されます。車両操作またはATM操作は、現実の世界における抽象化の典型的な例です。
ATMを使用する場合、現金の引き出しなどの操作を実行することにのみ関心があり、その操作が内部でどのように正確に実行されるかについての詳細を知る必要はありません。
Javaは、抽象クラスとインターフェースを介して抽象化を提供します。インターフェイスは100%の抽象化を提供しますが、抽象クラスは部分的な抽象化を提供します。インターフェイスと抽象クラスのどちらを選択するかは、開発するアプリケーションと、ユーザーに公開する情報に応じて行う必要があります。
また、このチュートリアルでは、抽象クラスとインターフェイスの違いとともに、抽象メソッドについても説明しました。
=> ここですべてのJavaチュートリアルを確認してください。