2017-04-13 6 views
0

私はJavaチュートリアルを見ていましたが、各オブジェクトの各変数を定義するのではなく、コンストラクタを持つようにクラスを変更しても、彼のすべてのメソッドは引き続き機能しました。コンストラクタを追加したので、私のメソッドはもう機能しません。なぜですか?

私はそれをコンストラクタに変更しましたが、今では私のメソッドでは0になります。

public class Volume3Lesson4Exercise1 { 

    public static void main(String[] args) { 

     groceryStore houstonStore = new groceryStore(534, 0.99, 429, 0.87); 
     groceryStore seattleStore= new groceryStore(765, 0.86, 842, 0.91); 
     groceryStore orlandoStore= new groceryStore(402, 0.77, 398, 0.79);  

     System.out.println("\nSeattle store revenue: "); 
     seattleStore.calculateGrossRevenue(); 

     System.out.println("\nOrlando Store Revenue: "); 
     orlandoStore.calculateGrossRevenue(); 

    } 

} 

class groceryStore { 
    int apples; 
    double applePrice; 
    int oranges; 
    double orangePrice; 

    groceryStore(int a, double ap, int o, double op){ 
     a= apples; 
     ap= applePrice; 
     o= oranges; 
     op= orangePrice; 
    } 

    double calculateGrossRevenue(){ 
     double grossRevenue; 

     grossRevenue= ((apples * applePrice)+ (oranges * orangePrice)); 

     return grossRevenue; 

    } 
} 

次のコードでは、収益は総収益として数字0を返します。どうして?数値は以前と同じですが、現在はコンストラクタであり、各オブジェクトの個々の変数ではありません。

+5

変更' = apples'。もちろん、他の分野にも同じです。通常の議論では、引数とフィールドに同じ名前を使用し、 'this.apples = apples'を使用します。 –

+0

私はそれを試み、それは働いた。何年か前に作ったビデオの何らかの理由で、彼はこの言葉を付け加えておらず、それはまだ機能していました。 –

+0

重要なのは 'this'キーワードではありません。重要なのは、引数をフィールドの値で初期化するのではなく、引数の値でフィールドを初期化することです。 –

答えて

2
コンストラクタ内の値の割り当てが順序を変更することがあり

、すなわちコンストラクタに渡されたパラメータの値は、インスタンス変数に保存されることを意味するそう

groceryStore(int a, double ap, int o, double op) { 
    apples = a; 
    applePrice = ap; 
    oranges = o; 
    orangePrice = op; 
} 

(りんご、applePrice等)、これは意図された動作です。元のコードに表示されている割り当ては無効なので、インスタンス変数はすべての数値に対して0のデフォルト値を保持します。より明確にするために、thisキーワードはすべてのインスタンス変数のために使用されるべきである

、すなわち `this.apples = A`に

groceryStore(int a, double ap, int o, double op) { 
    this.apples = a; 
    this.applePrice = ap; 
    this.oranges = o; 
    this.orangePrice = op; 
} 
+0

それはどういう意味ですか?私は各オブジェクトを作成したときに一番上のすべての値を割り当てました。だから、なぜ彼らはまだすべて0になっていますか?これは意味をなさない。 –

+3

インスタンス変数に実際に値が割り当てられていないので、これらは「0」のままです。代入は '= 'シンボルの左側のパラメータに常に起こります。コンストラクタで '= 'の左側にある変数を確認してください。たとえば、最初の呼び出しで 'a 'に' 534'を渡し、これを 'apples'で上書きするコンストラクタの中に' a = apples'を定義しています( '' a''に 'apples'の値を代入する")、したがって、' 534'は 'apples'に割り当てられません。その代わりに、 'a'は前に値が割り当てられていないので、デフォルト値である' apples'の値、すなわち '0'を取得します。 – PNS

+0

コンストラクターについて教えたビデオではこれを使用していませんでした。私はこれを追加し、彼らはすべて働いた。 –