私はJavaが  できます。

id:shuji_w6eさんのhttp://d.hatena.ne.jp/shuji_w6e/20110305/1299288660をやらせてもらいました。

==演算子とequalsメソッドの違いは何か?

==演算子は両辺の値を比較する。equalsメソッドは両辺の参照先の値を比較する。


もう少し詳しく説明すると、==演算子は両辺にあるのが値型(intやbooleanなど)なら値そのものを、参照型(StringやObjectなど)なら参照先が同じかどうか(同じオブジェクトかどうか)を判定する。オブジェクトのnullチェックには==演算子が使用される。
それに対してequalsメソッドはオブジェクト(参照型)に対して呼ばれ、その参照先の値が比較される。違うオブジェクトでも、参照先の値が同じなら比較結果は正(true)となる。


文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。文字列の連結は原則として+演算子を使ってはならない理由を説明せよ。

演算子による連結は、連結結果が新しいStringクラスのオブジェクトとして生成される。オブジェクトの生成にはコストがかかるため、頻繁に使用すると処理が重くなる。


StringBuilderを使った連結は、既存のStringBuilderクラスのオブジェクトに対して文字列が連結されるため、余計なオブジェクトが生成されない。よって、パフォーマンスの向上が期待できる。


Listのようにジェネリクス型を使う主たる目的は何か?

  1. コレクション内のオブジェクトの型がある程度保証される。
  2. 値を取り出す際、型のキャストが不要となる。

オブジェクトがガベージコレクションGC)される主たる条件は何か?

どの場所からも参照されなくなったとき。例えば、ある変数に格納されて使用されていたオブジェクトは、その変数にnullが代入されるか、変数自体がスコープ外となったときにGCの対象となる。


チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。

チェック例外は、Javaコンパイラによって以下のどちらかの対応を求められる。

  • その例外が発生し得る場所に対して、try〜catch構文で例外処理を行う。
  • メソッドのthrows句に例外クラスを指定し、その例外が呼び出し元に投げられ得ることを明示する。


非チェック例外は、Javaコンパイラによるチェックの対象とはならず、どこからともなくやってくる。


Effective Java 読書会 13 日目 「Java の例外めんどくさい」 - IT戦記


フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ

アクセス修飾子をpublicにすると、そのフィールドを持っているクラスのオブジェクトがさえあれば自由に値の参照および更新が可能となってしまう。フィールドはオブジェクトに結びついているものであり、オブジェクトは基本的にメソッドを使用して操作されるものなので、裏口が開いているような状態となり危険である。


privateにしgetter/setterメソッドを作成することで、一応はフィールドへのアクセスにメソッドを介すので、いくらか安全となる。ただ、普通はgetter/setterメソッドは作成せず、通常のメソッドから正しい文脈でのみフィールドを使用するようにするべきである。


NullPointerExceptionが発生するのは主にどういう状況か?

オブジェクト変数のメソッドを呼び出す際、参照先が登録されていない(== null)という状況で発生する。


オーバーロードとオーバーライドの違いは何か?

オーバーロード

Javaでは、同じクラス内に同じ名前のメソッドを定義できる。その場合、メソッドの引数の型や数が異なっている必要があり、Javaは引数によってどのメソッドを呼ぶか決める。これをオーバーロードという。

オーバーライド

親クラスを継承する際、親が持っているメソッドと同じ名前で同じ引数のメソッドを定義することで、親のメソッドを上書きすることができる。これをオーバーライドという。


コンストラクタとは何か?

オブジェクトを生成する際に使用される、メソッドのようなものである。クラスをnewすると、コンストラクタを通った後、呼び出し元にオブジェクトが返される。

ちなみに、コンストラクタをprivateにすると、通常の方法(new)ではオブジェクトを生成できなくなる。


インターフェイスを利用する目的を1つ説明せよ

変数名にインターフェイスを使用することで、どんな中身でも同じように呼び出せることが保証される。これにより、オブジェクトの実装を容易に変更することが可能となる。



新人への説明を意識して書いてみました。ただ、初心を忘れかけているので、わかりやすいかどうかはなんとも言えません。というか、どうやって学んだか忘れてしまった。本だけでないことは確かだと思うので、おそらく社内研修や都度Webを調べながら身に付けたのかなと。オブジェクト指向まわりはRubyに触れてから理解した部分も大きいと思います。


今後はフェーズ的にJavaで書く機会も減ってくる(はず・・)と思うので、知識を整理できてよかったです。もし間違っていたら是非ともご指摘お願いします。