コンストラクターを理解する

コンストラクターがメソッドであると言うことは、オーストラリアのカモノハシが単なる別の哺乳類であると言うようなものです。カモノハシを理解するには、他の哺乳類との違いを知ることが重要です。コンストラクターを理解するには、コンストラクターがメソッドとどのように異なるかを理解することも同様に重要です。Javaの学生、特に認定資格を取得するために勉強している学生は、これらの違いを知る必要があります。この記事では、具体的に説明します。この記事の最後にある表1は、主要なコンストラクター/メソッドの違いをまとめたものです。

目的と機能

コンストラクターには、人生で1つの目的があります。それは、クラスのインスタンスを作成することです。これは、次のように、オブジェクトの作成と呼ぶこともできます。

カモノハシp1 = new Platypus(); 

対照的に、メソッドの目的ははるかに一般的です。メソッドの基本的な機能は、Javaコードを実行することです。

署名の違い

コンストラクターとメソッドは、シグニチャーの3つの側面(修飾子、戻り値の型、名前)が異なります。メソッドと同様に、コンストラクターは、public、protected、private、またはnone(多くの場合packageまたはfriendlyと呼ばれます)の任意のアクセス修飾子を持つことができます。メソッドとは異なり、コンストラクターはアクセス修飾子のみを取得できます。したがって、コンストラクタにすることはできませんabstractfinalnativestatic、または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

違いを要約する

カモノハシが典型的な哺乳類と異なるように、コンストラクターもメソッドとは異なります。特に彼らの目的は、署名、および使用中thissuper。さらに、コンストラクターは、継承とコンパイラー提供のコードに関して異なります。これらすべての詳細をまっすぐに保つことは面倒なことがあります。次の表は、重要なポイントの便利な要約を示しています。コンストラクターとメソッドの詳細については、以下の「リソース」セクションを参照してください。

表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が行われます。 適用されません
Robert Nielsenは、Sun認定のJava2プログラマーです。彼は教育の修士号を持ち、コンピューター支援教育を専門としており、コンピューター分野で数年間教えてきました。彼はまた、さまざまな雑誌にコンピューター関連の記事を掲載しています。

このトピックの詳細

  • コンストラクターとメソッドの基本をカバーするいくつかの本は
  • 完全な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によって公開されました。