Top 100 Java Interview Questions with Answers

https://www.guru99.com/java-tutorial.html

Guru99.comなるJavaのチュートリアルが載っているサイトがある。
それのTop 100 Java Interview Questions with Answersセクションをまとめてみた。


# Top 100 Java Interview Questions with Answers
### 1. Inner ClassとSub Classの違い
内部クラスは、クラス内にネストされたクラス
サブクラスは、スーパークラスを継承しているクラス

### 2. Javaクラスのアクセス指定子は何ですか？
Public：どこからでもアクセス可能
Protected：同じクラス、サブクラス、同じパッケージから参照可能
デフォルト：同じパッケージからのみアクセス可能
Private：同じクラスからのみ

### 3. Static methods と static variablesの目的は何？
Staticなフィールドはプログラム全体で1つしかないことが保証される
インスタンスを生成しなくても使える、クラスに紐付いている、クラスで1つの変数
全てのオブジェクトで共有されるメソッドまたは変数を作成する

### 4. データのカプセル化とは何ですか？
カプセル化は、プロパティとメソッドを1つのユニットに結合するための概念。データを隠す目的にも役立つ

### 5. シングルトンクラスとは？
シングルトンクラスは、1つのインスタンスしか持つことができないデザインパターン
例）いくつかのドライバー制限・ライセンス問題のために、データベースへの接続が1つだけになる制限がある場合

###  6. Javaのループとは何ですか？
For
While
Do While

### 7. 無限ループとは？
無限ループは条件無しで実行され、無限に実行される
```
for (;;){
}
```

### 8. continueステートメントとbreakステートメントの違いは？
break: ループを即座中断
continue: 現在のループを中断、次のループへ

### 9. Doubleとfloatの違い
Double は8バイト
Floatは4バイト
Javaの数値リテラルで小数を表す場合、デフォルトでdouble型になる。floatとして解釈させたい場合は末尾に`f`が必要

### 10. Javaのfinalキーワードとは？
Finalを使用することで定数が宣言できる。
値は1回しか割り当てることができず、割当後に定数の値を変更することはできない。
クラスがfinalとして宣言されている場合、サブクラス化することができない。

### 11.  三項演算子とは何ですか？
Boolen値の評価に基づいて、変数に割り当てる値を決めることができるなど
```
status = (rank == 1) ? “Done” : “Pending”;
```

### 12. Javaで乱数を生成するにはどうすれば良いですか？
* Math.random() を使用すると 0.1 ~ 1.0未満の乱数を生成できる
* Randomクラスを利用する

### 13. Default switch caseとは？
Switch文の条件が一致しない場合にdefaultケースが実行されます。

### 14. 全てのクラスの派生元であるJavaの基本クラスは何ですか？
java.lang.object

### 15. Javaのmain()は任意データを返すことができますか＞
できません。
常にvoid型戻り値で宣言されます。

### 16. Javaのパッケージとは何ですか？
パッケージを利用すると、コードをモジュール化でき、適切に再利用することができる。パッケージ化されたコードは、他のクラスにインポートして使用できる

### 17. 抽象メソッドを持たずに抽象クラスとして宣言できますか？
できます。
抽象メソッドがなくても、クラス名の前に`abstract`キーワードを使用して抽象クラスを作成できます。
ただし、クラスに抽象メソッドが1つでもある場合、抽象クラスとして宣言する必要がある。

### 18.  抽象クラスとインターフェースの違いは何ですか？
インターフェースは実装のないpublic staticメソッドの宣言のみを持つ
抽象クラスは具体的な実装の有無に関係なく、アクセス指定子を持つメンバーを持つことができる

インターフェースを実装するクラスは、インターフェースの全てのメソッドを実装する必要がある
複数のインターフェースを実装できるが、1つの抽象クラスしか持つことができない

### 19. 抽象クラスとインターフェースのパフォーマンスについて
インターフェースには追加のインダイレクションが必要なため、抽象クラスの方が速い
また、インターフェースは全てのメソッドを実装する必要がある

### 20. パッケージをインポートすると、サブパッケージもインポートされますか？
必要に応じて、個別にインポートする必要がある。

### 21. クラスのmainメソッドをprivateとして宣言できますか？
できません。
public staticである必要が有ります。
privateで実行すると、コンパイルエラーは発生しないが、ランタイムエラーが発生する。

### 22. 値渡しではなく、参照渡しで関数に引数を渡すにはどうすれば良いですか？
Javaでは、参照ではなく値によってのみ引数を関数に渡しことができます。

### 23. オブジェクトはどのようにシリアル化(連続化)されますか？
シリアライズ：Javaのインスタンスをバイト列として出力すること。
Serializableインターフェースを実装するクラスのオブジェクトは全て、シリアル化され、その状態はバイトストリームに保存される。

### 24. シリアル化が必要とされる場合はどんな時ですか？
データをネットワーク経由で送信する必要がある場合、シリアル化が使用される。

### 25. Tryブロック後に例外処理のためにCatchブロックが続くことは必須ですか？
Tryブロックのあとには、Catch、finallyブロックが続く必要がある。
Tryブロックからスローされた例外は、catchブロックでキャッチするか、コードの中止がfinallyブロックに配置される前に実行する特定のタスクのいずれかである必要がある。

### 26. 例外ブロックで何らかの例外が発生した場合でも、finallyブロックをスキップする方法はありますか？
例外が発生するとfinallyブロックが常に実行されるます。
唯一の保言う方は、tryブロックの最後に次のコードを書き込むことで、コードを強制的に中止すること
```
System.exit(0);
```

### 27. クラスのコンストラクターが呼び出される時は？
コンストラクターは新しいキーワードでオブジェクトが作成されるたびに呼ばれる。

### 28. クラスに複数のコンストラクターを含めることはできますか？
できる。
異なるパラメーターを持つ複数のコンストラクターを持つことができる。
使用されるコンストラクターはオブジェクト作成中に渡される引数によって異なる。

### 29. staticメソッドはオーバーライドできますか？
できません。
Staticメソッドは個々のオブジェクトではなく、クラスに属し、コンパイル時に解決されます。

### 30. 出力はどうなりますか？
```
Displaying from subClass
Printing from superclass
```

### 31.  String はJavaのデータ型ですか？
Stringは、Java.Lang.Stringクラスのオブジェクトです。
つまり、Stringクラスの全ての組み込みメソッドをStringオブジェクトで使用することができる。

### 32. いくつのStringオブジェクトが作成されますか？
2つ
同じ文字列を参照する場合は、同じオブジェクトへの参照となる。

### 33. Javaの文字列が不変として呼び出される理由
Javaでは、値が文字列に割り当てられると、文字列オブジェクトは不変として呼ばれ、変更できず、変更された場合は、新しいオブジェクトがさくせされる。

### 34. 配列とベクター(Vector)の違い
配列は、同じプリミティブ型のデータをグループ化し、本質的に静的
ベクトルは本質的に動的であり、異なるデータ型のデータを保持できる

### 35. マルチスレッドとは何ですか？
マルチスレッドは、1つのプログラム内で複数のタスクを実行するプログラミング概念
スレッドは同じプロセススタックを共有して、並行して実行される。

### 36. Runnable インターフェースがJavaで使用される理由
Runnableインターフェースはマルチスレッドを利用するため

### 37. Javaでマルチスレッドを実装する2つの方法は何ですか？
* Java.Lang.Runnableインターフェースを使用する。
* Java.Lang.Threadクラスを継承する

### 38. データに多くの変更が必要な場合、どの設定を使用する必要がありますか？
StringBuffersは本質的に動的であり、不変Stringとは異なり、StringBufferオブジェクトの値を変更できるため、データの変更が多い場合には常にStringBufferを使用することが推奨される
Stringだと、毎回オブジェクトが作成され、余計なオーバーヘッドが発生する

### 39. SwitchステートメントでBreakを使用する目的は何ですか？
有効なケース後にbreakし、他のケースが実行されないようにするため

### 40. JavaでのGCはどのように行われるか
Javaは、オブジェクトが参照されなくなるとGCが行われ、オブジェクトが行われ、オブジェクトは自動的に破棄される。

### 41. mainメソッドの前でもどのようにコードを実行できますか？

### 42. クラスを同時にスーパークラスとサブクラスにすることはできますか？
できる

### 43. クラスでコンストラクターが定義されていない場合、クラスのオブジェクトはどのように作成されますか？
定義されない場合も、デフォルトのコンストラクターが暗黙的に使用されるため、オブジェクトは正常に作成される。

### 44. マルチスレッドで、リソースが複数のスレッドに同時に使用されないようにするためにはどうすれば良いですか？
Synchronizedキーワードを使用することで、1つのスレッドのみが共有リソースが使用でき、他のスレッドがリソースを使用している他のスレッドから開放された場合にのみ他のスレッドがリソースの制御を取得できる

### 45. オブジェクトのクラスのコンストラクターを複数回呼び出すことはできますか？
新しいキーワードを使用して、オブジェクトを作成するとコンストラクターが自動的に呼び出されます。作成後に再度呼び出すことはできません。

### 46. ClassAとClassBという2つのクラスがある。ClassBからClassAのプライベートメンバーにアクセスできますか？
アクセスできない。

### 47. 同じ名前のメソッドをクラスに含めることはできますか？
定義できる。パラメーター数・型が異なれば定義可能

### 48. Javaオブジェクトのコピーを作成するにはどうすれば良いですか？
Clone()はCloneableインターフェースのメソッドであるため、オブジェクトのコピーを作成するには、Cloneableインターフェースを実装する必要がある。

### 49. 継承を使用する利点は何ですか？
継承を使用すると、サブクラスがスーパークラスのコードを再利用することができる。
ポリモーフィズムは既存お派生クラスに影響を与えずに新しい機能を導入できる大きな利点

### 50. クラスの変数とメソッドのデフォルトのアクセス指定子は何ですか？
変数とメソッドのデフォルトのアクセス指定子はパッケージで保護されている。つまり、変数とクラスは、パッケージ外ではなく、同じパッケージ内の他のクラスで使用できる。

### 51. Javaクラスでポインターの使用はできますか？
できません。
Javaにはポインターの概念がない

### 52. クラスを継承できないように、制限するにはどうしたらよい？
Finalキーワードを使う。
```
Public Final Class Stone {
}
```

### 53.  Protectedアクセス指定子のスコープは？

Public: Class, Package, Subclass, World
Protected: Class, Package, Subclass
No modifier: Class, Package
Private: Class

### 54. スタックとキューの違いは？
スタック、キューともにデータのコレクションのプレースホルダーである。
スタック：LIFO
キュー:FIFO

### 55. Javaでは、変数のシリアル化をどのように禁止できますか？
Transientキーワードを使用する

### 56. プリミティブデータ型をオブジェクトとして使用するにはどうすればよいですか？
ラッパークラスを使用してオブジェクトとして処理できる。
Integerはプリミティブデータ型intのラッパークラスです。

### 57. コンパイル時にどのタイプの例外がキャッチされますか？
チャックされた例外は、プログラムのコンパイル時にキャッチできます。
コードを正常にコンパイルするには、コードでtry catchブロックを使用して、チャックされた例外を処理する必要が有ります。

### 58. スレッドの様々な状態を説明してください
* Ready: スレッドが作成されると、準備完了状態になります。
* Running: 現在実行中のスレッドは実行状態です。
* Waiting: 特定のリソースを解放するために別のスレッドを待機している
* Dead: 実行後にデッド状態になったスレッド

### 59. 明示的なコンストラクターが定義されている場合でも、クラスのデフォルトコンストラクターを使用できますか？
明示的なコンストラクターが定義されている場合は、定義されているコンストラクターのみを使用できる。

### 60. 同じメソッド名と引数を使用し、異なる戻り値の型を使用していメソッドをオーバーライドできますか？
オーバーライドは、メソッド名、引数、戻り値の型が全く同じでなければオーバーライドにならない。

### 61. 次のコードの出力はどうなりますか？
4

### 62. staticメソッドないから non-staticメソッドを呼び出すことはできますか？
Non-staticメソッドはクラスのオブジェクトによって所有され、オブジェクトレベルのスコープを持つ。
呼び出すためには、クラスのオブジェクトを作成し、オブジェクト参照を使用してこれらのメソッドを呼び出す。

### 63. Javaプログラムを実行するために設定する必要がある2つの環境変数
Path変数
CLASSPATH変数

### 64. Javaで変数を初期化せずに使用できますか？
Javaでは、有効な値による事前の初期化を行わないと、コンパイルエラーとなる。

### 65. クラスを複数のクラスから継承できますか？
Javaでは、複数のクラスからの継承である多重継承はサポートされておらず、1つのクラスからの継承である単一継承のみ。

### 66. コンストラクターはクラス名と異なる名前を持つことができますか？
名前が違う場合は、コンストラクターとして機能せず、通常のメソッドとなる。

### 67. Round(3.7)、Ceil(3.7)の出力はどうなりますか？
4
4
Round: 四捨五入
Ceil: 切り上げ
Floor: 切り捨て

### 68. Javaでgotoを使用して特定の行に移動できますか？
Javaにgoto機能のサポートはない。

### 69. デッドスレッドを再び開始できますか？
Javaでは、デッド状態のスレッドを再び再開することはできない。

### 70. 次のクラス宣言は正しいですか？
```
Public abstract final class testClass {
}
```
抽象クラスはFinalとして宣言できないため、正しくない。

### 71. Javaプログラムを実行するには、各マシンでJDKが必要ですか？
JDKはJavaの開発きっとであり、開発にのみ必要である
Javaプログラムを実行するには、JREのみで十分。

### 72. equalsメソッドと==演算子の違いは？
Equalsメソッドは、オブジェクトの内容を比較
==演算子は、オブジェクトの参照を比較している。

```
String str1 = new String(“Hello World”)
String str2 = new String(“Hello World”)
```
Str1とstr2を比較すると
Eqalsメソッドではtrue
==演算子ではfalse
となる。

### 73. Javaにおいて、C言語のコードで実装を提供することはできますか？
はい。
[JavaからCの処理を呼ぶ方法(JNI/JNA/SWIG) - Qiita](https://qiita.com/kiida/items/9d26b850194fa1a02e67)
できそう。

### 74. Javaでデストラクタの定義は？
デストラクタ：インスタンスが破棄された際に実行される。コンストラクタの逆。
Javaにデストラクタの概念はなく、独自のガーベージコレクションがあるため、オブジェクトの参照がなくなると、自動的にオブジェクトを破棄する。

### 75. 変数は、ローカルとstaticを両方同時に使えますか？
ローカル変数をstaticとして定義するとコンパイルエラーとなる。

### 76. インターフェースに静的(static)メソッドを使用できますか？
静的メソッドはどのクラスでもオーバーライドできませんが、インターフェースのメソッドはデフォルトでは抽象であり、インターフェースを実装するクラスに実装することになっている。よって、インターフェースに静的メソッドを含めることに意味がない。

### 77. インターフェースを実装するクラスでは、インターフェースで定義されている変数の値を変更できますか？
インターフェースで定義されている全ての変数は、定数のようなものなので値を変更すことはできない。

### 78. JavaのGCによってメモリ不足になることはありませんか？
GCによるメモリ解放より、オブジェクト生成が速いペースで行われると、使用可能なメモリリソースが一杯になる可能性があるため、メモリ不足にならないことはない。
GCはメモリ不足を保証するものではない。

### 79. mainメソッドにvoid以外の戻り値の型を設定できますか？
いいえ、Javaのmainメソッドの戻り値はvoidのみ
Mainメソッドの完了時に値を返す必要がある場合は、System.exit(int status)を使用できる。

### 80. GCが完了したら、オブジェクトに再度アクセスすることは可能ですか？
オブジェクトがGCで破棄されると、ヒープ領域に存在しなくなるため、再びアクセスすることはできず、再度参照する方法もない。
ヒープ領域：動的に確保と解放を繰り返せるメモリ領域のこと。プログラム実行時に、OSからソフトウェアに対して、一定量のヒープ領域が与えられる。ソフトウェアは必要に応じて、任意にヒープ領域を確保・解放できる。データの仮置き場や臨時の作業台のような存在。

### 81. スレッドプログラミングでは、どのメソッドが全てのスレッドの必須実装ですか？
Run()はRunnablインターフェースのメソッド

### 82. プログラムでデータベース接続を制御し、一度に1つのスレッドのみがデータベースに接続を確立できるようにする必要があります。このロジックを実装するにはどうすればよい？
同期の概念を使用して実装できる。
データベース関連のコードは、Synchronizedキーワードを持つメソッドに配置できるため、一度に1つのスレッドのみがアクセスできる。

### 83. プログラマーが例外を手動でスローするにはどうすれば良いですか？
Throwキーワードを使用することで、例外が、catchブロックで処理される。

### 84. 作成したクラスを他のクラスがそのクラスのオブジェクトを作成できないようにしたい。

クラスのコンストラクターをprivateとして宣言すると、他のクラスからアクセスできなくなる。


### 85. Javaでのオブジェクトの保存方法
Javaでは、各オブジェクトの作成時にヒープからメモリスペースを取得する。
GCで解放されると、ヒープが再割り当てされ、新しいオブジェクトに対して使用することができる。


### 86. ヒープ上のオブジェクトのサイズをどのように確認できるか？
そんな方法はない。

### 87. 次のクラスで、多くのメモリが割り当てられるのはどっち？
*クラスA：3つのメソッド、4つの変数、オブジェクトなし*
*クラスB：5つのメソッド、3つの変数、オブジェクトなし*

オブジェクト作成前にメモリ割り当ては生じないので、ヒープは度のクラスにも割り当てられない。

### 88. プログラムで例外が処理されない場合にどうなる？
Try catch ブロックを使用していない場合、プログラムが中止され、例外後のステートメントは実行されない。

### 89. クラスに複数のコンストラクターが定義されていて、別のコンストラクターの本体から呼び出すことは可能か？
this()で別のコンストラクターから1つのコンストラクターを呼び出すことができる。

### 90. 無名クラスとはどういう意味ですか？
無名クラスは、1行のコードで名前無しで定義されたクラス
あるメソッドの中で、宣言され、その中でしか使わない。

```java
import java.util.*;

class Application {
    public static void main(String[] args) {
        List<Employee> list = new ArrayList<>();
        // 省略

        Collections.sort(list, new Comparator<Employee>() {
            public int compare(Employee e1, Employee e2) {
                return Integer.compare(e1.getAge(), e2.getAge());
            }
        });
    }
}
```
`new Comparator<Employee>()…`が無名クラス

### 91. 宣言後に、配列のサイズを増やす方法はありますか？
配列は、静的であり、サイズを指定したあとの変更はできない。

### 92. アプリケーションに複数のクラスがある場合、複数のクラスにmainメソッドを含めることはできますか？
可能であるが、エントリポイントは特定のクラスのmainメソッドのみから開始される。

### 93. オブジェクトのデータを永続化したいための最良のアプローチは？
シリアル化の概念を使用すること
[Serializable について - Qiita](https://qiita.com/NBT/items/9f76c9fd1c7a90506658)

### 94. Javaのローカルクラスとは何ですか？
特定のメソッド内で新しいクラスを定義すること、
定義されているブロックの外部では使用できない。

### 95. StringとStringBufferを比較できますか？
StringとStringBufferは両方ともStringオブジェクトを表しますが、相互に比較することはできず、比較しようとするとエラーが発生する。

### 96. オブジェクトのセットの操作のAPIはどれですか？
ArrayList
HashMap
TreeSet
TreeMap

### 97. 他の型をboolean型にキャストできますか？
できない。

### 98. オーバライドされた場合、メソッドに異なる戻り値を使用できますか？
できるけど、メソッド名がおなじで、同様のパラメーターを持つこと

### 99. 例外クラスの基本クラスは何ですか？
Javaでは、Java.lang.Throwableは全ての例外クラスのスーパークラス

### 100. 継承におけるコンストラクタの呼び出しの順序は何ですか？
軽症の場合、派生クラスの新しいオブジェクトが作成されると、最初にスーパークラスのコンストラクターが呼び出され、次に派生クラスのコンストラクターが呼び出される。