Java面接の質問の基本

1。「。java」ソースファイルにはいくつのクラスを含めることができますか?制限は何ですか?

  • 複数のクラスを含めることができますが、パブリッククラスは1つだけであり、パブリッククラス名はファイル名と同じである必要があります。通常、ファイルには1つのクラスのみが含まれます。

2. switchステートメントはbyte、long型、およびStringのスコープで機能しますか?

  • switch(e)、ここでeはint型またはenum型である必要があります。short、char、またはbyteは自動的にintに変換されるため、これらの型およびこれらの型のパッケージ化型も可能です。明らかに、long型は不可能であり、Stringはjdk1.7より前ではサポートされておらず、その後はサポートされています。

3.短いs1 = 1; s1 = s1 + 1;何か問題がありますか?短いs1 = 1; s1 + = 1;間違っていますか?

  • 短いs1 = 1; s1 = s1 + 1;の場合、s1 + 1は式の型を自動的にプロモートするため、結果はint型になり、コンパイラは短い型s1に割り当てるときに型変換エラーを報告します。

  • 短い場合s1 = 1; s1 + = 1; + =はJava言語で指定された演算子であるため、Javaコンパイラーは特別な処理を実行し、正しくコンパイルできるようにします。

4. char型変数は何バイトを占めますか?

  • char型変数は、Unicode文字を格納するために使用され、2バイトを占有します。

5. finalキーワードを使用して変数を変更する場合、参照を変更できないのですか、それとも参照されるオブジェクトを変更できないのですか?

  • finalキーワードを使用して変数を変更する場合、変数を変更できないようにガイドすることであり、参照変数が指すオブジェクトの内容は引き続き変更できます。たとえば、次のステートメントの場合:final StringBuffer sb = new StringBuffer( "test");
    sb = new StringBuffer( ""); //エラー
    sb.append( "hello"); //正しい

6.静的変数とインスタンス変数の違いは何ですか?

  • 言語定義の違い:静的キーワードは静的変数の前に追加する必要がありますが、インスタンス変数の前には追加しないでください

  • プログラム実行時の違い:インスタンス変数はオブジェクトの属性に属し、インスタンス変数を使用する前にインスタンス変数にスペースを割り当てる前に、インスタンスオブジェクトを作成する必要があります。静的変数はインスタンスオブジェクトに属していませんが、クラスに属しているため、クラス変数とも呼ばれます。プログラムがクラスのバイトコードをロードする限り、静的変数であるインスタンスオブジェクトを作成する必要はありません。スペースが割り当てられ、静的変数を使用できます。つまり、インスタンス変数は、オブジェクトの作成後にこのオブジェクトを介してのみ使用でき、静的変数はクラス名で直接参照できます。

  • たとえば、次のプログラムの場合、インスタンスオブジェクトがいくつ作成されても、常に1つのstaticVar変数のみが割り当てられ、インスタンスオブジェクトが作成されるたびに、staticVarは1ずつ増加しますが、インスタンスオブジェクトが作成されるたびに作成されると、instanceVarが割り当てられます。つまり、複数のinstanceVarを割り当てることができ、各instanceVarの値は1回だけ増加します。

public class Test { 
 public static int staticVar = 0; 
 public int instanceVar = 0; 
 public void Add(){ 
   staticVar ++; 
   instanceVar ++; 
   System.out.println( "static var =" + staticVar + "instance Var =" + instanceVar); 
 } 
}

7.静的メソッド内から非静的メソッドを呼び出すことは可能ですか?

  • ありえない。非静的メソッドはオブジェクトに関連付けられているため、オブジェクトのメソッドを呼び出す前にオブジェクトを作成する必要がありますが、静的メソッドを呼び出すときにオブジェクトを作成する必要はなく、直接呼び出すことができます。つまり、静的メソッドが呼び出されたときに、インスタンスオブジェクトがまだ作成されていない可能性があります。静的メソッドから非静的メソッドの呼び出しが発行された場合、どのオブジェクトが関連付けられている非静的メソッドですか。このロジックは確立できないため、静的メソッドは内部的に非静的メソッドを呼び出します。

8.整数と整数の違いは?

  • intは、javaが提供する8つのプリミティブデータ型の1つです。Javaは各プリミティブ型のラッパークラスを提供し、IntegerはJavaがint用に提供するラッパークラスです。intのデフォルト値は0で、Integerのデフォルト値はnullです。つまり、Integerは未割り当てと0の違いを区別できますが、intは未割り当ての状況を表すことができません。

9.インターフェイスはインターフェイスを継承できますか?抽象クラスはインターフェイスを実装できますか?抽象クラスは具象クラスを継承できますか?抽象クラスは静的メインメソッドを持つことができますか?

  • インターフェイスはインターフェイスを継承できます。抽象クラスはインターフェースを実装でき、抽象クラスは具象クラスを継承できます。抽象クラスには静的なmainメソッドが存在する可能性があります。

10. Javaでポリモーフィズムを実現するためのメカニズムは何ですか?

  • 親クラスまたはインターフェースによって定義された参照変数がサブクラスまたは具象実装クラスのインスタンスオブジェクトを指すことができ、プログラムによって呼び出されたメソッドが実行時に動的にバインドされるかどうかによって異なります。これは具象インスタンスのメソッドです。参照変数が指すオブジェクト、つまり、参照変数のタイプで定義されたメソッドではなく、メモリ内で実行されているオブジェクトのメソッド。

11.抽象クラスとインターフェイスの違いは何ですか?

  • 抽象クラスはコンストラクターを持つことができますが、インターフェースはコンストラクターを持つことができません。

  • 抽象クラスには通常のメンバー変数が存在する可能性がありますが、インターフェイスには通常のメンバー変数はありません

  • 抽象クラスには非抽象通常メソッドを含めることができ、インターフェイス内のすべてのメソッドは抽象である必要があり、非抽象通常メソッドは存在できません。

  • 抽象クラスの抽象メソッドのアクセス型は、public、protected、およびdefault型ですが、インターフェイスのabstractメソッドは、public型のみであり、デフォルトはpublic abstracttypeです。

  • 静的メソッドは抽象クラスに含めることができ、静的メソッドはインターフェイスに含めることはできません

  • 抽象クラスとインターフェイスの両方に静的メンバー変数を含めることができます。抽象クラスの静的メンバー変数のアクセスタイプは任意ですが、インターフェイスで定義される変数はpublicstatic finalタイプのみであり、デフォルトはpublicstaticfinalタイプです。

  • クラスは複数のインターフェイスを実装できますが、継承できる抽象クラスは1つだけです。

12.内部クラスは、それを含むクラスのメンバーを参照できますか?制限はありますか?

  • 絶対に大丈夫です。静的内部クラスでない場合、制限はありません。

  • 静的にネストされたクラスを内部クラスの特殊なケースとして扱う場合、この場合、外部クラスの通常のメンバー変数にはアクセスできませんが、外部クラスの静的メンバーにのみアクセスできます。たとえば、次のコードは次のとおりです。

クラスOuter {  static int x;  静的クラスInner {    void test()    {      System.out.println(x);    }  } }







 

13.String s = new String( "xyz");作成されたStringObjectの数は?Stringクラスを継承することは可能ですか?

  • 2つまたは1つの定数オブジェクトとしての「xyz」。このオブジェクトは文字列定数バッファに配置されます。定数「xyz」が何度表示されても、定数バッファには1つしかありません。new String( "xyz")の場合、オブジェクトが定数バッファーに存在しない場合は、最初に定数バッファーに新しいオブジェクトを作成してから、定数バッファーオブジェクトの内容を使用して新しいStringオブジェクトを作成する必要があります。したがって、2つのオブジェクトが作成されます。オブジェクト( "xyz")が定数バッファーに存在する場合、1つのオブジェクトのみが作成されます。

  • Stringのデフォルトの最終変更は継承できないため、Stringクラスは継承できません。

14.次のステートメントで作成されるオブジェクトの数:String s = "a" + "b" + "c" + "d";

  • 次のコードの場合:

文字列s1 = "a"; 
文字列s2 = s1 + "b"; 
文字列s3 = "a" + "b"; 
System.out.println(s2 == "ab"); 
System.out.println(s3 == "ab");
  • 最初のステートメントの印刷結果はfalseです。2番目のステートメントの印刷結果はtrueです。これは、コンパイラが文字列定数に直接追加される式を最適化できることを示しています。追加操作を実行するためにランタイムまで待つ必要はありません。代わりに、コンパイル時にプラス記号を削除して、これらの定数の1つに直接コンパイルします。結果として。

  • タイトルのコードの最初の行がコンパイル時にコンパイラーによって最適化された後、それは「abcd」文字列を直接定義することと同等であるため、上記のコードはStringオブジェクトのみを作成する必要があります。次のコードを見てください。

文字列s = "a" + "b" + "c" + "d" 
System.out.println(s == "abcd"); // true

15. try {}にreturnステートメントがあり、tryが実行された直後のfinally {}のコードは、returnの前または後に、いつ実行されますか?

  • final {}のステートメントは確実に実行されることがわかっているので、これは返品前ですか、それとも返品後ですか。次のコードを見てください。

public class Test { 
 public static void main(String [] args){ 
   System.out.println(new Test()。test()); 
 } 

 int test(){ 
   int x = 1; 
   try { 
     return x; 
   }最後に{ 
     ++ x; 
   } 
 } 
}
  • 操作の結果は1であり、returnステートメントが実行されてからfinallyステートメントが実行されたことを示しますが、直接返されるのではなく、return結果を保存して、finallyステートメントで実行します。

16.ファイナル、ファイナル、ファイナライズの違いは?

  • Finalは、プロパティ、メソッド、およびクラスをそれぞれ宣言するために使用されます。これは、プロパティが不変であり、メソッドをオーバーライドできず、クラスを継承できないことを示します。内部クラスのローカル変数にアクセスするには、ローカル変数を最終型として定義する必要があります。

  • 最後に、これは例外処理ステートメントの構造の一部です。つまり、常に実行されます。

  • FinalizeはObjectクラスのメソッドです。リサイクルされたオブジェクトのこのメソッドは、ガベージコレクターの実行時に呼び出されます。このメソッドをオーバーライドして、ファイルを閉じるなど、ガベージコレクション中に他のリソースを回復できます。ただし、JVMは、このメソッドが常に呼び出されることを保証するものではありません。

17.実行時例外と一般例外の類似点と相違点は何ですか?

  • 異常とは、プログラムの実行中に発生する可能性のある異常状態を示し、実行時異常とは、仮想マシンの正常な動作で発生する可能性のある異常を示し、一般的な動作エラーです。Javaコンパイラでは、メソッドが発生する可能性のある非ランタイム例外をスローすることを宣言する必要がありますが、キャッチされないランタイム例外をスローすることを宣言する必要はありません。

18.エラーと例外の間にアプリケーションの違いはありますか?

  • エラーは、回復が不可能ではないが困難な場合に深刻な問題を表します。たとえば、メモリオーバーフロー。プログラムがそのような状況を処理することを期待することは不可能です。例外は、設計または実装の問題を表します。つまり、プログラムが正常に実行された場合には決して起こらない状況を表しています。

19. Javaのヒープとスタックの違いは何ですか?

  • JVMのヒープとスタックは異なるメモリ領域に属し、異なる目的で使用されます。スタックは、メソッドフレームとローカル変数を保存するためによく使用され、オブジェクトは常にヒープに割り当てられます。スタックは通常、ヒープよりも小さく、複数のスレッド間で共有されることはありませんが、ヒープはJVM全体のすべてのスレッドによって共有されます。

  • スタック:関数で定義されたいくつかの基本的なタイプの変数とオブジェクトの参照変数は、関数のスタックメモリに割り当てられます。変数がコードブロックで定義されている場合、Javaはスタック内のこの変数にメモリスペースを割り当てます。スコープを超えた後変数のうち、Javaは変数に割り当てられたメモリ空間を自動的に解放し、メモリ空間は他の目的にすぐに使用できます。

  • ヒープ:ヒープメモリは、newによって作成されたオブジェクトと配列を格納するために使用されます。ヒープに割り当てられたメモリは、Java仮想マシンの自動ガベージコレクタによって管理されます。配列またはオブジェクトがヒープ内に生成された後、スタック内のこの変数の値がヒープメモリ内の配列またはオブジェクトの最初のアドレスと等しくなるように、スタック内に特別な変数を定義することもできます。スタック内は次のようになります。配列またはオブジェクトの参照変数の後、スタック内の参照変数をプログラムで使用して、ヒープ内の配列またはオブジェクトにアクセスできます。参照変数は、配列またはオブジェクトの名前に相当します。

おすすめ

転載: blog.csdn.net/qq_30398499/article/details/102154421