Java では、static は修飾子であり、クラス メンバーのメソッドとクラス メンバー変数を変更するために使用されます。さらに、プログラムのパフォーマンスを最適化するために静的コード ブロックを作成できます。static キーワードによって変更されたメソッドや変数は影響を受けません。アクセスするにはオブジェクトに依存する必要がありますが、クラスがロードされている限り、クラス名を通じてアクセスできます。
(推奨チュートリアル: java 入門チュートリアル)
「Java プログラミングの考え方」の P86 に次の一節があります:
「静的メソッドは、これがなければメソッドです。静的メソッド内で非静的メソッドを呼び出すことはできません。その逆も可能です」可能です。また、オブジェクトを作成せずに、クラス自体を介してのみ静的メソッドを呼び出すことができます。実際、これが静的メソッドの主な目的です。」
この段落では静的メソッドについてのみ説明しますが、特別なstatic キーワードの基本的な機能を一言で説明すると、
オブジェクトを作成せずに (メソッド/変数) を呼び出すことができるので便利です。
明らかに、static キーワードによって変更されたメソッドや変数は、アクセスのためにオブジェクトに依存する必要はなく、クラスがロードされている限り、クラス名を通じてアクセスできます。
static は、クラス メンバー メソッドとクラス メンバー変数を変更するために使用される修飾子です。さらに、プログラムのパフォーマンスを最適化するために静的コード ブロックを作成できます。
(ビデオ チュートリアルの推奨事項: javaビデオ チュートリアル)
1. 静的変更メンバー メソッド
静的変更メソッドは一般に静的メソッドと呼ばれます。静的メソッドはオブジェクトに依存せずにアクセスできるため、静的メソッドの場合, there is no this, because it is notattached to any object. オブジェクトが存在しないので、this は存在しません。また、この機能により、クラスの非静的メンバー変数および非静的メンバー メソッドに静的メソッドでアクセスすることはできません。これは、非静的メンバー メソッド/変数は呼び出す前に特定のオブジェクトに依存する必要があるためです。
ただし、非静的メンバー メソッドと非静的メンバー変数には静的メソッドではアクセスできませんが、静的メンバー メソッド/変数には非静的メンバー メソッドでアクセスできることに注意してください。例:
#上記のコードでは、print2 メソッドはオブジェクトとは独立して存在するため、クラス名を使用して直接呼び出すことができます。
非静的メソッド/変数が静的メソッドでアクセスできる場合、メイン メソッドに次のステートメントがあるとします:
MyObject.print2();
このときオブジェクトは存在せず、str2も全く存在しないので矛盾が生じます。メソッドについても同様で、print1メソッドでは非静的メンバ変数にアクセスするかどうか予測できないため、静的メンバメソッド内での非静的メンバ変数へのアクセスも禁止されています。
非静的メンバー メソッドの場合、静的メンバー メソッド/変数へのアクセスに制限はありません。
したがって、オブジェクトを作成せずにメソッドを呼び出したい場合は、このメソッドを static に設定できます。最も一般的な静的メソッドは main メソッドですが、main メソッドが静的である必要がある理由については、これで明らかになりました。プログラムは main メソッドの実行時にオブジェクトを作成しないため、クラス名を介してのみアクセスできます。
2. 静的に変更されたメンバー変数
静的に変更された変数は、静的変数とも呼ばれます。静的変数と非静的変数の違いは、静的変数はすべてのオブジェクトによって共有され、静的変数だけが存在することです。メモリ内に 1 つあり、クラスが最初にロードされた場合にのみ初期化されるコピー。非静的変数はオブジェクトによって所有され、オブジェクトの作成時に初期化されます。複数のコピーがあり、各オブジェクトが所有するコピーは相互に影響しません。
静的メンバー変数の初期化順序は、定義された順序で初期化されます。
3. 静的変更コード ブロック
static キーワードのもう 1 つの重要な役割は、プログラムのパフォーマンスを最適化するために静的コード ブロックを形成することです。静的ブロックはクラス内のどこにでも配置でき、クラス内に複数の静的ブロックが存在する可能性があります。クラスが初めてロードされるとき、各静的ブロックは静的ブロックの順序で 1 回だけ実行されます。
静的ブロックは、クラスが初めてロードされるときに 1 回だけ実行されるという特性により、プログラムのパフォーマンスを最適化できます。次のように:
class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf("1946"); Date endDate = Date.valueOf("1964"); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }
isBornBoomer は、その人が 1946 年から 1964 年の間に生まれたかどうかを判断するために使用されます。次のように変更すると、より効率的になります。
class Person { private Date birthDate; private static Date startDate, endDate; static { startDate = Date.valueOf("1946"); endDate = Date.valueOf("1964"); } public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate) >= 0 && birthDate.compareTo(endDate) < 0; } }
したがって、一度だけ実行する必要がある多くの初期化操作は、静的コード ブロックに配置されます。
1. 与C/C++中的static不同,Java中的static关键字不会影响到变量的变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected这几个关键字。示例如下:
提示错误,说明static关键字并不会改变变量和方法的访问权限。
2. 虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。如下:
public class Test { static int value = 11; public static void main(String[] args) { new Test().printValue(); } private void printValue() { int value = 22; System.out.println(this.value); } }
输出的结果是:11
这里的this表示的是当前对象,那么通过new Test()来调用printValue的话,当前对象就是通过new Test()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是11。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出11。需要记住的是:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要权限足够)。
3. 在C/C++中static关键字是可以作用于局部变量的,但是在Java中是不允许使用static修饰局部变量的。这是Java语法的规定。
更多编程相关知识,请访问:编程教学!!
以上がJavaの静的キーワードの機能は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。