私はいつもJavastatic
のキーワードとfinal
キーワードの間で混乱しています。
それらはどう違いますか ?
最初に静的変数と静的メソッドを見てみましょう。
Class.variable
Class.methodName()
this
とにかく、静的メソッドはまたはsuper
キーワードを参照できません。Javaには「静的ネストクラス」もあります。静的なネストされたクラスは、外部クラスのインスタンスへの参照を暗黙的に持たないクラスです。
ネストされた静的クラスは、インスタンス メソッドと静的メソッドを持つことができます。
Java には最上位の静的クラスなどというものはありません。
main メソッドは
static
、インスタンス化が行われる前にアプリケーションを実行するためにアクセスできる必要があるためです。
final
キーワードは、後で変更できないエンティティを定義するために、いくつかの異なるコンテキストで使用されます。クラスはfinal
サブクラス化できません。これは、セキュリティと効率の理由から行われます。したがって、Java 標準ライブラリ クラスの多くは、final
やjava.lang.System
などjava.lang.String
です。クラス内のすべてのメソッドfinal
は暗黙的にfinal
.
サブクラスによってメソッドをオーバーライドするfinal
ことはできません。これは、クラスの機能または一貫性にとって重要なメソッドを変更するサブクラスからの予期しない動作を防ぐために使用されます。
final
変数は、初期化子または割り当てステートメントを介して一度だけ初期化できます。宣言の時点で初期化する必要はありません。これはblank final
変数と呼ばれます。クラスの空の final インスタンス変数は、それが宣言されているクラスのすべてのコンストラクターの最後に確実に割り当てる必要があります。同様に、空白の final 静的変数は、それが宣言されているクラスの静的初期化子で確実に割り当てる必要があります。そうしないと、どちらの場合もコンパイル時エラーが発生します。
メソッドの本体内で匿名の内部クラスが定義されている場合、final
そのメソッドのスコープで宣言されているすべての変数は、内部クラス内からアクセスできます。割り当てられると、最終変数の値は変更できません。
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
}
}
これを、インスタンスごとのコンストラクターの前に呼び出されるインスタンス初期化ブロックと混同してはなりません。
二人は本当に似ていません。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!
}
最後の -
1) " final " キーワードを変数に適用すると、その変数の値は一定のままです。(または)変数をfinalとして宣言すると、その変数の値は変更できません。
2) プログラムの存続期間中、変数の値が変化しない場合に便利です。
静的 -
1)変数に「 static」キーワードを適用すると、それはクラスに属していることを意味します。
2)メソッドに「 static 」キーワードを適用すると、クラスのインスタンスを作成せずにメソッドにアクセスできることを意味します
オブジェクトをスピーカーのように考えてください。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.
}}
このコードをエミュレータに直接コピーして貼り付けて試すことができます。
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」とは対照的です。
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 キーワードの完全なリストが含まれています。
ここで完全な答えを出すつもりはありません。それぞれが何をするのかを理解することに集中することをお勧めします。そうすれば、それらの効果が完全に異なり、なぜそれらが一緒に使用されることがあるのかを明確にする必要があります.
static
クラスのメンバー (属性とメソッド) のためのものであり、インスタンス (非静的) メンバーとは対照的に理解する必要があります。The Java Tutorials の「Understanding Instance and Class members」を読むことをお勧めします。ブロックでも使用できますstatic
が、最初は気にしません。
final
変数、メソッド、クラス、またはその他のケースに適用されるかどうかに応じて、異なる意味を持ちます。ここではウィキペディアの説明の方が好きです。
静的変数値は、変数の 1 つのコピーがアプリケーションを通過しても変更される可能性がありますが、最終変数値は一度初期化でき、アプリケーション全体で変更することはできません。