3

そこで、main でいくつかの変数を宣言し、新しいオブジェクトを作成しました。変数を引数としてコンストラクターに渡します。ここで、クラス内でメソッドを呼び出すと、これらの変数はメソッドに引数として渡すことなく、メソッドからアクセスできると考えていたでしょう。そうではありませんか?

コードは次のとおりです。

import java.util.Scanner;

public class Step2_lab11 {

    public static void main(String[] args) {

        final int TAO = 50;
        final double DELTA_MINUTES = 0.1;

        System.out.println("VINETS AVKYLNINGSTID \n");
        System.out.println("Ange vinets temperatur:");

        Scanner userIn = new Scanner(System.in);
        double wineTemp = userIn.nextDouble();

        System.out.println("Vinets önskade temperatur:");
        double preferredTemp = userIn.nextDouble();

        System.out.println("Kylens/frysens temperatur:");
        double chillTemp = userIn.nextDouble();

        WineChiller wineChiller = new WineChiller(wineTemp, preferredTemp, chillTemp);

    }

}

クラス WineChiller.java は次のとおりです。

public class WineChiller {

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        getChillingTime();

    }

    public void getChillingTime() {

        while(wineTemp>preferredTemp)
        {
            elapsedTime += DELTA_MINUTES;
            double dT = (wineTemp - chillTemp) * DELTA_MINUTES  / TAO;
            wineTemp -= dT;
        }
        System.out.println(Math.round(elapsedTime));

    }

}

getChillingTime が wi​​neTemp などを変数に解決できないのはなぜですか?

追加するために編集: ポインタの人に感謝します。しかし、追加の注意事項があります。この指示は、WineChiller クラスにはコンストラクターとメソッド getChillingTime のみを含める必要があり、getChillingTime は引数を取らないでください! 課題用紙にタイプミスはありませんか?

4

7 に答える 7

5

これはおそらく Scala や Ceylon (以下を参照)などの言語では可能ですが、Java ではインスタンス変数にコンストラクター引数を明示的に割り当てる必要があります。したがって:

public class WineChiller {

    double wineTemp;
    double preferredTemp;
    double chillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        this.preferredTemp = preferredTemp;
        this.chillTemp = chillTemp;

        getChillingTime();
    }

コンストラクターの引数は、コンストラクターのスコープ内でのみ表示されます。コンストラクターが your を呼び出すという事実getChillingTime()は関係ありません。それらをインスタンスのスコープ内で表示したい場合はWineChiller、そのクラスにメンバーを作成する必要があります。そのクラスのすべてのメソッドは、インスタンス メンバーにアクセスできます。

とにかく、Java チュートリアルをよく読むことを強くお勧めします。ここに1つあります:

http://docs.oracle.com/javase/tutorial

他の JVM 言語のコンストラクター

encapsulationを実装するためにコンストラクター引数をインスタンスフィールドに明示的にコピーする必要があるJavaの冗長性に主に苦労していると思います。他の言語はこれをよりエレガントに解決しており、クラス自体とともにコンストラクターを暗黙的に定義できます。ただし、それでも上記の Java コードと同等のものに変換されます。例えば:

スカラ:

class Greeter(message: String) {
    def SayHi() = println(message)
}

val greeter = new Greeter("Hello world!")
greeter.SayHi()

ここからの例: http://joelabrahamsson.com/learning-scala-part-four-classes-and-constructors/

セイロン

class Point(Float x, Float y) { ... }
object origin extends Point(0.0, 0.0) {}

ここからの例: http://ceylon-lang.org/documentation/1.0/spec/html_single/

于 2013-06-26T10:33:08.177 に答える
0

パラメーターのスコープはメソッド自体を超えて拡張されないため、引数を渡します。

public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
    getChillingTime(wineTemp, preferredTemp, chillTemp); // pass the arguments
}

public void getChillingTime(
            double wineTemp, double preferredTemp, double chillTemp) {
    // ...
}

または、すべてのインスタンスメソッドから自動的にアクセスできるインスタンスメンバー フィールドとして保存します(推奨) 。

public class WineChiller {

    // instance member fields
    private double wineTemp;
    private double preferredTemp;
    private double chillTemp;

    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        this.preferredTemp = preferredTemp;
        this.chillTemp = chillTemp;

        getChillingTime();
    }

    public void getChillingTime() {
        // ...
    }
}
于 2013-06-26T10:37:58.540 に答える
0

getChillingTime が wi​​neTemp などを変数に解決できないのはなぜですか?

それはローカル変数がどのように機能するかではありません。wineTempの中に閉じ込められているだけWineChiller constructorです。メソッドに引数として渡してgetChillingTime()使用するか、クラスのインスタンス変数にする必要があります。

 public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        getChillingTime(wineTemp);
    }
 public void getChillingTime(double wineTemp) {

また:

public class WineChiller {
private double wineTemp;
    public WineChiller(double wineTemp, double preferredTemp, double chillTemp) {
        this.wineTemp = wineTemp;
        getChillingTime();
    }

標準的な方法である2番目のアプローチをお勧めします。

于 2013-06-26T10:32:15.060 に答える