静的キーワードは、多くの友人がコードを書いて読むときに遭遇するキーワードです。また、大手企業のインタビュアーがインタビュー中に尋ねたいという知識ポイントの1つです。まず、静的キーワードの使用と一般的な誤解について話しましょう。最後に、書かれたインタビューで静的に関するいくつかの一般的なテストの質問をリストします。この記事のディレクトリの概要は次のとおりです。
1.静的キーワードの目的
2。静的キーワードの誤解
3.一般的な書面によるインタビューの質問
誤りがある場合は、批判と修正を理解し、歓迎したいと思っています。
著者の労働の成果を尊重してください。転載時に元のリンクを示してください:
http://www.cnblogs.com/dolphin0520/p/3799052.html
1.静的キーワードの目的
「静的方法はこれなしの方法です。非静的な方法は静的方法内で呼び出すことはできません。これは可能です。そして、静的方法は、オブジェクトを作成せずにクラス自体を通じてのみ呼び出すことができます。これは実際には静的方法の主な目的です。」
このパッセージは静的メソッドの特別な特徴のみを示していますが、静的キーワードの基本的な機能がわかります。要するに、それは1つの文で説明されています:
オブジェクトを作成せずに(方法/変数)呼び出すと便利です。
明らかに、静的キーワードによって変更されたメソッドまたは変数は、アクセスのためにオブジェクトに依存する必要はありません。クラスがロードされている限り、クラス名からアクセスできます。
静的を使用して、クラスメンバーのメソッドとクラスメンバー変数を変更できます。さらに、プログラムのパフォーマンスを最適化するために、静的コードブロックを書き込むことができます。
1)静的メソッド
静的方法は、一般に静的方法と呼ばれます。静的メソッドには、オブジェクトに頼らずにアクセスできるため、オブジェクトに依存しないため、静的メソッドにはこれはありません。オブジェクトがないので、このようなものはありません。また、この機能により、非静的なメンバーの変数と非静的なメンバーメソッドに静的メソッドでアクセスすることはできません。なぜなら、非静的なメンバーの方法/変数は、呼び出される特定のオブジェクトに依存する必要があるからです。
ただし、静的メソッドでは、非静的なメンバー方法と非静的なメンバー変数にアクセスすることはできませんが、静的メンバーの方法/変数は非静的なメンバーメソッドでアクセスできることに注意してください。簡単な例を見てみましょう:
上記のコードでは、print2メソッドはオブジェクトとは独立して存在するため、クラス名で直接呼び出すことができます。静的メソッドで非静的な方法/変数にアクセスできる場合、主な方法に次のステートメントがある場合:
myobject.print2();
現時点では、オブジェクトはなく、Str2はまったく存在しないため、矛盾があります。メソッドにも同じことが言えます。非静的なメンバー変数がprint1メソッドでアクセスされるかどうかを予測することはできないため、静的メンバーメソッドの非静的メンバーメソッドにアクセスすることも禁止されています。
また、非静的なメンバーメソッドの場合、静的なメンバーのメソッド/変数にアクセスすることは明らかに無制限です。
したがって、オブジェクトを作成せずにメソッドを呼び出す場合は、このメソッドを静的に設定できます。最も一般的な静的方法が主な方法です。主な方法が静的でなければならない理由については、今では非常に明確です。メインメソッドを実行するときにプログラムはオブジェクトを作成しないため、クラス名からのみアクセスできます。
また、静的として表示されていなくても、クラスのコンストラクターは実際には静的な方法であることを忘れないでください。
2)静的変数
静的変数は静的変数とも呼ばれます。静的変数と非静的変数の違いは、静的変数がすべてのオブジェクトによって共有され、メモリに1つのコピーのみが共有され、クラスが初めてロードされた場合にのみ初期化されることです。非静的変数はオブジェクトによって所有され、オブジェクトを作成するときに初期化されます。複数のコピーがあり、各オブジェクトが所有するコピーは互いに影響しません。
静的メンバー変数の初期化順序は、定義された順序で初期化されます。
3)静的コードブロック
静的キーワードのもう1つの重要な関数は、プログラムのパフォーマンスを最適化するために静的コードブロックを形成することです。静的ブロックはクラス内のどこにでも配置でき、クラスに複数の静的ブロックがある場合があります。クラスが最初にロードされると、各静的ブロックは静的ブロックの順序で実行され、1回のみ実行されます。
静的ブロックを使用してプログラムのパフォーマンスを最適化できる理由は、その特徴のためです。クラスがロードされたときにのみ実行されるのです。これが例です:
クラスパーソン{private date birthdate; public person(date birthdate){this.birthdate = birthdate;} boolean isbornboomer(){date startdate = date.valueof( "1946"); date.valueof( "1964"); retund birthdate.compareto) Isbornboomerは、この人が1946年から1964年に生まれたかどうかに慣れています。 isbornboomerが呼ばれるたびに、2つのオブジェクトが生成され、スペースの無駄を引き起こします。これに変更した場合、それはより良いでしょう:
クラスの人{private date birthdate; private static date startdate、enddate; static {startdate = date.valueof( "1946"); enddate = date.valueof( "1964");} public birthdate){this.birthdate = hirddate; BARTHIND.COMPARETO(EndDate)<0;}}したがって、多くの場合、一度だけ実行する必要があるいくつかの初期化操作は、静的コードブロックに配置されます。
2。静的キーワードの誤解
1.静的キーワードは、クラスのメンバーのアクセス権を変更しますか?
一部の初心者は、Javaの静的をC/C ++の静的キーワード関数と混同します。ここで1つのことを覚えておいてください。C/C ++の静的とは異なり、Javaの静的キーワードは変数やメソッドの範囲に影響しません。 Javaでは、アクセス権限に影響を与える可能性のあるキーワードは、プライベート、パブリック、保護されています(パッケージアクセス許可を含む)。理解するために次の例を見てください。
「Person.ageが表示されない」という迅速なエラーは、静的キーワードが変数とメソッドのアクセス権限を変更しないことを意味します。
2。これにより静的メンバー変数にアクセスできますか?
静的な方法にはこれはありませんが、非静的な方法では、これを通じて静的メンバー変数にアクセスできますか?まず次の例を見てみましょう。このコード出力の結果は何ですか?
パブリッククラスMain {static int value = 33; public static void main(string [] args)throws exception {new main()。printvalue();} private void printvalue(){int value = 3; system.out.println(this.value);}}}} 33
これは主にこれを理解するための主要な観察チームです。これは何を表していますか?これは現在のオブジェクトを表します。 printValueがnew main()を介して呼び出される場合、現在のオブジェクトはnew main()によって生成されたオブジェクトです。静的変数はオブジェクトによって享受されるため、printValueの値の値は間違いなく33です。printValueメソッド内の値はローカル変数であり、これにまったく関連付けることはできません。すべての静的メソッドと静的変数は、オブジェクトからアクセスできます(アクセス権限で十分である限り)。
3。静的変数に静的作用できますか?
C/C ++では、静的はローカル変数を範囲することができますが、Javaで覚えておいてください:静的を使用してローカル変数を変更することはできません。理由を尋ねないでください、これがJava構文の提供です。
3.一般的な書面によるインタビューの質問
以下には、書かれたインタビューでしばしば遭遇する静的キーワードに関するいくつかの質問がリストされています。参照用のみです。サプリメントがある場合は、以下にメッセージを残してください。
1.次のコードの出力結果は何ですか?
パブリッククラステストはbase {static {system.out.println( "test static");} public test(){system.out.println( "test constructor");} public static void main(string [] args){new test();}} class base {static {system.out.out.out.Outln( "base static"); base(){system.out.println( "ベースコンストラクター");}}ベース静的
静的テスト
ベースコンストラクター
テストコンストラクター
なぜこの結果があるのかについては、最初に議論しないでください。このコードの特定の実行プロセスについて考えてみましょう。実行の開始時に、主な方法はプログラムの入り口であるため、最初にメインメソッドを見つける必要がありますが、メインメソッドを実行する前に、テストクラスを最初にロードする必要があります。テストクラスをロードすると、テストクラスが基本クラスから継承されることがわかります。そのため、最初にベースクラスをロードするようになります。ベースクラスをロードすると、静的ブロックがあることがわかり、静的ブロックを実行します。ベースクラスがロードされた後、テストクラスはロードされ続け、テストクラスに静的ブロックがあることがわかり、静的ブロックが実行されます。必要なクラスを読み込んだ後、メインメソッドが実行され始めます。メインメソッドで新しいテスト()を実行すると、親クラスのコンストラクターが最初に呼び出され、次に独自のコンストラクターが呼び出されます。したがって、上記の出力結果が表示されます。
2。このコードの出力結果は何ですか?
public class test {person person = new person( "test"); static {system.out.println( "test static");} public test(){system.out.println( "test constructor");} public static void main(string [] args){new myclass();}} class person {systatic publintln( "systatic {system.out.pers.pers.pers.pers.per str){system.out.println( "person"+str);}} class myclass extends test {person person = new person( "myclass"); static {system.out.println( "myclass static");} public myclass(){system.out.out.println( "myclass construction");}}}}}静的テスト1
静的2をテストします
主な方法には声明はありませんが、その理由が上記で説明されているため、それらはまだ出力されます。さらに、静的ブロックはクラス内のどこにでも表示できます(メソッド内にない限り、メソッドはできないことを忘れないでください)。
上記は、編集者が紹介したJavaの静的キーワードの包括的な分析です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!