2017-09-06 10 views
-2

目的は、2つの変数を取り、正しい範囲(> 0)にあるコンストラクタを作成することです。また、0可変半径が初期化されない可能性があるというエラーが表示されるのはなぜですか?

public class Cone { 
    private final double radius; // doesn't change after Cone is constructed 
    private final double height; // doesn't change after Cone is constructed 
    private double iceCreamHeight; 
    public Cone(double radius, double height){ 
     iceCreamHeight = 0; 
     double r = radius; 
     double h = height; 
     if(r <=0 || h <=0 || iceCreamHeight <= 0){ 
      r =1; 
      h=1; 
      System.out.println("ERROR Cone"); 
     } 
    } 
} 
+2

エラーメッセージはどうなっていますか? – shmosel

答えて

0

に、このプログラムでは、あなたがprivate final double radius;またはprivate final double height;の値を変更しようとしないんをiceCreamHeightを初期化します。また、final変数は変更できません。最後の修飾子を削除して、変数を参照するthisキーワードを使用します。

public class Cone { 
    private double radius; //Not final 
    private double height; 
    private double iceCreamHeight; 
    public Cone(double radius, double height){ 
     this.iceCreamHeight = 0; 
     this.radius = radius; //Uses 'this' 
     this.height = height; 
     if(this.radius <= 0 || this.height <= 0 || this.iceCreamHeight <= 0){ 
      this.radius = 1; 
      this.height= 1; 
      System.out.println("ERROR Cone"); 
     } 
    } 
} 
+0

'radius'と' height'は 'final'でも構いません。コンストラクタがコンストラクタを変更することができないようにするには望ましいです。 –

+0

' final' fields非常に良いことです。有益なものを削除するよりも、この問題を解決する良い方法です。 – VGR

0

コンストラクタのパラメータは、常にローカル変数です。この場合、インスタンス変数と同じ名前になりますが、パラメータとインスタンス変数は同じではありません。ローカル変数を設定するには、明示的な代入文が必要です。どちらか別の何かをするパラメータ名を変更する(例えば、ちょうど

public Cone(double radius, double height) { 
    // check the parameters here 
    this.radius = radius; 
    this.height = height; 
} 
のように、

public Cone(double r, double h) { 
    // check the parameters here 
    // note that you can assign new values to r and h; there's 
    // no reason to declare separate variables to hold the same value 
    radius = r; 
    height = h; 
} 

のようなパラメータ名としてrh、何かを使用するか、インスタンス変数にアクセスするためにthis.radiusthis.heightを使用

関連する問題