Javaのstaticキーワードについて

3119 ワード

最近、staticキーワードの役割を考えています.
ブログを読んだ后、自分は深く感じて、自分の日记の中に记录することにしました~staticキーワードについてみんながよく知っているのは彼がクラスの属性やクラスの方法を修飾するキーワードです.staticによって修飾されたクラス属性やクラスメソッドはnewオブジェクトを出す必要はなく,直接クラス名点から出ればよい.たとえば、Personクラスにstaticで修飾されたeyeプロパティを作成します.では、プロパティを取得するときはPerson.eyeで直接参照でき、newでインスタンスを出す必要はありません.Personクラスにはeatの方法があります.その方法がクラスメソッドです.直接クラス名Person.eat();食べる方法を直接呼び出すことができます.
静的修飾された属性は,そのクラスの静的リソースを統一データし,クラスインスタンスの中で共有する,言い換えれば,そのクラスnewから出てきたインスタンスで取得したリソースが統一されている限り,みんなが共有する.あちこちが変わる.
たばこを1本吸った後、考えてみると、3つの問題があります.静的方法では非静的な属性を使用できますか.静的メソッドで静的プロパティを使用できますか?もう1つの問題は、メンバーメソッドで静的を使用できるかどうかです.
静的リソースはクラスに属し、独立してクラスとして存在し、JVMクラスのロードメカニズムの観点から、静的リソースはクラスが初期化されたときにロードされ、静的リソースではなくクラスnewインスタンスのときにロードされます.重要なのは、クラスのロードがnewより早いときのロードです.だから上の3つの質問には明確な答えがあります.
1.静的メソッドで非静的属性を使用できますか?答えは:いいえ、静的メソッドを実行するとき、非静的リソースを取得するとき、非静的リソースはまだロードされておらず、静的メソッドはまったく取得されません.2.静的メソッドで静的プロパティを取得できますか?答えは:はい、クラスは初期化時に静的メソッドと静的プロパティがメモリの中にあるので、両方が認識されているので、もちろん直接使用することができます.3.メンバーメソッドで静的リソースを取得できますか?答えは:もちろん、静的リソースはメンバーメソッドと優先的に存在するので、newがインスタンスを出す前に静的リソースはメモリに存在します.だからもちろんそのまま使えます!
スタティツクコードブロック
静的コードブロックは,クラス初期化時のみ実行し,1回のみ実行する.次のコードを参照してください.
public class A
{
    private static int a = B();
    
    static
    {
        System.out.println("Enter A.static block");
    }
    
    public static void main(String[] args)
    {
        new A();
    }
    
    public static int B()
    {
        System.out.println("Enter A.B()");
        return 1;
    }
}
上のコードの実行順序を見てください.mainメソッドが実行されると、Aクラスの無パラメトリック構築メソッドが呼び出され、パラメータが順番に割り当てられ、AクラスのBの静的メソッドが呼び出され、static静的コードブロックが実行されます.出力結果は、Enter A.B()Enter a.static block
//  
public class A
{
    static
    {
        System.out.println("A.static block");
    }
    
    public A()
    {
        System.out.println("A.constructor()");
    }
}
//  
public class B extends A
{
    static 
    {
        System.out.println("B.static block");
    }
    
    public B()
    {
        System.out.println("B.constructor()");
    }
    
    public static void main(String[] args)
    {
        new B();
        new B();
    }
}
このコードの実行順序は、mainメソッドでBの無パラメトリック構築方法を実行し、Bクラスをロードし、Bクラスを初期化するとBクラスの親Aクラスを先にロードし、Aクラスの静的コードブロックはまず実行し、実行が完了してからBクラスの静的コードブロックに着き、それからAクラスの無パラメトリック構築方法に至り、相次いでBクラスの構築方法を実行する.これはBクラスの最初の無パラメトリック構築方法が実行された後の結果であり、2番目の無パラメトリック構築方法が実行されると、親クラスと子クラスの静的コードブロックが実行されたことに気づき、これ以上実行されず、親クラスの無パラメトリック構築方法と子クラスの無パラメトリック構築方法のみが実行される.したがって、実行結果は、A.static block B.static block A.constructor()B.constructor()A.constructor()B.constructor()
上記のコードの実行結果から、次のことがわかります.
静的リソースのロード順序は、静的リソースの定義順序に厳格に従って実行されます.また、静的コードブロックは1回のみロードされる.
static修飾クラス
staticキーワードは一般的にクラスを修飾しません:本当にクラスを修飾するならば、必然的に静的な内部クラスです.静的内部クラスは外部クラスの非静的リソースを直接使用することはできませんが、外部メンバーが使用することをインスタンス化することで、外部クラスの静的リソースについては外部クラスのクラス名ポイントを直接使用することができ、内部クラスの属性を使用する場合は、そのまま使用すればよいです.静的内部クラスをインスタンス化する場合、非静的内部クラスをインスタンス化する場合とは異なり、外部クラスをnewしてからnewを内部クラスに出す必要はなく、インスタンス静的内部クラスの場合は直接newを内部クラスに出せばよい.
この文章はただ自分の1つの小さい白の学习の日记のため、中は多くの--IT・达人のブログから抜粋しました.達人ブロガーに感謝します.もし多くの不適切なところがあれば、直接本人に連絡してください.そしてここで改めて感謝!ありがとう