2016-06-14 7 views
0

私はプログラミングが初めてで、Javaにも新しい。私は現在、パラメーター化されたコンストラクターを使用して、特定のメソッドで作成したオブジェクトを使用しています。Javaのパラメータ化されたコンストラクタ

問題がある
public class Car { 
int fuelcap; 
int mpg; 

Car(int f, int m) {  //here 
    fuelcap = f;   //and here 
    mpg = m;    //and here 
} 

int range() { 
    return mpg * fuelcap; 
} 

public static void main(String[] args) { 
    Car sedan = new Car(16, 21); 
    Car sportscar = new Car(14, 16); 
    System.out.println(sedan.range()); 
    System.out.println(sportscar.range()); 

} 

} 

、私はコンストラクタ車のパラメータをなぜ知らない - 「int型F」と「int型のm」はフィールドと異なっている:これは私が持っているコードである「int型のfuelcap。 ' 'int mpg;'

Car(int fuelcap, int mpg){ 
} 

これらのパラメータをオブジェクト作成時に渡すだけですか?

+0

、それだけで二回変数に代入するようなものだ - 最後の代入が実行後の値は、第二の割り当てになります。 – BadZen

+0

なぜdownvote? – BadZen

答えて

2

いいえ、できません。コンストラクタのパラメータはコンストラクタの本体のクラスフィールドに代入する必要があります。保存しないと、コンストラクタパラメータは保存されません。それがJavaの仕組みです。コンストラクタのパラメータについては "魔法のような"ものは何もありません。

また、適切なスタイルを守ってください。あなたがより多くのフィールドを持っている場合は

Car(int fulecap, int mpg) {  
    this.fuelcap = fuelcap;   
    this.mpg = mpg;    
} 

はその後のパラメータctorの、それだけで結構です。オブジェクトが作成された後に呼び出される通常のメソッドとして、コンストラクタを考えるだけです。 (その最後の文が唯一のみかん、ちょっと本当ですが、あなたは、この目的のために正しいアイデアを与えるだろう。)

+0

だから、私は何が起こっているのかを知るために:Car(int fulecap、int mpg){//ここではfuelcapとmpgはint fuelcapフィールドとは異なります。およびint mpg; this.fuelcap = fuelcap; //ここでやっていることは、フィールドfuelcapをパラメータfuelcapに設定することです。後で、メソッドを作成するときに、フィールドにのみ値を割り当てることができます。 this.mpg = mpg; } – Rio

+0

あなたはそれを持っています。クラスフィールドと 'this 'のコンストラクタのパラメータを常に区別します。 'は、賢明だが良いスタイルのルールです。それらは異なる変数です(TMIでない場合は、JVMに異なるオペコードがあり、ローカル/パラメータとクラスフィールドにアクセスします...全く異なる場所/エンティティ) – BadZen

+2

ありがとうございます!私はそれが動作する方法を持っていると思う:1.フィールドを作成する2.フィールドと同じパラメータ名を持つコンストラクタを作成する(現在は共通点がない)今度は – Rio

0

あなたはインスタンス変数fuelcapmpgを持っていますが、あなたが言及コンストラクタをすれば、彼らはに割り当てることはありません何でも

あなたはそれを読みやすくするために、これを行うことができ、

int fuelcap; 
int mpg; 

Car(int fuelcap, int mpg) { 
    this.fuelcap = fuelcap; //this is refrencing the instance variable in the class  
    this.mpg = mpg;    
} 

int range() { 
    return mpg * fuelcap; 
} 

コンストラクタそれは同じ名前の変数にエラーを引き起こす可能性があるので、ちょうどあなたが望むように認識されません。

+0

と思うフィールドにパラメータを割り当ててください。これは適切な方法です。つまり、フィールドのようなパラメータの名前を付けてから、これを使用します。それにフィールドを割り当てるには? – Rio

+0

多くの人がそれを行い、後でクラスで参照するのを簡単にします。それは個人的な好みと可読性に関するものであり、あなたが以前に行ったやり方で厳密に正しいかどうかは何もありません。 – Jop

1

はいオフもちろん、あなたが、その場合には、あなたのコンストラクタは次のようにのようになりますことができます。

public Car(int fuelcap, int mpg){ 
this.fuelcap = fuelcap; 
this.mpg = mpg; 
} 
0

パラメータ化されたコンストラクタは、異なるオブジェクトに異なる値を提供するために使用されます。

あなたは

Car(int fuelcap, int mpg){} 

を使用したい場合は、すべてのオブジェクトがありますthisキーワード

を使用していけない場合は、そのコードが

Car(int f, int m) {  
this.fuelcap = f;   
this.mpg = m; } 

なりthisキーワード

を使用する必要があります。インスタンスvaと同じ値

まず、あなたのメンバーprivatelink)を行う必要がありますriablesすなわち、fuelcapmpgは今、その値は、良い習慣を考慮し0

0

ただ、いくつかのヒントです。 さらに、オブジェクトを「不変」にするのは良いスタイルです。つまり、オブジェクトが作成されると状態を変更できません(link)。これを実現するには、フィールドをfinalと宣言します。

Carクラスは次のようになります。あなたが二回フィールドに割り当てた場合

public class Car 
{ 
    private final int fuelcap; 

    private final int mpg; 


    public Car(final int fuelcap, final int mpg) 
    { 
    this.fuelcap = fuelcap; 
    this.mpg = mpg; 
    } 


    public int range() 
    { 
    return this.mpg * this.fuelcap; 
    } 
} 
+0

public int range() { リターンthis.mpg * this.fuelcap; // どうしてこれなの。ここに必要? mpg * fuelcap } – Rio

+0

@Rioでも同じことをすることはできません。あなたはそうですが、ここでは必要ありません。なぜなら、これら2つの変数はフィールド変数であることがはっきりと分かるからです。 – Moonlit

+0

@リオできます。 'this.'はオプションですが、それは良い習慣です。変数/パラメータへのアクセスとフィールドに対するアクセスの違いを文書化するのに役立ちます。したがって、コードを見ている他の人は、何がアクセスされているかを確実に知ることができます。これは、多くのパラメータと変数が存在する可能性があるより大きいメソッドの場合に特に当てはまります。 EclipseのようなIDEは、コンパイラのエラー/警告*「インスタンスフィールドへの無制限のアクセス」*を使用して、このような「コードスタイル」を実行するのを助けるように指示できます。 – Andreas

関連する問題