「Javaプログラマであるかを見分ける10の質問」を答えられるように

Javaプログラマであるかを見分ける10の質問 - やさしいデスマーチ
がもとで、なんとなく分かるものもあるけど、うまく答えられる気がしないので自分用にまとめる

回答については、出題者さんが出してくれているのだけど、それをみても固まってしまうので
Javaプログラマであるかを見分ける10の質問-回答編 - やさしいデスマーチ

出題者さんの意図でもあるようだけど、正確なことは書けないので多少間違っているかもしれない

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

回答では「インスタンスの同一性」と述べられているけど
具体的には
==は同オブジェクト参照チェック
equals()は同格納値チェック
分かりやすい記事があったので
Java ==とequals()による初歩的問題について : ほるめすメモ帳inBlogger
上の記事をみてもらうのが良いけど、この記事ではStringの文字列の比較を例にしている。
格納されている文字列が同じでも==をつかうとfalseになるという話

  • 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。

effective javaを参考に
+演算子は簡単に文字列を連結できる便利な演算子なんだけど、Stringが不変クラスであるため問題がある。
不変クラスってのは初期化時にしかインスタンスを変更できないクラスのこと(==フィールドを変更できない?)
不変クラスで分かったけど、+演算子で文字列を連結すると新しくStringが生成されることになる。変えることができないのだから
effective javaに計算量についても書いていて、O(n^2)らしい
数十倍、StringBuilderの方がはやいって覚えておけばいい
ので、100回以上、文字列を連結するような場合はStringBuilderの方を使うべきかな。場合によっては数十回でも
StringBuilderの実装については分かんないけど、最初に大きくメモリ確保しといてString流していくみたいな実装なのかなー

回答では「キャストの安全性」と書かれているけど、これだけだとよく分からなかったので
ジェネリクスってのはどの部分かというとの部分らしい
今はジェネリクスがあるからListとかのコレクションの初期化時に型を指定するけど過去には型を指定しなかったらしい
これが分かれば難しくない
型を指定してないListはなんでも突っ込めたので、突っ込む時はエラーがでないけど取り出してみて想定していた型にキャストしたら違った!ってことが起こったらしい
最悪になると、いつ間違ったものを突っ込んだのか分からなくてデバッグが大変になるらしい・・・
むしろ、なんで最初からジェネリクスが無かったのか疑問だなー
もっと詳しくジェネリクスについて書いてある↓
Javaジェネリクス再入門 - プログラマーの脳みそ

回答は「オブジェクトの参照がどこからもなくなる」
GCについては分からなくてもプログラミングできるので分からない部分は多い
けど、文字列の連結であったけどインスタンスの生成が高コストだったりするから
良いコードを書くならある程度は知ってなきゃいけない知識って印象

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

回答は「チェック例外はtry-catch句で処理されるかthrows句で呼び出し元に伝搬する必要がある」
問題の意図を理解するのに時間がかかった・・・
まず、チェック例外は必ずtry-catchかthrowsしなければならない、非チェック例外はしなくても良い、という前提知識というか回答がある
回答がわかる人には上記した回答で意図がわかるけど、わからない人にとってはイマイチ意図がわかりにくい気がする・・・
チェック例外は〜必要がある、から非チェック例外は〜必要ない、って考えれば良いのかなー・・・

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

カプセル化がキーワード、よくみるけどイマイチ単語がでてこない
カプセル化のメリットをイマイチ理解してこなかった
VSだったかで自動生成されるsetter/getterは

private int x;
public int get(){
    return x;
}
public void set(int xx){
    x=xx;
}

みたいなもので、これだけだと意味なんてない
setterの簡単なメリットとしては、対象のフィールド変数がもつべき値の範囲が決まっている。変な値を入れられると正常に動作しないため、setする値を調べる。
getterはフィールド変数をsetter以外で変えられないようにするためのものなのかなー
javaで言えば、intは値渡しだから上記のコードで問題無いはずだけど、newするようなオブジェクトでいいのかな?
これは参照渡しになるから気をつけなきゃいけないし、初見殺しだと思う
(蛇足:参照渡しにもいろいろあるらしい・・・
「JavaScriptの配列は参照渡し(call-by-reference)」は間違い - rarilogger)

c a=new c();
c tmp=new c();
public c get(){
    tmp.copy(a);
    return tmp;
}
public void set(c cc){
    a.copy(cc);
    //copy関数がなければフィールドをコピー
} 

とか、やるのかな
setter/getter内で毎回newするのはやっぱり良くないのかなー
不変クラスだったら毎回newするのかなー
仮にcが超巨大だったとしたらaとtmpの2つのインスタンスを持つってあまり嬉しくないよなー、とか思う

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

回答は、「nullを参照している変数のフィールドやメソッドを呼び出そうとした場合」
これは何度か実体験あるな

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

これは覚えているかどうかなのかな。名前が似ているだけで全く違う
オーバーロードは、メソッド名が同じで引数が違う。戻り値、アクセスレベル、引数名、throws節は同一なのかな・・・?
オーバーライドは、スーパークラスのメソッドを再定義すること

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

回答は、「インスタンスの初期化時に実行されるメソッドのようなもの」
javaを勉強すれば最初にでてくるから難しくない問題なのかな?
コンストラクタはメソッドではないらしい
メソッドの定義も分かってないし、そんなことばっかだな

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

回答は、「仕様と実装を分離するため」
インターフェイスを書いたことはあるけど、イマイチうまく使えている気がしない
クラスを使う側が実装ごとにコードを書かなくてすむのだからコード量は減る気はするのだけど
インターフェイスの作り方が悪いのかなー
ポリモーフィズムは名前だけで、理解してないなー