-
オブジェクトがパラメーターとして別のメソッドに渡されると、このメソッドはオブジェクトのプロパティを変更し、変更された結果を返すことができます。値によるものですか、それとも参照によるものですか?
- 値の転送。Javaでのメソッド呼び出しは、パラメータ値の転送のみをサポートします。オブジェクトのプロパティは、呼び出し中に変更できますが、この変更は呼び出し先には影響しません。
-
String、StringBuilder、StringBufferの違い
- これは、リマインダー文字列の保存と操作であり、Stringは文字列のみを読み取ることができます。つまり、Stringによって変更された文字列は変更できません。
- StringBufferとStringBuilderは、直接変更できる文字列オブジェクトを参照します。StringBufferはスレッドセーフであり、StringBuilderはスレッドセーフではないため、StringBuilderはStringBufferよりも効率的であり、これら2つのクラスのメソッドはまったく同じです。StringBuilderはjava 5によって参照されます
-
JVMは.classファイルをロードする方法、.classファイルをロードする主要なメカニズム
- クラスの読み込みはClassLoaderとそのサブクラスによって行われ、主に実行時にクラスファイル内のクラスのクエリと読み込みを行います。
- Javaのクロスプラットフォームの性質により、コンパイルされたJavaソースプログラムは実行可能プログラムではなく、1つ以上のクラスファイルです。クラスの読み込みとは、クラスの.calssファイルのデータをメモリに読み込み、バイト配列を作成して.classファイルに読み込み、読み込まれたクラスに対応するクラスオブジェクトを生成することです。読み込み後、クラスオブジェクトまだ不完全ですが、このクラスはまだ利用できません。このクラスを追加すると、接続フェーズに入ります。このフェーズには、検証、準備(静的変数へのメモリの割り当て、デフォルトの初期値の設定)、解決(シンボル参照を直接に置き換える)が含まれます(参照)3つのステップ;最後に、JVMはクラスを初期化します。これには、クラスに直接の親クラスがあり、親クラスが初期化されていない場合、親クラスが最初に初期化されます。クラスに初期化ステートメントがある場合、これらの初期化は一度に実行されます。ステートメント。
- これらのプロセスは、ルートローダー(BootStrap)、拡張ローダー(Extension)、システムローダー(System)、カスタムローダー(java.lang.ClassLoaderのサブクラス)などのクラスローダーを介して実行されます。jdk1.2以降、クラスロードプロセスは親クラス委任メカニズム(PDM)を使用します。つまり、このメカニズムでは、JVMに付属するブートストラップはルートローダーであり、他のローダーにはロードする親クラスが1つだけあります。デバイス。クラスローディングは、最初に親クラスローダーを要求します。これは、親クラスローダーが無力であるときに子クラスローダーによってのみロードされます。
- ブートストラップ:JVMのコアクラスライブラリのロードを担当
- 拡張機能:システムによって指定されたディレクトリからクラスライブラリをロードします。親ローダーはブートストラップです。
- システム:アプリケーションローダー。親クラスはExtensionで、環境変数のクラスパスまたはシステムプロパティで指定されたディレクトリからクラスをロードします。ユーザー定義ローダーのデフォルトの親ローダーです。
-
抽象クラスとインターフェースの違い:
- インスタンス化できません
- 抽象クラスは抽象を使用し、インターフェースはインターフェースを使用
- クラスは複数のインターフェースを実装できますが、継承できるのは抽象クラスのみです
- 抽象クラスは、private、default、public、protectedにすることができ、インターフェイスはpublicのみにすることができます
- 抽象メソッドを持つクラスは抽象クラスとして宣言する必要があります。抽象メソッドのないクラスは抽象クラスとして宣言できます
- メンバー変数は抽象クラスで定義できます。インターフェースで定義されたメンバー変数は実際には定数です
-
内部クラスと静的内部クラスの違い
- 静的内部クラスは静的で装飾されており、インスタンス化のために外部クラスに依存する必要はありません。通常の内部クラスは、外部クラスを通じてインスタンス化する必要があります
-
抽象メソッドを静的にできるか、ローカルメソッドにできるか、同期によって変更できるか
- いいえ、静的メソッドを書き換えることはできません。抽象メソッドにはサブクラスの継承が必要です。ローカルコードはローカルコードによって実装されたメソッドを参照しますが、抽象メソッドは実装されていません。同期はビジネスロジックを変更しますが、抽象メソッドにはロジックがありません
-
静的変数とインスタンス変数の違い
- 静的変数は静的で装飾され、クラスに属していません。静的変数はメモリに1つだけあり、メソッド領域に格納されます。インスタンス変数はクラスに属しているため、インスタンス変数を使用する前にクラスオブジェクトを作成する必要があります
-
オブジェクトの複製方法
- Cloneableインターフェースを実装し、clone()を書き換えます
- オブジェクトのシリアル化と逆シリアル化により、Serializableインターフェイスを実装する
-
.javaソースファイルに複数のクラスを含めることができますか?
- はい。ただし、ソースファイルにはパブリッククラスを1つだけ含めることができ、ファイル名はパブリッククラス名と同じでなければなりません。
-
内部クラスは、プライベートメソッドを含む外部クラスのメンバーを参照できます
-
最後のキーワード
- 変更されたクラス:クラスを継承できません
- 変更されたメソッド:メソッドはオーバーライドできません
- 変更された変数:割り当て後は変更できません
-
エラー和例外
- エラーはシステムレベルのエラーであり、メモリオーバーフローなど、手動で処理できず、キャッチできないエラーです。
- 例外とは、キャッチできる、またはプログラムで処理する必要がある例外のことです
-
一般的なランタイム例外
- NullPointerException:Nullポインタ例外
- ClassCastException:型変換例外
- IndexOutOfBoundsException:下付き文字の範囲外の例外
- IllegalArgumentException:不正なパラメータ例外
- ArithmeticException:算術例外
- ArrayIndexOutOfBoundsException:配列インデックスの範囲外例外
- StringIndexOutOfBoundsException:範囲外の文字列添え字
- NumberFormatException:数値フォーマット例外
-
TreeMapとTreeSetは、ソート時に要素をどのように比較しますか?コレクションツールクラスのsort()メソッドは要素をどのように比較しますか?
- :TreeSetでは、格納されたオブジェクトが属するクラスが、要素を比較するためのcompareTo()メソッドを提供するComparableインターフェイスを実装する必要があります。これは、要素を挿入して要素のサイズを比較するときにコールバックされます。
- TreeMapでは、マップされたキーの格納されたキーと値のペアが、キーに従って要素をソートするためにComparableインターフェースを実装する必要があります。
- コレクションツールクラスの並べ替えメソッドには2つのオーバーロードされたフォームがあります。1つ目は、並べ替え対象の受信コンテナーに格納されたオブジェクトが要素比較を実現するためにComparableインターフェイスを実装する必要があります。2つ目はコンテナー内の要素を要求しません。比較可能である必要がありますが、2番目のパラメーターを渡す必要があります。このパラメーターは、Comparatorインターフェースのサブタイプです(要素の比較を行うには、compareメソッドを書き直す必要があります)。これは、一時的に定義されたソート規則と同じです。このアルゴリズムは、コールバックモードのアプリケーションでもあります(Javaでの関数型プログラミングのサポート)。
-
スレッドクラスのsleep()メソッドとオブジェクトのwait()メソッド
- sleep()メソッドは、スレッドクラス(Thread)の静的メソッドです。このメソッドを呼び出すと、現在のスレッドが指定された時間実行を一時停止し、実行機会(CPU)を他のスレッドに与えますが、オブジェクトロックは残っているため、スリープ時間が終了した後自動的に再開します(スレッドは準備完了状態に戻ります。質問66のスレッド状態遷移図を参照してください)
- wait()はObjectクラスのメソッドです。オブジェクトのwait()メソッドを呼び出すと、現在のスレッドがオブジェクトのロックを破棄し(スレッドが実行を中断)、オブジェクトの待機プール(待機プール)に入ります。オブジェクトのnotify()メソッド(またはnotifyAll)のみが呼び出されます()メソッド)は、待機プール内のスレッドを起動してロックプール(ロックプール)に入ることができます。スレッドがオブジェクトのロックを回復すると、準備完了状態に入ることができます。
- sleep()和yield()
- sleep()メソッドは、他のスレッドに実行の機会を与えるときにスレッドの優先度を考慮しないため、優先度の低いスレッドに実行の機会を与えます。yield()メソッドは、同じまたはより高い優先度のスレッドのみに実行を与えます機会
- スレッドは、sleep()メソッドの実行後にブロック状態になり、yield()メソッドの実行後に準備完了状態になります
- leep()メソッドは、InterruptedExceptionがスローされることを宣言しますが、yield()メソッドは例外を宣言しません
- マルチスレッドの実装
- Threadクラスを継承し、run()メソッドをオーバーライドしてスレッドの動作を定義します(Java 5より前)。
- Runnableインターフェースを実装し、run()メソッドをオーバーライドしてスレッドの動作を定義します(Java 5より前)。
- 呼び出し可能インターフェースを実装し、呼び出しを書き換えます()
- 同期
- オブジェクトまたはメソッドを同期済みとしてマークして、オブジェクトおよびメソッドへの相互排他的なアクセスを実現できます。
- 同期(オブジェクト){…}を使用して、同期コードブロックを定義できます
- メソッドを宣言するときにメソッド修飾子として同期
- 同期および非同期の例
- 同期:データの一部が読み取られているとき、別のスレッドがデータに書き込みを行っています。あるスレッドがデータに書き込み、別のスレッドがデータを読み取っています。これらは同期してブロックする必要があります。
- 非同期:プログラムがメソッドにアクセスするのに長い時間が必要で、メソッドが戻るのをプログラムに待たせたくない場合は、非同期の非ブロッキング操作を使用できます。
- 同期された和java.util.concurrent.locks.Lock
- ロック:Java 5の新しいAPIである同期のすべての機能を完了できます。ロックを取得する必要はありません。手動でロックを解放する必要があります。最後に解放するのが最善です。
- 同期:ロックを自動的に解放します。
- クラスのクラスオブジェクトを取得する方法
- Type.class:String.class
- Object.getClass(): "a" .getClass()
- Class.forName():Class.forName( "java.lang.String")
- リフレクションによってオブジェクトを作成する方法:
- クラスオブジェクトはnewInstance()を呼び出します: "a" .getClass()。NewInstance()
- クラスオブジェクトを介してコンストラクターを取得し、次にnewInstance()を呼び出します。String.class.getConstructor(String.class).newInstance( "a")
- リフレクションによってオブジェクトのメソッドを呼び出す
- メソッドm = "a" .getClass()。getMethod( "toUpperCase");
- m.invoke( "a")//出力A