2016-09-07 5 views
-1

私はPythonコーダーですが、最近はJavaに夢中になりました。私はコードの特定の部分を理解しようとしていますが、Javaをあまりよく知らないことに関連していると思う困難にぶち当たっています。なぜメソッドを2回指定するのですか? - Java

私には、クラス定義メソッドが2回呼び出されることがありました。なぜそれが不思議ですか?例:

次のコードは、ApplicationCreator.javaというファイルから取得したものです。私は、PublicクラスのApplicationCreatorが本質的に2回インスタンス化していることに気づいたか、ここで何か不足していますか?

public class ApplicationCreator<MR> implements 
    IResourceObjectCreator<BinaryRuleSet<MR>> { 

private String type; 

public ApplicationCreator() { 
    this("rule.application"); 
} 

public ApplicationCreator(String type) { 
    this.type = type; 
} 

だからここに私の質問:

1)なぜクラスは、クラス内で自身のインスタンスを作成しますか?

2)なぜ2回繰り返すのですか?または、これはApplicationCreatorクラスの特定のパラメータを新しい値に設定する方法ですか?

アドバイスをいただければ幸いです。

+0

これはコンストラクタと呼ばれます。 1つはパラメーターを取り、もう1つはパラメーターを取りません。その場合、ハードコーディングされた値を使用して、他のコンストラクターを呼び出すことによって自身を構築します。別の 'new'キーワードが使用されていないので、一つのオブジェクトだけがインスタンス化されます –

+0

ああ。これは、この例では、引数を持たないクラスをインスタンス化するか、1つの引数(型)を使用してクラスをインスタンス化するかによって、コードがそれぞれ最初のコンストラクタまたは2番目のコンストラクタを実行するということですか? – Z101

+0

これは「オーバーロード」と呼ばれ、コンストラクタまたはメソッドを複数回、異なるパラメータで定義する機能を指します。メソッドを呼び出すときのパラメータの数とタイプによって、呼び出されるメソッドが決まります。 – 4castle

答えて

2

1)クラスがクラス内でインスタンス化するのはなぜですか?

クラスはそれ自身を呼び出すのではなく、他の人がそのオブジェクトをインスタンス化する方法を証明しています。 constructorについて読む

2)なぜ2回繰り返すのですか?または、これはApplicationCreatorクラスの特定のパラメータを新しい値に設定する方法ですか?

私が言ったように、それはオブジェクトを作成する方法です。 1つ目はタイプにデフォルト値を割り当てます。そして2ndは他人に値を割り当てるオプションを与えます。 constructor overloadingについて読むコンストラクタで

this

thisに渡される引数の型に応じて、同じクラスの別のコンストラクタを呼び出します。

4

クラス内でインスタンス化していないため、クラス内で別のコンストラクタが呼び出されています。

これらは、オーバーロードされたコンストラクタです。コンストラクターはメソッドに似ていますが、オブジェクト作成時に呼び出されます。このことを考えてみます。ここでは

public class Example { 
    private int instanceVariable; 

    public Example() { //a constructor of Example 
     instanceVariable = 3; 
     System.out.println("New Example object was created!"); 
    } 

    public static void main(String[] args) { 
     Example ex = new Example(); 
    } 
} 

を、我々はコンストラクタを持つExampleクラスを持っています。 mainメソッドを見ると、Exampleの新しいインスタンスが作成されます。プログラムはNew Example object was created!を出力し、インスタンスinstanceVariableを3に設定します。これは、オブジェクトがすぐに呼び出され、オブジェクト(したがって名前)が作成されるためです。

あなたの状況を見てみると、コンストラクタは異なる引数(したがってシグネチャ)を持ち、引数を与えないか、Stringを指定することでオブジェクトを構築できます。私はこれが何をするか説明してみましょう:

public ApplicationCreator() { 
    this("rule.application"); 
} 

thisが、この場合のクラスを参照し、this(args)を呼び出すと、クラスのコンストラクタを呼び出します。オーバーロードされたコンストラクタがあるので、Javaは渡された引数に最も近いコンストラクタを呼び出します。この場合、文字列が渡されるので、Javaはコンストラクタpublic ApplicationCreator(String)が最も一致してそれを呼び出すことを確認します。

引数のないコンストラクタ内では、他のコンストラクタをString rule.applicationで呼び出します。したがって、引数のないコンストラクタは、コンストラクタにデフォルト値を渡してStringとみなすことができます。

1

クラスは実際には2回インスタンス化していません。むしろ、デフォルトコンストラクタApplicationCreator()(つまり、パラメータを取らないコンストラクタ)は、単に入力文字列を受け入れるコンストラクタを呼び出すだけです。

これにより、ApplicationCreatorオブジェクトは常にタイプを持つことが保証されます。タイプが指定されていない場合、デフォルト値rule.applicationが使用されます。

これは、オーバーロードされたコンストラクタの例です。

0

これはコンストラクタと呼ばれます。そして、それは "二度呼ばれる"ではなく、単に与えられたパラメータでthis()経由でもう一方にリダイレクトされます。

パラメータのない最初の方法は、基本的にはデフォルト値です。そうでない場合は、与えられたインスタンスを構築するString type

2

これらは2つの異なるコンストラクタです。
彼らは異なるシグネチャ」と参照されているものはあり

それを使用して次の2つの異なる方法でApplicationCreatorオブジェクトを作成することができます。

ApplicationCreator ac = new ApplicationCreator(); 

あるいはさらに読書参照してください

ApplicationCreator ac = new ApplicationCreator("A String"); 

The Java Class Constructor

0

このクラスは2つのコンストラクタを持っています
クラス名 "メソッド"の名前が同じ場合yoそれらがコンストラクタであることを理解できます。
コンストラクタがオーバーロードされています。パラメータに基づいてクラスがインスタンス化されます。ここでは、ユーザーは必要に応じて選択肢を持っています。

関連する問題