189

私はいつもJavastaticのキーワードとfinalキーワードの間で混乱しています。

それらはどう違いますか ?

4

11 に答える 11

258

static キーワードは 4 つのシナリオで使用できます

  • 静的変数
  • 静的メソッド
  • コードの静的ブロック
  • static ネストされたクラス

最初に静的変数と静的メソッドを見てみましょう。

静的変数

  • オブジェクト(インスタンス)ではなく、クラスに属する変数です。
  • 静的変数は、実行の開始時に一度だけ初期化されます。これらの変数は、インスタンス変数の初期化の前に最初に初期化されます。
  • クラスのすべてのインスタンスで共有される単一のコピー。
  • 静的変数はクラス名で直接アクセスでき、オブジェクトは必要ありません。
  • 構文:Class.variable

静的メソッド

  • オブジェクト(インスタンス)ではなく、クラスに属するメソッドです。
  • 静的メソッドは、静的データのみにアクセスできます。クラスのインスタンスを作成/作成しない限り、非静的データ (インスタンス変数) にアクセスできません。
  • 静的メソッドは、他の静的メソッドのみを呼び出すことができ、クラスのインスタンスを持っている/作成しない限り、非静的メソッドを呼び出すことはできません。
  • 静的メソッドはクラス名で直接アクセスでき、オブジェクトは必要ありません。
  • 構文:Class.methodName()
  • thisとにかく、静的メソッドはまたはsuperキーワードを参照できません。

静的クラス

Javaには「静的ネストクラス」もあります。静的なネストされたクラスは、外部クラスのインスタンスへの参照を暗黙的に持たないクラスです。

ネストされた静的クラスは、インスタンス メソッドと静的メソッドを持つことができます。

Java には最上位の静的クラスなどというものはありません。

サイドノート:

main メソッドはstatic、インスタンス化が行われる前にアプリケーションを実行するためにアクセスできる必要があるためです。

finalキーワードは、後で変更できないエンティティを定義するために、いくつかの異なるコンテキストで使用されます。

  • クラスはfinalサブクラス化できません。これは、セキュリティと効率の理由から行われます。したがって、Java 標準ライブラリ クラスの多くは、finaljava.lang.Systemなどjava.lang.Stringです。クラス内のすべてのメソッドfinalは暗黙的にfinal.

  • サブクラスによってメソッドをオーバーライドするfinalことはできません。これは、クラスの機能または一貫性にとって重要なメソッドを変更するサブクラスからの予期しない動作を防ぐために使用されます。

  • final変数は、初期化子または割り当てステートメントを介して一度だけ初期化できます。宣言の時点で初期化する必要はありません。これはblank final変数と呼ばれます。クラスの空の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。同様に、空白の final 静的変数は、それが宣言されているクラスの静的初期化子で確実に割り当てる必要があります。そうしないと、どちらの場合もコンパイル時エラーが発生します。

注: 変数が参照である場合、これは変数を再バインドして別のオブジェクトを参照できないことを意味します。しかし、それが参照するオブジェクトは、もともと変更可能であった場合でも変更可能です。

メソッドの本体内で匿名の内部クラスが定義されている場合、finalそのメソッドのスコープで宣言されているすべての変数は、内部クラス内からアクセスできます。割り当てられると、最終変数の値は変更できません。

于 2012-12-07T23:59:02.690 に答える
41

staticは、インスタンスではなくクラスに属していることを意味します。これは、特定のClassのすべてのインスタンス間で共有される変数/メソッドのコピーが 1 つしかないことを意味します。

public class MyClass {
    public static int myVariable = 0; 
}

//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances

MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();

MyClass.myVariable = 5;  //This change is reflected in both instances

finalはまったく関係がなく、一度だけの初期化を定義する方法です。変数を定義するとき、またはコンストラクター内で初期化できます。

note最終メソッドと最終クラスに関する注意。これは、メソッドまたはクラスをそれぞれオーバーライド/拡張​​できないことを明示的に示す方法です。

補足資料 静的のトピックでは、静的ブロックで使用されることがある他の用途について話していました。静的変数を使用する場合、クラスを使用する前にこれらの変数を設定する必要がある場合がありますが、残念ながらコンストラクターは取得できません。ここで static キーワードの出番です。

public class MyClass {

    public static List<String> cars = new ArrayList<String>();

    static {
        cars.add("Ferrari");
        cars.add("Scoda");
    }

}

public class TestClass {

    public static void main(String args[]) {
        System.out.println(MyClass.cars.get(0));  //This will print Ferrari
    }
}

これを、インスタンスごとのコンストラクターの前に呼び出されるインスタンス初期化ブロックと混同してはなりません。

于 2012-12-07T23:52:22.273 に答える
26

二人は本当に似ていません。staticフィールドは、クラスの特定のインスタンスに属さないフィールドです。

class C {
    public static int n = 42;
}

ここでは、staticフィールドnは の特定のインスタンスに関連付けられているのではなくC、一般にクラス全体に関連付けられています (これが、C.nを使用してアクセスできる理由です)。のインスタンスを使用しCて にアクセスできますnか? はい - ただし、特に良い習慣とは見なされません。

final一方、特定の変数は初期化後に変更できないことを示します。

class C {
    public final int n = 42;
}

こちらは、nですので、再割り当てできませんfinal。もう 1 つの違いは、すべての変数をfinal静的に宣言できるわけではありませんが、任意の変数を宣言できることです。

finalまた、拡張できないことを示すクラスを宣言することもできます。

final class C {}

class B extends C {}  // error!

同様に、メソッドを final と宣言して、拡張クラスによってオーバーライドできないことを示すことができます。

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}
于 2012-12-07T23:54:27.643 に答える
22

最後の -

1) " final " キーワードを変数に適用すると、その変数の値は一定のままです。(または)変数finalとして宣言すると、その変数の値は変更できません。

2) プログラムの存続期間中、変数の値が変化しない場合に便利です。

静的 -

1)変数に「 static」キーワードを適用すると、それはクラスに属していることを意味します。 2)メソッドに「 static 」キーワードを適用するクラスのインスタンスを作成せずにメソッドにアクセスできることを意味します

于 2014-04-07T23:17:26.230 に答える
6

オブジェクトをスピーカーのように考えてください。Speaker がクラスの場合、音量、高音、低音、色などのさまざまな変数があります。Speaker クラスを定義するときに、これらすべてのフィールドを定義します。たとえば、 static 修飾子を使用して color フィールドを宣言しました。これは、クラスがインスタンス化された回数に関係なく、この変数のコピーが 1 つだけ存在することをコンパイラに伝えていることを意味します。

宣言する

static final String color = "Black"; 

このクラスがインスタンス化されるたびに、変更されていない限り、カラーフィールドの値が「黒」になるようにします。

public class Speaker {

static String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //will provide output as "Black"
            Speaker.color = "white";
    System.out.println(Speaker.color);  //will provide output as "White"
}}

注 : スピーカーの色を final として変更すると、このコードは実行されません。これは、final キーワードがフィールドの値が変更されないことを確認するためです。

public class Speaker {

static final String color = "Black";

}

public class Sample {

public static void main(String args[]) {
    System.out.println(Speaker.color); //should provide output as "Black"
            Speaker.color = "white"; //Error because the value of color is fixed.  
    System.out.println(Speaker.color); //Code won't execute.
}}

このコードをエミュレータに直接コピーして貼り付けて試すことができます。

于 2014-01-28T22:14:52.183 に答える
3

static と final にはいくつかの大きな違いがあります。

静的変数またはクラスは、(ほぼ) どこからでも常に利用できます。Final は、変数を変更できないことを意味する単なるキーワードです。したがって、次の場合:

public class Test{    
   public final int first = 10;
   public static int second = 20;

   public Test(){
     second = second + 1
     first = first + 1;
   }
}

プログラムは、エラーの原因となる「最初の」整数を変更しようとするまで実行されます。このクラスの外では、クラスをインスタンス化した場合にのみ、「最初の」変数にアクセスできます。これは、常に使用可能な「second」とは対照的です。

于 2012-12-07T23:56:41.500 に答える
1

static は、クラス内の任意のオブジェクトが呼び出すことができるものであり、本質的にオブジェクト型に属しています。

変数はクラス全体で最終的なものになる可能性があり、それは単純にそれ以上変更できないことを意味します。一度しか設定できず、再度設定しようとするとエラーがスローされます。これは、変更できない定数を宣言する場合など、さまざまな理由で役立ちます。

いくつかのコード例:

class someClass
{
   public static int count=0;
   public final String mName;

   someClass(String name)
   {
     mname=name;
     count=count+1;
   }

  public static void main(String args[])
  {
    someClass obj1=new someClass("obj1");
    System.out.println("count="+count+" name="+obj1.mName);
    someClass obj2=new someClass("obj2");
    System.out.println("count="+count+" name="+obj2.mName);
  }
}

ウィキペディアには、Java キーワードの完全なリストが含まれています。

于 2012-12-07T23:50:16.157 に答える
0

ここで完全な答えを出すつもりはありません。それぞれが何をするのかを理解することに集中することをお勧めします。そうすれば、それらの効果が完全に異なり、なぜそれらが一緒に使用されることがあるのか​​を明確にする必要があります.

staticクラスのメンバー (属性とメソッド) のためのものであり、インスタンス (非静的) メンバーとは対照的に理解する必要があります。The Java Tutorials の「Understanding Instance and Class members」を読むことをお勧めします。ブロックでも使用できますstaticが、最初は気にしません。

final変数、メソッド、クラス、またはその他のケースに適用されるかどうかに応じて、異なる意味を持ちます。ここではウィキペディアの説明の方が好きです。

于 2012-12-08T00:03:24.093 に答える
-1

静的変数値は、変数の 1 つのコピーがアプリケーションを通過しても変更される可能性がありますが、最終変数値は一度初期化でき、アプリケーション全体で変更することはできません。

于 2018-11-21T16:26:22.013 に答える