コアJavaのインタビューの質問は、Javaベースのインタビューの準備に役立ちます。あなたが新人であろうと、経験豊富なプロフェッショナルであろうと、コアJavaはどのJava/JEEのインタビューにおいても重要な役割を果たします。
コアJavaはほとんどのインタビューで好まれる分野であり、あなたのインタビューの結果を決定する上で重要な役割を果たします。
この投稿は、私が14年以上のJavaプログラミングと多くの面接経験から直接得たものです。Java 16が最近リリースされ、最新のリリースからいくつかの質問を含めた投稿を更新しました。
コアJavaのインタビューの質問と回答
I have already written a lot about java interview questions for specific topics such as String, Collections, and Multithreading.
ここでは、知っておくべき重要なコアJavaインタビューの質問と回答をいくつか提供しています。インタビューに向かう前に知識を復習するために、この投稿をブックマークできます。
1. Java 14リリースの重要な機能をいくつか挙げてください。
Java 14は2020年3月17日にリリースされました。これはLTSではないバージョンです。開発者向けのいくつかのJava 14の機能は次のとおりです:
- Switch Expressions – JEP 361
- instanceof演算子のパターンマッチングの改善 – プレビュー機能、JEP 305
- 役立つNullPointerExceptionメッセージ – JEP 358
- Text Blocks – 2番目のプレビュー、JEP 368
- Records – データクラス、プレビュー機能、JEP 359。
2. Java 13リリースの重要な機能をいくつか挙げてください。
Java 13は2019年9月17日にリリースされました。これはLTSではないバージョンです。開発者向けのいくつかのJava 13の機能は次のとおりです:
- Text Blocks – プレビュー機能、JEP 355
- スイッチ式 – プレビュー機能、JEP 354
- JavaソケットAPIの再実装 – JEP 353
- ダイナミックCDSアーカイブ – JEP 350
- FileSystems.newFileSystem() メソッド
- 名前空間サポート付きのDOMおよびSAXファクトリ
- Unicode 12.1 サポート
- 未使用のメモリを返すためのZGCの改善 – JEP 351
Java 12リリースの重要な機能をいくつか挙げてください?
Java 12は2019年3月19日にリリースされました。これはLTSではないバージョンです。いくつかのJava 12の機能には、次のものがあります。
- JVMの変更 – JEP 189、JEP 346、JEP 344、およびJEP 230。
- スイッチ式
- File mismatch() メソッド
- コンパクト数値のフォーマット
- ストリームAPIのTeeing Collectors
- Stringクラスの新しいメソッド
- JEP 334: JVM Constants API
- JEP 305: instanceofのためのパターンマッチング
- Raw String LiteralsはJDK 12から削除されました。
Java 11リリースの重要な機能は何ですか?
Java 11はJava 8の後の2番目のLTSリリースです。ライセンスとサポートモデルが変更されました。これは、Java 11 Oracle JDKをダウンロードすると、商用利用には有料になります。無料のバージョンを使用したい場合は、OpenJDKのウェブサイトからダウンロードできます。
Java 11の重要な機能のいくつかは次のとおりです:
- Javaプログラムを
java
コマンドを使用して直接実行できます。ソースファイルは暗黙的にコンパイルされて実行されます。これはJEP 330機能の実装の一部です。 - Stringクラスには6つの新しいメソッドが追加されました – isBlank()、lines()、strip()、stripLeading()、stripTrailing()、およびrepeat()。詳細については、Java Stringクラスの記事をご覧ください。
- Filesクラスには、文字列データを読み取り/書き込みするための2つの新しいメソッド、readString()およびwriteString()が追加されました。
- 「var」をラムダ式でも使用できます。これはJEP 323の実装の一部です。
- Epsilon:テスト環境向けのNo-Op Garbage Collectorです。これは実験的な機能であり、JEP 318の一部です。
- Java EEおよびCORBAモジュールが標準のJDKビルドから削除されました。Nashorn JavaScript Engineも非推奨になりました。
- 新しいHTTPクライアント(JEP 321)とFlight Recorder(JEP 328)
完全な概要については、「Java 11の機能」をお読みください。
5. Java 10リリースの重要な機能は何ですか?
Java 10は、Oracle corporationからの最初の6か月ごとのリリースであり、これまでのバージョンとは異なり、主要なリリースではありません。ただし、Java 10の重要な機能のいくつかは次のとおりです。
- ローカル変数型推論
- java.util.Localeおよび関連するAPIを強化して、BCP 47言語タグの追加のUnicode拡張を実装します。
- HotSpot VMを、ユーザーが指定するNV-DIMMなどの代替メモリデバイスにJavaオブジェクトヒープを割り当てるように設定します。
- JDKにデフォルトのルート証明機関(CA)証明書セットを提供します。
Java 10は主にメンテナンスリリースですが、ローカル変数型推論機能が本当に好きでした。Java 10の詳細な概要については、「Java 10の機能」を参照してください。 Java 10の機能。
6. Java 9リリースの重要な機能は何ですか?
Java 9は大規模なリリースであり、多くの機能をもたらしました。そのうちのいくつかの重要な機能は次のとおりです:
- Java 9 REPL(JShell)
- Java 9モジュールシステム
- 不変のリスト、セット、マップ、およびMap.Entryのためのファクトリメソッド
- インターフェース内のプライベートメソッド
- リアクティブストリーム
- GC(ガベージコレクター)の改善
これらの詳細については、Java 9の機能で確認できます。
7. Java 8リリースの重要な機能は何ですか?
Java 8は2014年3月にリリースされましたので、それはJavaのインタビューでよく出るトピックの1つです。この質問に明確に答えると、最新の技術を常に追いかけていることが示されます。
Java 8は、Java 5の注釈とジェネリクスに続く最大のリリースの1つでした。Java 8の重要な機能のいくつかは以下のとおりです:
I strongly recommend to go through above links to get proper understanding of each one of them, also read Java 8 Features.
8. JavaのOOPSコンセプトをいくつか挙げてください?
Javaはオブジェクト指向プログラミングのコンセプトに基づいており、以下はJavaプログラミングで実装されているOOPSコンセプトのいくつかです。
- 抽象化
- カプセル化
- 多様性
- 継承
- 関連
- 集約
- 合成
詳細については、JavaのOOPSコンセプトを参照してください。
Javaのプラットフォーム独立性とは何ですか?
プラットフォームの独立性とは、同じJavaプログラムを任意のオペレーティングシステムで実行できることを意味します。例えば、WindowsでJavaプログラムを書いて、それをMac OSで実行できます。
Java Virtual Machine(JVM)とは何ですか?それはプラットフォームに依存しないですか?
Java Virtual Machine(JVM)はJavaプログラミング言語の中核です。JVMはバイトコードを機械語に変換する責任があります。JVMはプラットフォームに依存しないわけではありません。そのため、異なるオペレーティングシステム用に異なるJVMがあります。私たちはJVMに最小および最大メモリを割り当てるなど、JavaオプションでJVMをカスタマイズできます。それが仮想と呼ばれるのは、基礎となるOSに依存しないインターフェースを提供するからです。
JDKとJVMの違いは何ですか?
Java Development Kit(JDK)は開発目的のためであり、JVMはその中のJavaプログラムを実行するための一部です。
JDKは、Javaプログラムをコンパイル、デバッグ、実行するために必要なすべてのツール、実行可能ファイル、およびバイナリを提供します。実行部分は、機械の独立性を提供するためにJVMが処理します。
12. JVMとJREの違いは何ですか?
Javaランタイム環境(JRE)はJVMの実装です。JREにはJVMおよびJavaバイナリと他のクラスが含まれており、任意のプログラムを正常に実行するためのものです。JREにはJavaコンパイラやデバッガなどの開発ツールは含まれていません。Javaプログラムを実行するには、JREをインストールする必要があります。
13. すべてのクラスのスーパークラスはどれですか?
java.lang.Object
はすべてのJavaクラスのルートクラスであり、拡張する必要はありません。
14. なぜJavaは複数の継承をサポートしていないのですか?
Javaはクラスでの多重継承をサポートしていません。これは「Diamond Problem」によるものです。例を含めてdiamond problemについて詳しく知りたい場合は、Javaにおける多重継承を読んでください。
しかし、インターフェースでは複数の継承がサポートされています。インターフェースは単にメソッドを宣言するだけであり、実装は実装クラスに存在するため、diamond problemの問題はありません。
15. Javaが純粋なオブジェクト指向言語ではない理由は何ですか?
Javaは、int、byte、short、longなどのプリミティブ型をサポートしているため、純粋なオブジェクト指向とは言えません。これにより、コードを書く際に言語がシンプルになります。Javaはプリミティブ型に対するラッパーオブジェクトを持つことができましたが、それは表現上のものであり、何の利益ももたらしませんでした。
すべてのプリミティブ型には、Integer、Longなどのラッパークラスがあることがわかっていますが、これらはいくつかの追加メソッドを提供しています。
16. パス変数とクラスパス変数の違いは何ですか?
PATHは、オペレーティングシステムが実行可能ファイルを見つけるために使用する環境変数です。そのため、Javaをインストールしたり、任意の実行可能ファイルをOSに見つけてもらいたい場合は、そのディレクトリの場所をPATH変数に追加する必要があります。Windows OSで作業している場合は、この投稿を読んで、WindowsでPATH変数を設定する方法を学んでください。
ClasspathはJava固有のものであり、java実行可能ファイルがクラスファイルを見つけるために使用されます。Javaアプリケーションを実行する際にクラスパスの場所を指定でき、ディレクトリ、ZIPファイル、JARファイルなどが指定できます。
main()メソッドは、スタンドアロンのJavaアプリケーションのエントリーポイントです。mainメソッドの構文は、public static void main(String args[])
です。
Javaのmainメソッドはpublicでstaticなので、Javaランタイムがクラスを初期化せずにアクセスできます。入力パラメータは、Javaプログラムにランタイム引数を渡すためのString配列です。Javaプログラムのコンパイルと実行方法を学ぶには、この投稿をチェックしてください。
18. Javaでのオーバーローディングとオーバーライドとは何ですか?
単一のクラス内に同じ名前の複数のメソッドがあり、ただし引数が異なる場合、それはメソッドのオーバーロードと呼ばれます。
オーバーライドの概念は、継承時に親クラスと子クラスの両方に同じシグネチャの2つのメソッドがある場合に発生します。子クラスのオーバーライドされたメソッドに@Override注釈を使用して、親クラスのメソッドが変更された場合に子クラスも変更されることを確認できます。
19. main()メソッドをオーバーロードできますか?
はい、単一のクラス内に名前が “main” の複数のメソッドを持つことができます。ただし、クラスを実行する場合、Javaランタイム環境は構文がpublic static void main(String args[])
であるmainメソッドを探します。
20. Javaのソースファイルに複数のpublicクラスを持つことはできますか?
1つのJavaソースファイルに複数のpublicクラスを持つことはできません。単一のソースファイルには、publicでない複数のクラスが含まれることがあります。
21. Javaパッケージとは何ですか。デフォルトでどのパッケージがインポートされますか?
Javaパッケージは、Javaクラスをグループ化して整理する仕組みです。グループ化のロジックは、機能またはモジュールに基づいています。Javaクラスの完全修飾名には、パッケージ名とクラス名が含まれます。例えば、java.lang.Object
は、java.lang
パッケージの一部であるObject
クラスの完全修飾名です。
java.lang
パッケージがデフォルトでインポートされており、このパッケージから明示的にクラスをインポートする必要はありません。
22. Javaにおけるアクセス修飾子とは何ですか?
Javaは、public、private、およびprotectedのアクセス修飾子キーワードを通じてアクセス制御を提供します。これらのいずれも使用されない場合、デフォルトのアクセス修飾子と呼ばれます。
A java class can only have public or default access modifier. Read Java Access Modifiers to learn more about these in detail.
23. finalキーワードとは何ですか?
finalキーワードは、他のクラスが拡張できないようにするために、クラスとともに使用されます。たとえば、Stringクラスはfinalであり、それを拡張することはできません。
メソッドとfinalキーワードを使用して、子クラスがそれをオーバーライドできないようにすることができます。
Javaのfinalキーワードは、変数と共に使用され、変数には1度だけ値を割り当てることができます。ただし、変数の状態は変更できます。たとえば、変数には1度だけオブジェクトを割り当てることができますが、後でオブジェクトの変数を変更できます。
Javaのインターフェース変数は、デフォルトでfinalおよびstaticです。
24. staticキーワードとは何ですか?
staticキーワードは、クラスレベルの変数と共に使用され、それをグローバルにすることができます。つまり、すべてのオブジェクトが同じ変数を共有します。
また、staticキーワードをメソッドと共に使用することもできます。staticメソッドは、クラスの静的変数のみにアクセスし、クラスの静的メソッドのみを呼び出すことができます。
詳細については、java staticキーワードを読んでください。
25. Javaでfinallyとfinalizeは何ですか?
finallyブロックは、try-catchと共に使用され、常に実行したいコードを配置するために使用されます。try-catchブロックで例外がスローされても、finallyブロックが実行されます。finallyブロックは、通常、tryブロックで作成されたリソースを解放するために使用されます。
finalize()は、Objectクラスの特別なメソッドであり、私たちのクラスでオーバーライドすることができます。このメソッドは、オブジェクトがガベージコレクトされるときにガベージコレクタによって呼び出されます。このメソッドは、通常、オブジェクトがガベージコレクトされるときにシステムリソースを解放するためにオーバーライドされます。
26. クラスをstaticとして宣言できますか?
トップレベルのクラスをstaticとして宣言することはできませんが、内部クラスをstaticとして宣言することはできます。内部クラスがstaticとして宣言されている場合、それは静的ネストクラスと呼ばれます。
静的ネストクラスは、他のどのトップレベルクラスと同じであり、単なるパッケージングの便宜のためにネストされています。
内部クラスについて詳しくは、java inner classを読んでください。
27. 静的インポートとは何ですか?
他のクラスから静的変数やメソッドを使用する場合、通常はそのクラスをインポートしてからクラス名を使用してメソッド/変数を使用します。
同じことができますが、静的メソッドまたは変数のみをインポートして、それをクラスに属しているかのように使用することができます。
静的インポートの使用は混乱を招く可能性があるため、避けることが良いでしょう。静的インポートの過度の使用は、プログラムを読みにくく保守しづらくする可能性があります。
28. Java での try-with-resources とは何ですか?
Java 7 の機能の1つは、try-with-resources ステートメントです。自動リソース管理のためのものです。Java 7 以前では、自動リソース管理はありませんでした。リソースを明示的に閉じる必要がありました。通常、これは try-catch ステートメントの finally ブロックで行われました。このアプローチは、リソースを閉じるのを忘れた場合にメモリリークを引き起こすことがありました。
Java 7から、tryブロック内でリソースを作成して使用できます。Javaは、try-catchブロックが終了するとすぐにそれを閉じるように処理します。詳細はJava Automatic Resource Managementで読むことができます。
29. Javaのマルチキャッチブロックとは何ですか?
Java 7の改善点の1つは、複数の例外を単一のcatchブロックでキャッチできるマルチキャッチブロックです。これにより、各catchブロックに類似のコードがある場合に、コードが短く、クリーンになります。
複数の例外を処理するcatchブロックの場合、それらをパイプ(|)で区切ることができます。この場合、例外パラメータ(ex)はfinalであり、変更できません。
詳細はJava multi catch blockで読むことができます。
30. スタティックブロックとは何ですか?
Javaのstaticブロックは、JavaのClassLoaderによってクラスがメモリにロードされるときに実行される一連のステートメントです。これは、クラスの静的変数を初期化するために使用されます。ほとんどの場合、クラスがロードされるときに静的リソースを作成するために使用されます。
31. インターフェースとは何ですか?
インターフェースは、Javaプログラミング言語のコアコンセプトであり、JDKだけでなくJavaデザインパターン、ほとんどのフレームワークやツールでも頻繁に使用されます。インターフェースはJavaで抽象化を実現する方法を提供し、サブクラスが実装するための契約を定義するために使用されます。
インターフェースは、タイプを定義しコード内でトップレベルの階層を作成する出発点として適しています。Javaクラスは複数のインターフェースを実装できるため、ほとんどの場合、インターフェースをスーパークラスとして使用することが良いです。詳細は、java interfaceを参照してください。
32. 抽象クラスとは何ですか?
抽象クラスは、サブクラスのためのいくつかのデフォルトのメソッド実装を持つクラスを作成するためにJavaで使用されます。抽象クラスには、ボディのない抽象メソッドを持つことができ、実装されたメソッドも持つことができます。
抽象キーワードは、抽象クラスを作成するために使用されます。抽象クラスはインスタンス化できず、主にサブクラスが拡張して抽象メソッドを実装し、抽象クラス内の実装されたメソッドをオーバーライドまたは使用するための基盤を提供するために使用されます。抽象クラスに関する重要なポイントは、java abstract classで読むことができます。
33. 抽象クラスとインターフェースの違いは何ですか?
- 抽象キーワードは抽象クラスを作成するために使用されますが、インターフェースのキーワードはインターフェースです。
- 抽象クラスにはメソッドの実装が可能ですが、インターフェースにはできません。
- A class can extend only one abstract class but it can implement multiple interfaces.
- 抽象クラスにmain()メソッドがあれば実行できますが、インターフェースは実行できません。
詳細な違いについては、抽象クラスとインターフェースの違いを参照してください。
34. インターフェースは他のインターフェースを実装または拡張できますか?
インターフェースは別のインターフェースを実装しません、それらを拡張します。インターフェースにメソッドの実装がないため、ダイヤモンド問題は発生しません。これが、インターフェースでの多重継承が可能な理由です。すなわち、インターフェースは複数のインターフェースを拡張できます。
Java 8以降、インターフェースにはデフォルトメソッドの実装が可能になりました。したがって、複数のインターフェースで共通のデフォルトメソッドが存在する場合のダイヤモンド問題を解決するために、それらを実装するクラスでメソッドの実装を提供する必要があります。詳細と例については、Java 8 インターフェースの変更を参照してください。
35. マーカーインターフェースとは何ですか?
A marker interface is an empty interface without any method but used to force some functionality in implementing classes by Java. Some of the well known marker interfaces are Serializable and Cloneable.
36. ラッパークラスとは何ですか?
Javaのラッパークラスは、Javaの8つのプリミティブ型のオブジェクト表現です。Javaのすべてのラッパークラスは不変で最終的です。Java 5のオートボクシングとアンボクシングにより、プリミティブ型とそれらの対応するラッパークラス間の簡単な変換が可能になります。
詳細は、Javaにおけるラッパークラスを参照してください。
37. JavaでのEnumとは何ですか?
Enumは、Java 1.5で導入された新しいタイプで、そのフィールドは一定の定数のセットで構成されています。例えば、Javaでは、DirectionをEAST、WEST、NORTH、SOUTHの固定フィールドとしてenumとして作成できます。
enumはenumタイプを作成するためのキーワードであり、クラスと類似しています。Enum定数は暗黙的にstaticかつfinalです。詳細については、java enumを参照してください。
38. Javaのアノテーションとは何ですか?
Javaのアノテーションは、コードに関する情報を提供し、それらが注釈を付けたコードに直接的な影響を与えるわけではありません。アノテーションはJava 5で導入されました。アノテーションは、プログラム自体に埋め込まれたプログラムに関するメタデータです。アノテーションは、アノテーション解析ツールまたはコンパイラによって解析できます。また、アノテーションの利用可能性をコンパイル時のみまたは実行時まで指定することもできます。Javaの組み込みアノテーションには、@Override、@Deprecated、@SuppressWarnings などがあります。詳細はこちらを参照してください:java annotations。
39. JavaリフレクションAPIとは、なぜ重要なのですか?
JavaリフレクションAPIは、Javaアプリケーションの実行時の動作を検査および変更する機能を提供します。Javaクラス、インターフェース、列挙型を検査し、そのメソッドやフィールドの詳細を取得できます。リフレクションAPIは高度なトピックであり、通常のプログラミングでは避けるべきです。リフレクションAPIの使用は、アクセス修飾子の規則を破り、プライベートコンストラクタを呼び出すことによってシングルトンパターンなどの設計パターンを壊す可能性があります。
通常のプログラミングではリフレクションAPIを使用しませんが、それを持っていることは非常に重要です。Spring、HibernateなどのフレームワークやTomcat、JBossなどのサーバーを使用するにはリフレクションAPIが必要です。これらのフレームワークやサーバーは、リフレクションAPIを介して適切なメソッドを呼び出したり、クラスをインスタンス化したりして使用し、他の処理にも多く使用します。
Java Reflection Tutorialを読んで、リフレクションAPIの詳細な知識を得てください。
40. JavaにおけるCompositionとは何ですか?
Compositionは、クラス間のhas-a関係を実装するための設計技法です。コードの再利用のためにオブジェクトの合成を使用できます。
JavaのCompositionは、他のオブジェクトを参照するインスタンス変数を使用して実現されます。Compositionを使用する利点は、他のオブジェクトの可視性をクライアントクラスに制御し、必要なものだけを再利用できることです。詳細な例は、Java Compositionの例を参照してください。
41. Inheritanceに比べてCompositionの利点は何ですか?
Javaプログラミングのベストプラクティスの1つは、「継承よりもコンポジションを優先する」ということです。その可能な理由のいくつかは次のとおりです:
- スーパークラスの変更がサブクラスに影響を与える可能性がありますが、サブクラスのメソッドを使用していなくても、そのような変更が発生します。たとえば、サブクラスにメソッドtest()があるとして、突然誰かがスーパークラスにもtest()メソッドを導入した場合、サブクラスでコンパイルエラーが発生します。コンポジションでは、必要なメソッドのみを使用しているため、この問題に直面することはありません。
- 継承は、すべてのスーパークラスのメソッドと変数をクライアントに公開し、スーパークラスの設計に制御がない場合、セキュリティホールの原因になる可能性があります。コンポジションを使用すると、メソッドへの制限されたアクセスを提供できるため、より安全です。
- コンポジションでは実行時バインディングを得ることができますが、継承ではコンパイル時にクラスをバインドします。そのため、コンポジションはメソッドの呼び出しの柔軟性を提供します。
上記の継承よりもコンポジションの利点について詳しくは、java composition vs inheritanceを参照してください。
42. Javaでカスタムオブジェクトのコレクションをソートする方法は?
Comparableインターフェースを実装する必要があります。これにより、コレクション内のカスタムオブジェクトのソートがサポートされます。Comparableインターフェースには、ソートメソッドによって使用されるcompareTo(T obj)メソッドがあります。このメソッドの実装を提供することで、カスタムオブジェクトのコレクションをデフォルトの方法でソートできます。
ただし、給与や年齢など、異なる基準でソートする場合は、Comparatorインスタンスを作成し、それをソート方法として渡すことができます。詳細については、Java ComparableとComparatorを読んでください。
43. Javaにおける内部クラスとは何ですか?
クラス内にクラスを定義することができ、これらはネストされたクラスと呼ばれます。静的でないネストされたクラスは内部クラスとして知られています。内部クラスはクラスのオブジェクトに関連付けられており、外部クラスのすべての変数とメソッドにアクセスできます。内部クラスはインスタンスに関連付けられているため、それらに静的変数を持つことはできません。
クラス内にローカル内部クラスや匿名内部クラスを持つことができます。詳細については、java内部クラスを読んでください。
匿名内部クラスとは何ですか?
A local inner class without a name is known as an anonymous inner class. An anonymous class is defined and instantiated in a single statement. Anonymous inner class always extend a class or implement an interface.
匿名クラスには名前がないため、匿名クラスのコンストラクタを定義することはできません。匿名内部クラスは、定義された地点でのみアクセス可能です。
JavaのClassloaderとは何ですか?
JavaのClassloaderは、クラスにアクセスしたいときにバイトコードプログラムをメモリにロードするプログラムです。ClassLoaderクラスを拡張し、loadClass(String name)メソッドをオーバーライドして独自のクラスローダーを作成することができます。詳細は、java classloaderを参照してください。
クラスローダーの異なるタイプは何ですか?
Javaには3つの組み込みクラスローダーがあります。
- ブートストラップクラスローダー – JDKの内部クラスをロードし、通常はrt.jarやその他のコアクラスをロードします。
- Extensions Class Loader – JDKの拡張ディレクトリからクラスをロードします。通常、$JAVA_HOME/lib/extディレクトリです。
- System Class Loader – 現在のクラスパスからクラスをロードします。プログラムを呼び出す際に -cp または -classpath コマンドラインオプションを使用して設定できます。
47. Javaでの三項演算子とは何ですか?
Javaの三項演算子は、三つのオペランドを取る唯一の条件付き演算子です。これは if-then-else 文のワンライナー置換であり、Javaプログラミングでよく使用されます。三項演算子は、if-else 条件またはネストされた三項演算子を使用してスイッチ条件を表現することができます。例は以下のリンクにあります:java ternary operator。
48. superキーワードは何をしますか?
superキーワードは、子クラスでメソッドをオーバーライドした場合にスーパークラスのメソッドにアクセスするために使用できます。
superキーワードを使用して、子クラスのコンストラクタでスーパークラスのコンストラクタを呼び出すこともできますが、その場合、コンストラクタメソッド内の最初のステートメントである必要があります。
superキーワードの使用例は、以下の子クラスの実装で見ることができます。
49. breakとcontinue文とは何ですか?
break文を使用して、for、while、またはdo-whileループを終了できます。switch文では、switchケースから抜けるためにbreak文を使用できます。break文の例は、java breakで確認できます。ラベル付きのbreakを使用して、ネストされたループを終了できます。
continue文は、for、while、またはdo-whileループの現在の繰り返しをスキップします。最も外側のループの現在の繰り返しをスキップするために、continue文をラベル付きで使用できます。
50. Javaにおけるthisキーワードとは何ですか?
thisキーワードは、現在のオブジェクトへの参照を提供し、主にオブジェクト変数が使用されることを確認するために使用されます。同じ名前のローカル変数ではなく、
我々はまた、このキーワードを使用してコンストラクタから他のコンストラクタを呼び出すこともできます。
51. デフォルトコンストラクタとは何ですか?
クラスの引数なしのコンストラクタはデフォルトコンストラクタとして知られています。クラスのためにコンストラクタを定義しない場合、Javaコンパイラは自動的にクラスのデフォルトの引数なしコンストラクタを作成します。他のコンストラクタが定義されている場合、コンパイラはデフォルトコンストラクタを自動的に作成しません。
52. catchブロックなしでtryを使用することはできますか?
はい、try-finallyステートメントを使用することができ、したがってcatchブロックを回避できます。
53. ガベージコレクションとは何ですか?
ガベージコレクションは、ヒープメモリを見て、使用中のオブジェクトと未使用のオブジェクトを特定し、未使用のオブジェクトを削除するプロセスです。Javaでは、メモリの解放プロセスはガベージコレクタによって自動的に処理されます。
ゴミ収集器を実行するには、Runtime.getRuntime().gc()
コードを使用するか、ユーティリティメソッドSystem.gc()
を使用します。ヒープメモリとガベージコレクションの詳細な解析については、Java Garbage Collectionをお読みください。
54. シリアル化とデシリアル化とは何ですか?
Javaオブジェクトをストリームに変換することをシリアル化と呼びます。オブジェクトがストリームに変換されると、ファイルに保存したり、ネットワーク経由で送信したり、ソケット接続で使用したりできます。
オブジェクトはSerializableインターフェースを実装する必要があり、java.io.ObjectOutputStreamを使用してオブジェクトをファイルに書き込むか、任意のOutputStreamオブジェクトに使用できます。詳細は、Java Serializationをご覧ください。
シリアル化を介して作成されたストリームデータをオブジェクトに変換するプロセスをデシリアル化と呼びます。詳細は、Java Deserializationをご覧ください。
コマンドプロンプトを介してJARファイルを実行する方法は?
javaコマンドを使用してjarファイルを実行できますが、jarマニフェストファイルにMain-Classエントリが必要です。Main-Classはjarのエントリポイントであり、javaコマンドによってクラスが実行されます。詳細については、java jarファイルを参照してください。
56. Systemクラスの用途は何ですか?
Java Systemクラスは、コアクラスの1つです。デバッグ用の情報を記録するための最も簡単な方法の1つはSystem.out.print()メソッドです。
Systemクラスはfinalなので、継承を介してその動作をオーバーライドすることはできません。Systemクラスはパブリックコンストラクタを提供しないため、このクラスをインスタンス化することはできません。そのため、すべてのメソッドが静的です。
Systemクラスのユーティリティメソッドの一部は、配列のコピー、現在の時刻の取得、環境変数の読み取りなどです。詳細については、Java Systemクラスを参照してください。
57. instanceofキーワードとは何ですか?
instanceofキーワードを使用して、オブジェクトがクラスに属しているかどうかを確認できます。できるだけその使用を避けるべきです。サンプルの使用法は次のとおりです:
実行時にstrがString型であるため、最初のif文はtrueと評価され、2番目のif文はfalseと評価されます。
58. switch case文でStringを使用できますか?
Java 7の機能の1つは、switch case文で文字列を許可する機能の向上でした。したがって、Java 7以降のバージョンを使用している場合は、switch-case文でStringを使用できます。詳細は、Java switch-case String exampleを参照してください。
59. Javaは値渡しですか、参照渡しですか?
これは非常に混乱させる質問ですが、オブジェクト変数がヒープ領域内のオブジェクトへの参照を含むことを知っています。メソッドを呼び出すと、これらの変数のコピーが渡され、メソッドのスタックメモリに格納されます。どの言語が参照渡しまたは値渡しであるかをテストするために、単純な一般的なスワップメソッドを使用できます。詳細は、Javaは値渡しであり、参照渡しではありませんを読んでください。
60. ヒープメモリとスタックメモリの違いは何ですか?
ヒープメモリとスタックメモリの主な違いは次のとおりです:
- ヒープメモリはアプリケーションのすべての部分で使用されますが、スタックメモリは実行スレッドのみで使用されます。
- オブジェクトが作成されると、常にそれがヒープ領域に格納され、スタックメモリにはそれへの参照が含まれます。スタックメモリにはローカルのプリミティブ変数とヒープ領域のオブジェクトへの参照変数のみが含まれます。
- スタック内のメモリ管理はLIFOの方式で行われますが、ヒープメモリではグローバルに使用されるため、より複雑です。
詳細な説明とサンプルプログラムについては、Java Heap vs Stack Memoryを読んでください。
61. JavaコンパイラはJDK、JRE、またはJVMに格納されていますか?
Javaコンパイラの役割は、Javaプログラムをバイトコードに変換することです。そのため、そのためにjavac
実行可能ファイルが必要です。したがって、それはJDKに格納されている必要があります。JREには必要ありませんし、JVMは仕様だけです。
62. 次のプログラムの出力は何になりますか?
文脈:クラス内の静的メソッド
答え: コードはコンパイルされません。なぜなら、staticキーワードを持つObjectクラスメソッドを持つことはできないからです。ObjectクラスにはtoString()メソッドがあることに注意してください。コンパイル時エラーが発生します。「この静的メソッドは、インスタンスメソッドをObjectから非表示にすることはできません」という理由です。静的メソッドはクラスに属しているため、すべてのクラスの基底がObjectであるため、インスタンスとクラスの両方に同じメソッドを持つことはできません。スーパークラスObject
に存在しない別の名前のメソッドにメソッド名を変更すると、このエラーは発生しません。
文脈:静的メソッドの呼び出し
回答:これは奇妙な状況ですね。私たちはみんな、オブジェクトがNULLのときにNullPointerException
が発生するのを見たことがあります。しかし、このプログラムは動作し、「Test foo called」と出力します。
その理由は、Javaコンパイラのコード最適化にあります。Javaコードがバイトコードを生成するためにコンパイルされると、foo()が静的メソッドであることがわかり、クラスを使用して呼び出す必要があると判断します。そのため、メソッド呼び出しobj.foo()
はTest.foo()
に変更され、したがってNullPointerException
が発生しません。
I must admit that it’s a very tricky question and if you are interviewing someone, this will blow his mind off. ?
これでJavaのコアインタビューの質問と回答は終わりです。リストにさらに質問を追加していきますので、重要なものを見逃していると思われる場合は、コメントでお知らせください。
Source:
https://www.digitalocean.com/community/tutorials/core-java-interview-questions-and-answers