静的変数で最終変数にアクセスできないのはなぜですか。コンパイル時に、それらは単にそれらの値で直接置換されるので、静的メソッドでも使用できるようにする必要があります
なぜこの制限なのですか?
static=クラス内。
final =は値を変更しません(ただし、静的でない場合は各インスタンスの値になります)。
たとえば、次のことができます。
public class Weird
{
private static long number = System.getTimeInMilis();
private final long created = System.getTimeInMilis();
}
Weirdオブジェクトを作成するたびに、createdの値が異なります。
ただし、Weird.numberの値は、クラスがロードされた時刻になります。
すべてのfinal
変数がコンパイル時定数であるとは限りません。static final
コンパイラがコンパイル時定数として置き換えることができるのは変数のみです。final
場合によっては、修飾子はconst-correctnessを保証するためにのみ使用されます。
また、static
メソッドは非静的変数にアクセスできません。これらの変数は、同じクラスのインスタンスごとに異なる値を持つ可能性があるためです。
static
メソッドがインスタンス変数にアクセスできない理由を尋ねているfinal
場合(最終的なメンバー変数は常にコード内でリテラル値または定数値に設定されているという[誤った]仮定に基づいて)、クラスのインスタンスが異なれば、同じfinal
インスタンス変数(たとえば、コンストラクターを介して設定できます)。メソッドはクラスのstatic
特定のインスタンスに関する知識を持たず、static final
変数にしかアクセスできませんでした。