オブジェクト指向の特徴とは何ですか?
いわゆるカプセル化とは、客観的なものをカプセル化することです。抽象オブジェクト クラスと呼ばれ、そのクラスでは、信頼できるクラスまたはオブジェクトのみが独自のデータとメソッドを操作できるようにし、信頼できないクラスまたはオブジェクトからは情報を隠すことができます。カプセル化はオブジェクト指向の特徴の 1 つであり、オブジェクトとクラスの概念の主な特徴です。 (推奨される学習: Java の一般的な面接の質問 )
継承とは、サブクラスが親クラスの属性とメソッドを取得することを意味します。たとえば、犬が動物の一種である場合、その動物の特性を受け継いでいる、または犬はその動物のサブクラスであるとも言えます。
ポリモーフィズムとは、メソッドの名前は 1 つだけですが、多くの形式を持つことができることを意味します。つまり、プログラム内で同じ名前の複数のメソッドを定義できます。これは、「1 つのインターフェイス、複数のメソッド」と表現されます。 "。メソッド パラメーターと型参照を渡すことができます。
5 つの原則: 単一責任の原則 SRP オープンおよびクローズの原則 OCP 置換の原則 LSP 依存関係の原則 DIP インターフェイス分離の原則 ISP
メンバー変数とローカル変数 違い
#* A: クラス内の位置の違い# * メンバー変数: クラス内のメソッドの外
* ローカル変数: メソッド定義またはメソッド宣言内
* B: メモリ内の別の場所* メンバー変数: ヒープ メモリ内 (メンバー変数)オブジェクトに属し、オブジェクトはヒープ メモリに置かれます)
* ローカル変数: スタック メモリ内 (ローカル変数はメソッドに属し、メソッドはスタック メモリにプッシュされます)
* C: 異なるライフサイクル* メンバー変数: オブジェクトの作成時に存在し、オブジェクトの消滅時に消滅します
# * ローカル変数: メソッドの呼び出し時に存在し、メソッドの呼び出し時に消滅します##* D: 異なる初期化値
* メンバー変数: デフォルトの初期化値があります * ローカル変数: デフォルトの初期化値はありません。定義する必要があります。割り当てられ、使用できるようになります。
#静的変数とメンバー変数の違い
* 静的変数はクラス変数とも呼ばれ、メンバー変数はオブジェクト変数とも呼ばれます# #* A: 所有権の違い
* 静的変数はクラスに属するため、クラス変数とも呼ばれます
* メンバー変数はオブジェクトに属するため、インスタンス変数とも呼ばれます (オブジェクト変数)
* B: メモリ内の別の場所* 静的変数はメソッド領域の静的領域に格納されます
*メンバ変数はヒープメモリに格納されます
* C:メモリ出現時間が異なります※静的変数はクラスロードと同時にロードされ、クラス終了とともに消滅します消える
* メンバー変数はオブジェクトの後に続きます。オブジェクトの作成時に存在し、オブジェクトが消えると消えます。
* D: 異なる呼び出し* 静的変数はクラス名またはオブジェクトを通じて呼び出すことができます
* メンバー変数はオブジェクト名を通じてのみ呼び出すことができます
これとスーパー # の違いと応用## A: this と super は何の略ですか
* this: 現在のオブジェクトの参照を表します。誰が私に電話をかけても、私はその人の代理になります
* super: 現在のオブジェクトの親クラスの参照を表します* B: this と super の使用の違い
* a: 呼び出し元のメンバー変数 * this. メンバ変数はこのクラスまたは親クラスのメンバ変数を呼び出します メンバ変数* super. メンバ変数は親クラスのメンバ変数を呼び出します
* b: コンストラクタ メソッドを呼び出します * this(...) はこのクラスのコンストラクタ メソッドを呼び出します * super(...) は親クラス ## のコンストラクタ メソッドを呼び出します# * c: メンバ メソッドを呼び出します
* this. メンバ メソッドはこのクラスのメンバ メソッドを呼び出しますが、親クラスのメソッドを呼び出すこともできます
*super.メンバーメソッドは親クラスのメンバーメソッドを呼び出します
ソートの方法は何ですか?ソート方法を列挙してください: 挿入ソート (直接挿入ソート、ヒル ソート)、交換ソート (バブル ソート、クイック ソート)、選択ソート (直接選択ソート、ヒープ ソート)、マージ ソート、分布ソート(ボックスソート、基数ソート)
クイックソートの疑似コード。
String、StringBuffer、StringBuilder の違い。
String の長さは不変です;
StringBuffer の長さは可変です。文字列内のコンテンツを頻繁に操作する場合、特にコンテンツが変更されている場合, StringBuffer を使用します。最終的に String が必要な場合は、StringBuffer の toString() メソッドを使用します。スレッド セーフ。StringBuilder は JDK 5 から開始され、単一スレッドで使用するための同等のメソッドを StringBuffer クラスに追加します。 StringBuilder クラスはすべて同じ操作をサポートしますが、同期を実行しないため高速であるため、通常は StringBuilder クラスを優先して使用する必要があります。
オーバーロードとオーバーライドの違い。オーバーロードされたメソッドは戻り値の型を変更できますか?
回答: メソッドのオーバーライド オーバーライドとオーバーロード オーバーロードは、Java 多態性の異なる表現です。
オーバーライドは親クラスとサブクラス間の多態性の現れであり、オーバーロードはクラス内の多態性の現れです。サブクラスで定義されたメソッドがその親クラスと同じ名前とパラメータを持つ場合、そのメソッドはオーバーライドされていると言います。
サブクラスのオブジェクトがこのメソッドを使用すると、サブクラスの定義が呼び出されるため、親クラスの定義が「シールド」されているようです。クラス内に同じ名前の複数のメソッドが定義されており、それらのメソッドのパラメーターの数または型が異なる場合、それをメソッドのオーバーロードと呼びます。オーバーロードされたメソッドは戻り値の型を変更できます。
final とfinally の違いは何ですか?
答え: Final: 修飾子 (キーワード); クラスが Final と宣言されている場合、それはそれを意味します。派生した新しいサブクラスは親クラスとして継承できないため、クラスをabstractとfinalの両方で宣言することはできません。変数またはメソッドをfinalとして宣言すると、使用中に変更されないことが保証されます。finalとして宣言された変数には、次の場合に初期値を与える必要があります。宣言されており、後続の参照でのみ読み取ることができ、変更することはできません。また、final として宣言されたメソッドは使用のみが可能で、オーバーロードすることはできません。
finally: 例外処理中にクリーンアップ操作を実行するためのfinally ブロックを提供します。例外がスローされた場合、一致する catch 句が実行され、その後、制御がfinally ブロック (存在する場合) に入ります。
いくつかの一般的な動作異常。
java.lang.nullpointerException (null ポインタ例外)
java.lang.classnotfoundException (指定されたクラスが存在しません)
java.lang.arithmeticException (数学的演算例外)
java.lang.arrayindexoutofboundsException (配列添字の境界外例外)
IOException (入力および出力例外)
配列演算に関する 2 つの一般的な問題は範囲外で空のポインタです。
* A:Case のデモンストレーション
* a:ArrayIndexOutOfBoundsException: 配列インデックスが範囲外の例外です。
* 理由: 非-存在するインデックス。
* b: NullPointerException: Null ポインター例外
* 理由: 配列はヒープ メモリを指していません。また、要素にアクセスするために配列名も使用します。
* int[] arr = {1,2,3}; * arr = null; * System.out.println(arr[0]);
JAVA 言語は例外をどのように処理しますか?キーワード throws、throw、try、catch、finally は何を意味しますか? try ブロックで例外をスローできますか?
回答: Java はオブジェクト指向メソッドを通じて例外を処理し、さまざまな例外を分類し、優れたインターフェイスを提供します。
Java では、各例外はオブジェクトであり、Throwable クラスまたは他のサブクラスのインスタンスです。メソッド内で例外が発生すると、例外オブジェクトがスローされます。このオブジェクトには例外情報が含まれており、このオブジェクトを呼び出すメソッドは例外をキャッチして処理できます。
Java の例外処理は、try、catch、throw、throws、finally の 5 つのキーワードによって実装されます。一般に、try はプログラムの実行に使用されます。例外が発生すると、システムは例外をスローします。このとき、そのタイプによって例外をキャッチすることも、最終的にはデフォルトのハンドラによってキャッチすることもできます。
すべての「例外」を防ぐプログラムを指定するには、try を使用します。 try プログラムの直後に、キャッチする「例外」の種類を指定するための catch 句を含める必要があります。
throw ステートメントは、明示的に「例外」をスローするために使用されます。
throws は、メンバー関数がスローする可能性のあるさまざまな「例外」を示すために使用されます。
最終的には、どのような「例外」が発生しても、コードの一部が確実に実行されるようにします。
メンバー関数呼び出しの外側に try ステートメントを記述し、メンバー関数内に別の try ステートメントを記述して他のコードを保護することができます。 try ステートメントが検出されると、すべての try ステートメントが完了するまで「例外」フレームがスタックに置かれます。
次のレベルの try ステートメントが特定の「例外」を処理しない場合、スタックは、この「例外」を処理する try ステートメントが見つかるまで拡張されます。
サーバーは、ユーザーが送信したフォーム データを受信するときに、サーブレットの doGet() メソッドまたは doPost() メソッドを呼び出しますか?
回答: HTML の ff9c23ada1bcecdd1a0fb5d5a0f18437 要素には、フォームの送信方法を指定するために使用されるメソッド属性があり、その値は get または post です。
カスタム サーブレットは通常、doGet() メソッドまたは doPost() メソッドの一方または両方をオーバーライドします。GET リクエストの場合は doGet() メソッドを呼び出します。POST リクエストの場合は、doGet() メソッドを呼び出します。 doPost.() メソッドを呼び出しますが、なぜこれが起こるのでしょうか?
カスタム サーブレットは通常、HttpServlet から継承し、HttpServlet は GenericServlet から継承し、サーブレット インターフェイスで定義されている service() メソッドをオーバーライドします。
HttpServlet によって書き換えられた service() メソッドは、まずユーザーが要求したメソッドを取得し、要求メソッドに応じて doGet()、doPost()、doPut()、doDelete() などのメソッドを呼び出します。サーブレットをカスタマイズしている場合 これらのメソッドが でオーバーライドされている場合、上書きされた (カスタマイズされた) メソッドが呼び出されることは明らかであり、これは明らかにテンプレート メソッド パターンの適用です (理解できない場合は、 「Java とパターン」という本)。
もちろん、service() メソッドはカスタム サーブレットで直接書き換えることもできるため、リクエストの種類に関係なく、独自のコードを通じて処理できます。これは、リクエスト メソッドが次のようなシナリオに適しています。区別されていません。
抽象クラスとインターフェイスの違いは何ですか?
Interface は抽象クラスのバリアントであり、インターフェイス内のすべてのメソッドは抽象です。抽象クラスは、メソッドを実装せずにメソッドの存在を宣言するクラスです。
インターフェイスは多重継承を持つことができますが、抽象クラスは多重継承できません。
インターフェイスはメソッドを定義しますが、それらを実装することはできませんが、抽象クラスはいくつかのメソッドを実装できます。
インターフェイスの基本データ型は静的ですが、抽象イメージは静的ではありません。
メモリ リークとメモリ オーバーフロー?
メモリ リーク: アプリケーションがメモリを申請した後、申請したメモリ空間を解放できないことを意味します。メモリ リークの害は無視できますが、メモリ リークの発生が許可された場合は、メモリオーバーフローが発生します。
例: ファイルを読み取った後、時間内にストリームを閉じ、データベース接続を解放する必要があります。
メモリ オーバーフロー: アプリケーションがメモリを申請したときに、使用できる最終的なメモリ領域がないことを意味します。
例: セグメント化されたバッチ送信を使用して、プロジェクトに大量のデータをインポートします。
スレッド同期とは何ですか?
1. スレッド同期の目的は、複数のスレッドがリソースをクエリするときにリソースが損傷するのを防ぐことです。
2. スレッド同期メソッドはロックを通じて実装されます。各オブジェクトにはロックが 1 つだけあります。このロックは特定のオブジェクトに関連付けられます。スレッドがオブジェクト ロックを取得すると、他のスレッドはそのオブジェクトにアクセスできなくなります。オブジェクトの他の非同期メソッドにアクセスします。
3. 静的同期メソッドの場合、ロックはこのクラス用であり、ロック オブジェクトはこのクラスの Class オブジェクトです。静的メソッドと非静的メソッドのロックは相互に干渉しません。スレッドがロックを取得し、同期メソッド内の別のオブジェクトの同期メソッドにアクセスすると、2 つのオブジェクト ロックを取得します。
4. 同期の場合、どのオブジェクトを同期するかを常に意識することが重要です。
5. スレッドセーフなクラスを作成するときは、リソースにアクセスするために競合する複数のスレッドのロジックと安全性を正しく判断し、「アトミック」操作を分析し、実行中に他の操作が確実に行われるようにすることに常に注意を払う必要があります。アトミック操作は次のとおりです。スレッドは競合するリソースにアクセスできません。
6. 複数のスレッドがオブジェクトのロックを待機している場合、ロックを取得していないスレッドはブロックされます。
7. デッドロックは、スレッドが互いにロックするのを待っているために発生しますが、実際に発生する可能性は非常に低いです。本当にデッドロックプログラムを書いてもらったら、うまくいかないかもしれません(笑)。ただし、プログラム内でデッドロックが発生すると、プログラムは停止します。
マルチスレッドについて理解していますか?
同じことを別の人が行うのがマルチスレッドです。
食堂で料理をするときは 1 人がシングルスレッド、N 個のウィンドウを開いて N 人が同時に食事をするのはマルチスレッド
スレッドの基本概念、基本ステータス関係:
スレッドとは、プログラムの実行中にプログラム コードを実行できる実行単位を指します。各プログラムには、プログラム自体であるスレッドが少なくとも 1 つあります。 Java のスレッドには、実行中、準備完了、一時停止、終了の 4 つの状態があります。
どんなコレクションがありますか?
リスト機能: 要素は順序付けられ、要素は繰り返し可能
マップ機能: 要素はキーと値のペアで保存され、順序付けはありません
Set特徴: 要素 配置順序はなく、要素を繰り返すことはできません (注: 要素に配置順序はありませんが、セット内の要素の位置は要素の HashCode によって決定され、その位置は実際には固定されています)
List インターフェイスには 3 つの実装クラスがあります: LinkedList、ArrayList、Vector
LinkedList: 最下層はリンク リストに基づいて実装されます。リンク リストのメモリは分散されています。各要素は独自のデータを格納します。メモリアドレスを格納し、次の要素のアドレスも格納します。リンクされたリストは追加と削除は高速ですが、検索は低速です。
ArrayList と Vector の違い: ArrayList は非スレッド セーフで効率が高く、Vector はスレッド セーフに基づいているため効率が低くなります。
Set インターフェイスには 2 つの実装クラスがあります: HashSet (最下層は HashMap によって実装されます)、LinkedHashSet
SortedSet インターフェイスには実装クラスがあります: TreeSet (最下層はバランス バイナリ ツリーによって実装されます) )
Query インターフェースには実装クラスがあります: LinkList
Map インターフェースには 3 つの実装クラスがあります: HashMap、HashTable、LinkeHashMap
HashMap はスレッドセーフではなく、効率的ではありません。 null をサポートします; HashTable はスレッドセーフで非効率であり、null をサポートしません
SortedMap には実装クラスがあります: TreeMap
実際、最も重要なことは、リストが処理に使用されることです。 set はセットの処理に使用されます。 Map は、キーと値のペアを格納する基本クラスです。
ファイルの読み取りと書き込み:
File Reader クラスと FileWriter クラスは、それぞれ Reader クラスと Writer クラスを継承します。 FileReader クラスはファイルの読み取りに使用され、File Writer クラスはファイルへのデータの書き込みに使用されます。これら 2 つの型を使用する前に、それらの構築メソッドを呼び出して対応するオブジェクトを作成し、対応する read() または write を呼び出す必要があります。 () 方法。
以上がJava 面接でよくある質問をまとめたものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。