logo

Javaの抽象クラス

Java では、抽象クラスは abstract キーワードを使用して宣言されます。抽象メソッドと非抽象メソッド (本体を持つメソッド) の両方を持つことができます。アブストラクトは Java のクラスとメソッドに適用できる Java 修飾子ですが、 変数用ではありません 。この記事では、Java での抽象クラスの使用法を学びます。

Javaの抽象クラスとは何ですか?

Java 抽象クラスは、それ自体では開始できないクラスであり、そのプロパティを使用するには別のクラスによってサブクラス化する必要があります。抽象クラスは、クラス定義で abstract キーワードを使用して宣言されます。



抽象クラスのイラスト

abstract class Shape  {  int color;  // An abstract function  abstract void draw(); }>

Java では、次のようなものがあります。 重要な観察 抽象クラスについては次のとおりです。

  1. 抽象クラスのインスタンスは作成できません。
  2. コンストラクターは許可されます。
  3. 抽象メソッドなしで抽象クラスを作成することもできます。
  4. あるかもしれない 最終的な方法 抽象クラスではありますが、クラス(抽象クラス)内の抽象メソッドはfinalとして宣言できません。つまり、finalメソッド自体を抽象にすることはできません。エラーが発生するためです。修飾子の組み合わせが不正です:abstractとfinal
  5. 抽象クラスで静的メソッドを定義できる
  6. 使用できます 抽象的なキーワード 宣言するために 最上位クラス (外部クラス) と内部クラス 抽象的なものとして
  7. もし クラス 少なくとも含まれています 1 つの抽象メソッド その場合、強制的にクラスを抽象として宣言する必要があります
  8. もし こどもクラス のすべての抽象メソッドに実装を提供することはできません。 親クラス それなら私たちはそれを宣言すべきです 抽象としての子クラス そのため、次のレベルの Child クラスは残りの抽象メソッドの実装を提供する必要があります。

Java抽象クラスの例

1. Abstractメソッドを持つ抽象クラスの例

以下は、上記のトピックの実装です。

ジャワ








// Abstract class> abstract> class> Sunstar {> >abstract> void> printInfo();> }> // Abstraction performed using extends> class> Employee>extends> Sunstar {> >void> printInfo()> >{> >String name =>'avinash'>;> >int> age =>21>;> >float> salary =>222>.2F;> >System.out.println(name);> >System.out.println(age);> >System.out.println(salary);> >}> }> // Base class> class> Base {> >public> static> void> main(String args[])> >{> >Sunstar s =>new> Employee();> >s.printInfo();> >}> }>

>

>

出力

avinash 21 222.2>

2. コンストラクタ、データメンバ、メソッドを持つ抽象クラス

抽象クラスが持つことができる要素

  • データメンバー
  • 抽象メソッド
  • メソッド本体 (非抽象メソッド)
  • コンストラクタ
  • main()メソッド。

以下は、上記のトピックの実装です。

ジャワ




// Java Program to implement Abstract Class> // having constructor, data member, and methods> import> java.io.*;> abstract> class> Subject {> >Subject() {> >System.out.println(>'Learning Subject'>);> >}> > >abstract> void> syllabus();> > >void> Learn(){> >System.out.println(>'Preparing Right Now!'>);> >}> }> class> IT>extends> Subject {> >void> syllabus(){> >System.out.println(>'C , Java , C++'>);> >}> }> class> GFG {> >public> static> void> main(String[] args) {> >Subject x=>new> IT();> > >x.syllabus();> >x.Learn();> >}> }>

>

>

出力

Learning Subject C , Java , C++ Preparing Right Now!>

抽象クラスのプロパティ

これらの観察を詳しく説明し、次のようにクリーンな Java プログラムを使用してその正当性を証明しましょう。

観察1

Java では、C++ と同様に、抽象クラスのインスタンスを作成できませんが、抽象クラス型への参照を持つことができます。クリーンなJavaプログラム経由では以下のようになります。

ジャワ




// Java Program to Illustrate> // that an instance of Abstract> // Class can not be created> // Class 1> // Abstract class> abstract> class> Base {> >abstract> void> fun();> }> // Class 2> class> Derived>extends> Base {> >void> fun()> >{> >System.out.println(>'Derived fun() called'>);> >}> }> // Class 3> // Main class> class> Main {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Uncommenting the following line will cause> >// compiler error as the line tries to create an> >// instance of abstract class. Base b = new Base();> >// We can have references of Base type.> >Base b =>new> Derived();> >b.fun();> >}> }>

>

>

出力

ユーザー名
Derived fun() called>

観察2

C++ と同様に、 抽象クラス 含むことができる コンストラクター ジャワでは。また、抽象クラスのコンストラクターは、継承されたクラスのインスタンスが作成されるときに呼び出されます。以下のプログラムで示すと以下のようになります。

例:

ジャワ




// Java Program to Illustrate Abstract Class> // Can contain Constructors> // Class 1> // Abstract class> abstract> class> Base {> >// Constructor of class 1> >Base()> >{> >// Print statement> >System.out.println(>'Base Constructor Called'>);> >}> >// Abstract method inside class1> >abstract> void> fun();> }> // Class 2> class> Derived>extends> Base {> >// Constructor of class2> >Derived()> >{> >System.out.println(>'Derived Constructor Called'>);> >}> >// Method of class2> >void> fun()> >{> >System.out.println(>'Derived fun() called'>);> >}> }> // Class 3> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Creating object of class 2> >// inside main() method> >Derived d =>new> Derived();> >d.fun();> >}> }>

>

>

出力

Base Constructor Called Derived Constructor Called Derived fun() called>

観察3

Java では、次のようにすることができます。 抽象メソッドのない抽象クラス 。これにより、次のことが可能になります。 インスタンス化できないが継承のみ可能なクラスを作成する 。クリーンな Java プログラムを使用すると、次のようになります。

例:

ジャワ




// Java Program to illustrate Abstract class> // Without any abstract method> // Class 1> // An abstract class without any abstract method> abstract> class> Base {> >// Demo method. This is not an abstract method.> >void> fun()> >{> >// Print message if class 1 function is called> >System.out.println(> >'Function of Base class is called'>);> >}> }> // Class 2> class> Derived>extends> Base {> >// This class only inherits the Base class methods and> >// properties> }> // Class 3> class> Main {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Creating object of class 2> >Derived d =>new> Derived();> >// Calling function defined in class 1 inside main()> >// with object of class 2 inside main() method> >d.fun();> >}> }>

>

>

出力

Function of Base class is called>

観察4

抽象クラスには次のものもあります 最後の メソッド (オーバーライドできないメソッド)

例:

ジャワ




// Java Program to Illustrate Abstract classes> // Can also have Final Methods> // Class 1> // Abstract class> abstract> class> Base {> >final> void> fun()> >{> >System.out.println(>'Base fun() called'>);> >}> }> // Class 2> class> Derived>extends> Base {> > }> // Class 3> // Main class> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >{> >// Creating object of abstract class> >Base b =>new> Derived();> >// Calling method on object created above> >// inside main method> >b.fun();> >}> >}> }>

>

>

出力

Base fun() called>

観察5

抽象 Java クラスではオブジェクトを作成することはできません。つまり、抽象クラスのインスタンス化は不可能です。

ジャワ




// Java Program to Illustrate Abstract Class> // Main class> // An abstract class> abstract> class> GFG {> >// Main driver method> >public> static> void> main(String args[])> >{> >// Trying to create an object> >GFG gfg =>new> GFG();> >}> }>

>

>

出力:

抽象クラス

観察6

インターフェースに似ている 抽象クラスで静的メソッドを定義できます それ オブジェクトなしで独立して呼び出すことができます。

ジャワ




// Java Program to Illustrate> // Static Methods in Abstract> // Class Can be called Independently> // Class 1> // Abstract class> abstract> class> Helper {> >// Abstract method> >static> void> demofun()> >{> >// Print statement> >System.out.println(>'Geeks for Geeks'>);> >}> }> // Class 2> // Main class extending Helper class> public> class> GFG>extends> Helper {> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Calling method inside main()> >// as defined in above class> >Helper.demofun();> >}> }>

>

>

出力

Geeks for Geeks>

観察7

使用できます 抽象的なキーワード 最上位クラス (外部クラス) および内部クラスを抽象として宣言するため

ジャワ




import> java.io.*;> abstract> class> B {> >// declaring inner class as abstract with abstract> >// method> >abstract> class> C {> >abstract> void> myAbstractMethod();> >}> }> class> D>extends> B {> >class> E>extends> C {> >// implementing the abstract method> >void> myAbstractMethod()> >{> >System.out.println(> >'Inside abstract method implementation'>);> >}> >}> }> public> class> Main {> >public> static> void> main(String args[])> >{> >// Instantiating the outer class> >D outer =>new> D();> >// Instantiating the inner class> >D.E inner = outer.>new> E();> >inner.myAbstractMethod();> >}> }>

>

>

出力

Inside abstract method implementation>

観察8

もし クラスには少なくとも 1 つの抽象メソッドが含まれています それから クラスを抽象として宣言する必要がある そうしないと、コンパイル時エラーが発生します。クラスに少なくとも 1 つの抽象メソッドが含まれている場合、そのクラスの実装は完了していないため、そのような部分クラスのオブジェクトの作成を制限するためにオブジェクトを作成することはお勧めできません。を使用しております 抽象的なキーワード。

ジャワ




/*package whatever //do not write package name here */> import> java.io.*;> // here if we remove the abstract> // keyword then we will get compile> // time error due to abstract method> abstract> class> Demo {> >abstract> void> m1();> }> class> Child>extends> Demo {> >public> void> m1()> >{> >System.out.print(>'Hello'>);> >}> }> class> GFG {> >public> static> void> main(String[] args)> >{> >Child c =>new> Child();> >c.m1();> >}> }>

>

>

出力

Hello>

観察9

もし 子供 クラスが親クラスのすべての抽象メソッドに実装を提供できない場合は、次のレベルの子クラスが残りの抽象メソッドに実装を提供できるように、子クラスを抽象として宣言する必要があります。

ジャワ




// Java Program to demonstrate> // Observation> import> java.io.*;> abstract> class> Demo {> >abstract> void> m1();> >abstract> void> m2();> >abstract> void> m3();> }> abstract> class> FirstChild>extends> Demo {> >public> void> m1() {> >System.out.println(>'Inside m1'>);> >}> }> class> SecondChild>extends> FirstChild {> >public> void> m2() {> >System.out.println(>'Inside m2'>);> >}> >public> void> m3() {> >System.out.println(>'Inside m3'>);> >}> }> class> GFG {> >public> static> void> main(String[] args)> >{> >// if we remove the abstract keyword from FirstChild> >// Class and uncommented below obj creation for> >// FirstChild then it will throw> >// compile time error as did't override all the> >// abstract methods> >// FirstChild f=new FirstChild();> >// f.m1();> >SecondChild s =>new> SecondChild();> >s.m1();> >s.m2();> >s.m3();> >}> }>

>

>

出力

Inside m1 Inside m2 Inside m3>

C++ では、クラスに少なくとも 1 つある場合、 純粋仮想関数 の場合、クラスは抽象クラスになります。 C++ とは異なり、Java では、クラスを抽象化するために別のキーワード abstract が使用されます。

結論

この記事の留意点は次のとおりです。

  • 抽象クラスは、それ自体では開始できないクラスであり、そのプロパティを使用するには別のクラスによってサブクラス化する必要があります。
  • 抽象クラスは、抽象キーワードを使用して作成できます。
  • 抽象メソッドなしで抽象クラスを作成することもできます。

抽象クラスのよくある質問

1. Java の抽象クラスとは何ですか?

Java の抽象クラスは、単独では開始できないが、別のクラスによってサブクラスとして使用できるクラスです。

2. 抽象クラスの目的は何ですか?

抽象クラスの主な目的は、他の多くのクラスを派生できる基本クラスを作成することです。

文字列.format Java

3. 抽象クラスの主な利点は何ですか?

抽象クラスは、Java でのデータ隠蔽機能を提供します。

4. なぜ抽象クラスはインターフェースよりも速いのでしょうか?

抽象クラスは、Java でオーバーライドされたメソッドを呼び出す前に検索を必要とするのに対し、抽象クラスは直接使用できるため、インターフェイスよりも高速です。

また、読んでください