2

時々私は次のようなものを見ます:

public class MainActivity extends Activity
{
    public static final String url_google = "http://www.google.com";

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }    
}

私が実際に得られないのは、なぜ , を使用し、 or を使用しpublic static finalないの かということですpublic finalfinal

4

5 に答える 5

14

私は非常に大まかに話していますが、それが最終的なものであれば、いずれにせよ必要なインスタンスは 1 つだけなので、静的にすることでメモリを節約できます。

より具体的に言えば、finalキーワードは、変数が格納するものは何でも変更できないことを意味します。つまり、変数に値が設定されると、その変数を使用できますが、変更することはできません。通常、最終的な変数に値を与えるには、宣言から直接行いますfinal int variable = 12。ご覧のとおり、例では int を使用しましたが、参照変数を含め、何でも使用できます。ただし、参照変数は特別です。変数が指すものを変更することはできませんが、オブジェクト自体を変更することはできます (get/set メソッドを使用するなど)。

ただし、最終的な変数を作成すると、メモリ内のスペースが占有されるということです。この変数をこれ以上変更することはできないのに、クラスがインスタンス化されるたびに変数を再作成する必要があるのはなぜでしょうか? そこで、staticキーワードを使用します。これにより、変数をメモリ内で 1 回だけ作成できます。

staticただし、最終的なものだけを使用して使用したくない特定のケースがいくつかあります。一例として、オブジェクトのインスタンス化の時間を格納するなど、時間に敏感な変数が考えられます。

于 2012-12-09T20:24:32.830 に答える
3

static1 つだけurl_google作成されることを意味します。インスタンス フィールド (静的ではない) のurl_google場合、アクティビティのインスタンスごとに新しい が作成され、実際に必要なのは の 1 つのコピーだけですurl_google

于 2012-12-09T20:25:27.980 に答える
3

Javafinalキーワードは、何かが「変更できない」ことを示すために非常に大まかに使用されます。

staticこれは、すべてのインスタンスが変数の同じコピーを共有することを意味する「クラス変数」であることを示したキーワードとは関係ありません。クラス変数は、インスタンスを作成する必要なく、クラスで直接アクセスできます。

これらは異なる意味を持ち、一緒に使用することも、別々に使用することもできます。

于 2012-12-09T20:26:25.057 に答える
1

A--C の答えは誤解を招くと思います。他の人が指摘したように、彼は2つの非常に異なるものである静的と最終を混在させています。大まかに言えば私見ではありませんが、特に基本的な概念を説明する場合は、十分に正確ではありません。

静的変数は、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の 1 つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

反対側の最終変数は、一度だけ初期化できる変数です。それらの値は、コンパイル時に知る必要はありませんが、実行時に設定できます。final 変数がインスタンス変数の場合、この変数には多くのインスタンスが存在する可能性があり、すべて異なる値を持ちます。

static final 変数は 1 つしかなく、一度初期化されると実行時に変更できないため、定数です。Java では、少なくともコンパイル時に値を知る必要はありません。

これはすべて非常に理論的なものなので、これらのタイプの変数の使用法を示す例を作成しましょう。

public class Circle implements Serializable {
    private static final long serialVersionUID = -1990742486979833728L;
    private static int sNrOfCircles;
    private final double mArea;

    public Circle(double radius) {
        sNrOfCircles++;
        mArea = radius*radius*Math.PI;
    }
}

serialVersionUID は、逆シリアル化中に使用される Circle クラスにバージョン番号を関連付けて、送信側と受信側がシリアル化に関して互換性のあるそのオブジェクトのクラスをロードしたことを確認します。serialVersionUID は変更されず、Circle のすべてのインスタンスで同じです。

sNrOfCircles は、Circle インスタンスの数をカウントします。Circle の新しいインスタンスごとに変更されます (serialVersionUID は変更されません)。

mArea は円の面積を定義します。また、Circle のすべてのインスタンスで変更されますが、sNrOfCircles と比較すると、Circle クラスではなく Circle オブジェクトに関連付けられており、別の Circle オブジェクトが作成されると sNrOfCircles が変更される間は変更できません。

簡単に言うと、Class 属性の場合は static を使用し (円はいくつありますか?)、初期化後に値が変更されない場合は final を使用し (指定された半径の円の領域)、それが変更されない場合は static final を使用します。両方。

于 2013-02-24T05:56:34.450 に答える
0

主な理由は、クラスの実際のインスタンスを必要とせずに値にアクセスできることです。

あなたの例では、MainActivity のインスタンスを必要とせずに、どのコードでも url_google 値にアクセスできます。

于 2012-12-09T20:26:00.377 に答える