Incorrect Core Java Interview Answers を勝手に日本語化
Incorrect Core Java Interview Answers | Java Code Geeks - 2018が面白かったので勝手に日本語にしてみました。
しかも途中で面倒になって止めた。
正確に記憶してるかどうかってよりも、嘘情報を鵜呑みにしないことのほうが大事だと思います。
サブルーチンへの引数渡しにはどういったやり方があるのか説明して?
引数には 2 つの渡し方があります。値渡しと参照渡しです。
値渡しでは、実際の引数の値をコピーした値が、メソッドの引数に渡されます。
参照渡しでは、実際の引数の値ではなく、引数の参照が、メソッドの引数に渡されます。
Java は値渡ししかできません。
参照を値として渡すことはできますが、参照として渡すことはできません。
Java の参照は "Call By Sharing" とも呼ばれますが、あまり一般的に使われる呼び方ではありません。
ガベージコレクションとは何ですか? 明示的に呼ぶことはできますか?
ガベージコレクションとは、あらゆる変数から参照されなくなったオブジェクトの占めているメモリ領域を、
Java が自動的に開放する処理のことです。
System.gc()
メソッドによって明示的に呼び出すことができます。
ルートコンテキストからの強参照が存在しないオブジェクトは、回収対象となる資格があります。
弱参照やソフト参照だけのオブジェクトも、回収対象となる資格があります。
強参照が存在しないオブジェクトは、回収対象にならないかもしれません。
(マイナー GC は tenured オブジェクトを回収しないかもしれないし、GC が実行される保証もありません。)
System.gc()
メソッドは、フル GC を実行するためのヒントにしかなりません。
コマンドラインオプションによって無効化できます。
transient って何? volatile って何?
transient
修飾子は、変数にのみ適用できるもので、
その変数がオブジェクトの永続的な状態に含まれないことを宣言するものです。
transient
変数はシリアライズされません。
volatile
修飾子は、変数にのみ適用できるもので、
その変数の値がプログラムの他の場所から予期せぬ変更ができないようコンパイラに伝えるためのものです。
transient
修飾子は、クラスのフィールドに適用できるもので、
ローカル変数には適用できません。
静的変数にも適用できますが、無視されます。
transient
フィールドは、自動的にはシリアライズされません。
しかし、writeObject()
メソッドとreadObject()
メソッドをカスタマイズすればシリアライズ可能になります。
volatile
修飾子は、クラスのフィールドに適用できるもので、
コンパイラではなく JIT に対して、アクセス時のメモリとキャッシュの一貫性を保証させるためのものです。
transient キーワードの使い方を説明して?
このキーワードは、オブジェクトのメンバー変数がシリアライズされる必要が無いことを示すために使います。
あるクラスがデシリアライズされるとき、そのメンバー変数の値には、自動的にデータ型に応じた初期値が設定されます。
このキーワードが指定されたオブジェクトのメンバー変数は、自動的にシリアライズされません。
デシリアライズされるときのメンバー変数の値は自動的に設定されません。
Integer
ならnull
になるし、int
なら0
になります。
メソッドのオーバーロードって何? メソッドのオーバーライドって何?
オーバーロードとは、あるクラスに同じ名前で引数が異なるメソッドが定義されることです。
オーバーライドとは、あるクラスに同じ名前で引数も同じメソッドが定義されることです。
オーバーロードは、2 つのメソッドが同じ名前で異なるシグネチャとなる場合のことを言います。
シグネチャには、引数の型、ジェネリクスの型が含まれます。
1 つのメソッドは異なる引数で呼び出すことができるし、2 つのオーバーロードされたメソッドは同じ引数で呼び出すことができます。引数ではなくシグネチャが異なるからです。
オーバーライドは、サブクラスで親クラスのメソッドと同じシグネチャのメソッドを定義することを言います。