4

変数に属するメソッドの参照が破棄されるとどうなりますか?

public class Hey{
    public double bar;

    public Hey(){
        bar = 2.0d;
    }

    public double square(double num){
        return Math.pow(num , bar);
    }
}

Function<Double, Double> square;
whatsGonnaHappen: {
    Hey hey = new Hey();
    square = hey::square;
}//is hey still kept around because its method is being referenced?

double ans = square.apply(23d);
4

2 に答える 2

11

スコープは、ソース コード内の名前を使用できる場所を管理するコンパイル時の概念です。JLSから

宣言のスコープは、プログラムの領域であり、宣言によって宣言されたエンティティは、可視である場合に単純な名前を使用して参照できます (§6.4.1)。

名前heyがラベル付けされたステートメントの本体に制限されているという事実は、実行時にwhatsGonnaHappen参照されるインスタンスがガベージ コレクションの候補であるかどうかには関係ありませんhey(これはあなたが心配していることだと思います)。

変数キャプチャに関しては、はい、メソッド参照hey::squareは特定のオブジェクト (によって参照されるもの) のインスタンス メソッドへの参照であるため、メソッド参照式が評価されてインスタンスが生成され、それが使用されるときにhey、変数の値がキャプチャされます。が呼び出されたheyとき。apply

于 2015-10-07T21:25:13.170 に答える