コンストラクターを理解する
コンストラクターがメソッドであると言うことは、オーストラリアのカモノハシが単なる別の哺乳類であると言うようなものです。カモノハシを理解するには、他の哺乳類との違いを知ることが重要です。コンストラクターを理解するには、コンストラクターがメソッドとどのように異なるかを理解することも同様に重要です。Javaの学生、特に認定資格を取得するために勉強している学生は、これらの違いを知る必要があります。この記事では、具体的に説明します。この記事の最後にある表1は、主要なコンストラクター/メソッドの違いをまとめたものです。
目的と機能
コンストラクターには、人生で1つの目的があります。それは、クラスのインスタンスを作成することです。これは、次のように、オブジェクトの作成と呼ぶこともできます。
カモノハシp1 = new Platypus();
対照的に、メソッドの目的ははるかに一般的です。メソッドの基本的な機能は、Javaコードを実行することです。
署名の違い
コンストラクターとメソッドは、シグニチャーの3つの側面(修飾子、戻り値の型、名前)が異なります。メソッドと同様に、コンストラクターは、public、protected、private、またはnone(多くの場合packageまたはfriendlyと呼ばれます)の任意のアクセス修飾子を持つことができます。メソッドとは異なり、コンストラクターはアクセス修飾子のみを取得できます。したがって、コンストラクタにすることはできませんabstract
、final
、native
、static
、またはsynchronized
。
戻り値の型も大きく異なります。メソッドには、任意の有効な戻り値の型を指定することも、戻り値の型を指定しないこともできますvoid
。この場合、戻り値の型はとして指定されます。コンストラクターには戻り値の型がなく、void
。もありません。
最後に、シグニチャに関しては、メソッドとコンストラクタは異なる名前を持っています。コンストラクターの名前はクラスと同じです。慣例により、メソッドはクラス名以外の名前を使用します。Javaプログラムが通常の規則に従っている場合、メソッドは小文字で始まり、コンストラクターは大文字で始まります。また、クラス名は通常名詞であるため、コンストラクター名は通常名詞です。メソッド名は通常、アクションを示します。
「これ」の使用
コンストラクターとメソッドは、キーワードの使用方法がthis
まったく異なります。メソッドはthis
、メソッドを実行しているクラスのインスタンスを参照するために使用します。静的メソッドは使用しませんthis
; それらはクラスインスタンスに属していないためthis
、参照するものは何もありません。静的メソッドは、インスタンスではなく、クラス全体に属します。コンストラクthis
ターは、同じクラス内の異なるパラメーターリストを持つ別のコンストラクターを参照するために使用します。次のコードを調べてください。
パブリッククラスカモノハシ{文字列名; カモノハシ(文字列入力){名前=入力; } Platypus(){this( "John / Mary Doe"); } public static void main(String args []){Platypus p1 = new Platypus( "digger"); カモノハシp2 = new Platypus(); }}
コードには、2つのコンストラクターがあります。1つ目はString
、インスタンスに名前を付けるための入力を受け取ります。2つ目は、パラメーターを使用せずに、最初のコンストラクターをデフォルト名で呼び出します"John/Mary Doe"
。
コンストラクターがを使用する場合、コンストラクthis
ターの最初の行にある必要があります。このルールを無視すると、コンパイラは反対します。
「スーパー」の使用
メソッドとコンストラクターはどちらもsuper
スーパークラスを参照するために使用しますが、方法は異なります。super
次の例に示すように、メソッドはスーパークラスでオーバーライドされたメソッドを実行するために使用します。
class Mammal {void getBirthInfo(){System.out.println( "born alive。"); }}クラスカモノハシは哺乳類を拡張します{voidgetBirthInfo(){System.out.println( "卵からの孵化"); System.out.print( "哺乳類は通常"); super.getBirthInfo(); }}
上記のプログラムでは、の呼び出しsuper.getBirthInfo()
はMammal
スーパークラスのオーバーライドされたメソッドを呼び出します。
コンストラクターはsuper
、スーパークラスのコンストラクターを呼び出すために使用します。コンストラクターがを使用する場合super
、最初の行でそれを使用する必要があります。そうしないと、コンパイラは文句を言います。次に例を示します。
public class SuperClassDemo {SuperClassDemo(){}} class Child extends SuperClassDemo {Child(){super(); }}
上記の(そして些細な!)例では、コンストラクターChild()
にへの呼び出しが含まれていますsuper
。これにより、クラスSuperClassDemo
に加えて、Child
クラスがインスタンス化されます。
コンパイラ提供のコード
新しいJavaプログラマーは、コンパイラーがコンストラクターにコードを自動的に提供するときにつまずく可能性があります。これは、コンストラクターを使用せずにクラスを作成した場合に発生します。コンパイラーは、引数のないコンストラクターを自動的に提供します。したがって、あなたが書く場合:
パブリッククラスの例{}
機能的には次のように書くのと同じです。
パブリッククラスExample {Example(){}}
super
コンストラクターの最初の行として(0個以上のパラメーターを使用して)使用しない場合も、コンパイラーは自動的にコードを提供します。この場合、コンピュータは自動的にを挿入しsuper
ます。したがって、あなたが書く場合:
パブリッククラスTestConstructors {TestConstructors(){}}
機能的には次のように書くのと同じです。
パブリッククラスTestConstructors {TestConstructors(){ super
; }}
鋭い目の初心者はTestConstructor
、クラスを拡張していないときに、上記のプログラムが親クラスのコンストラクターをどのように呼び出すことができるのか疑問に思うかもしれません。答えは、Object
クラスを明示的に拡張しない場合、Javaはクラスを拡張するということです。コンパイラーは、コンストラクターが明示的に宣言されていない場合は引数なしのコンストラクターを自動的に提供しsuper
、コンストラクターにsuper
。への明示的な呼び出しがない場合は引数なしの呼び出しを自動的に提供します。したがって、次の2つのコードスニペットは機能的に同等です。
パブリッククラスの例{}
そして
パブリッククラスExample {Example(){ super
; }}
継承
次のシナリオの何が問題になっていますか?弁護士がの意志を読んでいA. Class
ます。Class
家族のメンバーは大きな会議用テーブルの周りに集まり、何人かは優しくすすり泣きます。弁護士は、「私はA. Class
、心身ともに健全であり、すべてのコンストラクターを子供たちに任せている」と述べています。
問題は、コンストラクターを継承できないことです。Class
子供たちにとって幸いなことに、彼らは両親の方法を自動的に継承するので、Class
子供たちが完全に貧しくなることはありません。
Javaメソッドは継承されますが、コンストラクターは継承されないことを忘れないでください。次のクラスについて考えてみます。
パブリッククラスの例{publicvoid sayHi {system.out.println( "Hi"); } Example(){}} public class SubClass extends Example {}
このSubClass
クラスsayHi
は、親クラスで見つかったメソッドを自動的に継承します。ただし、コンストラクターExample()
はによって継承されませんSubClass
。
違いを要約する
カモノハシが典型的な哺乳類と異なるように、コンストラクターもメソッドとは異なります。特に彼らの目的は、署名、および使用中this
とsuper
。さらに、コンストラクターは、継承とコンパイラー提供のコードに関して異なります。これらすべての詳細をまっすぐに保つことは面倒なことがあります。次の表は、重要なポイントの便利な要約を示しています。コンストラクターとメソッドの詳細については、以下の「リソース」セクションを参照してください。
表1.コンストラクターとメソッドの違い
トピック | コンストラクター | メソッド |
---|---|---|
目的 | クラスのインスタンスを作成する | グループJavaステートメント |
修飾子 | Cannot be abstract , final , native , static , or synchronized |
Can be abstract , final , native , static , or synchronized |
Return type | No return type, not even void |
void or a valid return type |
Name | Same name as the class (first letter is capitalized by convention) -- usually a noun | Any name except the class. Method names begin with a lowercase letter by convention -- usually the name of an action |
this |
Refers to another constructor in the same class. If used, it must be the first line of the constructor | Refers to an instance of the owning class. Cannot be used by static methods |
super |
Calls the constructor of the parent class. If used, must be the first line of the constructor | Calls an overridden method in the parent class |
Inheritance | Constructors are not inherited | Methods are inherited |
Compiler automatically supplies a default constructor | クラスにコンストラクターがない場合、引数なしのコンストラクターが自動的に提供されます | 適用されません |
コンパイラは、スーパークラスコンストラクタにデフォルトの呼び出しを自動的に提供します | コンストラクターがゼロ以上の引数呼び出しを行わない場合、super 引数なしの呼び出しsuper が行われます。 |
適用されません |
このトピックの詳細
- コンストラクターとメソッドの基本をカバーするいくつかの本は
- 完全なJava2研究認定ガイド、 Simon Roberts etal。(Sybex、2000)// www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
- Java 2(Exam Cram)、 Bill Brogden(The Coriolis Group、1999):
//www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548
- Java in a Nutshell、 Davis Flanagan(O'Reilly&Associates、1999)// www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- メソッドとコンストラクターの詳細については、SunMicrosystemsのWebサイトにアクセスしてください。
//java.sun.com/docs/books/tutorial/trailmap.html
- 初心者のためのより多くのJavaコンテンツの場合、読みJavaWorld」の新しいJavaの101列シリーズを
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
このストーリー「コンストラクターを理解する」は、もともとJavaWorldによって公開されました。