こたえてみた(キリッ

Javaプログラマであるかを見分ける10の質問 - やさしいデスマーチ


経験? なにそれ? おいしいの?
業務経験0のうどんさんがこたえてみた(キリッ

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

==はインスタンスが自分自身であるかどうかを比較するもの(キリッ
equalsメソッドは実装によるが、大体の場合はインスタンスの状態が同じであるかどうかを比較するもの(キリッ

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

使ってはならない理由はない(キリッ
昔はStringを+演算子で繋いで書くとコストがかかってた。でもいつの頃からか「"" + ""」はコンパイラがStringBuilderに暗黙的に書き換えるようになったので、使ってはならない理由は消滅した(キリッ

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

List内の要素の型を単一に保つため(キリッ
ジェネリクス導入前のListはObjectをadd/getするものだった(キリッ
これは全ての型を適当にListに入れる事が出来る為、型を曖昧にし、いちいちcastを必要にし、最悪castに失敗する可能性が高かった(キリッ
ジェネリクスを導入すると、一定の型のみがListに入る為、タイプセーフだし、いちいちcastしなくていい(キリッ


Listは遠慮無く笑うものだと思っている(キリッ(キリッ

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

  1. インスタンスの参照カウントが0になった時(キリッ
  2. マークアンドスイープをJavaが実行した時(キリッ
  3. System.gc()を明示的に呼び出した時(キリッ

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

え……型のかんてん? かんてんかんてーんたべたーいうへへ ゚q゚

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

クラスを変更に強くする為(キリッ
getter/setterは外部に対するAPIを提供する目的で作られる(キリッ
もしクラスの内部的動作が変わっても、getter/setterまで変更する必要がないのなら、ソースの修正はそれ以上必要ない(キリッ
もしこれがpublicなフィールドで値を参照するタイプのクラスだった場合、フィールド名を変更すると他のクラスの書き換えまで必要になってくる*1(キリッ


また、getterのみ、setterのみを定義する事でフィールドへの読み書きを制限する事も可能になる(キリッ

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

  1. nullが格納されている変数のメソッドを呼び出した時(キリッ
  2. throw new NullPointerException()を書いた時(キリッ

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

オーバーロードは同一の名前で、かつ引数のシグネチャが違うメソッドを書ける機能(キリッ
オーバーライドはクラスを継承した時、スーパークラスのメソッドを上書きする機能(キリッ


たちあがれ! ぼくの分身! ライド!(キリッ

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

newを使ってインスタンスを生成する時に呼ばれるメソッド(キリッ

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

クラスのAPIを共通化するため。
たとえば、ArrayListとLinkedListは内部的に挙動の違うクラスだが、Listインターフェイスが使われているため、外部から見るとあたかも同じクラスであるかのように振舞う事が出来る*2(キリッ

*1:正直Eclipseの名前変更機能を使えば名前変更のメリットは消える事もあるんだけどね(キリッ

*2:゚q゚