はじめに
私は過去の投稿からわかる通り普段はC++やRubyを使っています
そしてタイトルからわかる通り私はあまりJavaがあまり好きではありません
嫌いな理由はパッケージとか名前空間で長文になったりデザインパターンがわかりづらかった点でしょうか
C言語からオブジェクト指向言語を触った時の初めの抵抗もあるかもしれません
なのでPerlの方が性にあっていて今のRubyにつながっています(Perl風で書きやすいです)
そんな感じですが,Javaはたびたび触ったこともありますし,Javaで書かれたソースもよく読みます
そんな自分がJavaをどれくらい理解できているのかテストしてみた
テストに使ったページは下のサイトです
Javaプログラマであるかを見分ける10の質問
#問題
- ==演算子とequalsメソッドの違いは何か?
- 文字列の+演算子による連結とStringBuilderを使った連結の違いを説明せよ。
- Listのようにジェネリクス型を使う主たる目的は何か?
- オブジェクトがガベージコレクション(GC)される主たる条件は何か?
- チェック例外と非チェック例外の違いを型と例外処理の観点で説明せよ。
- フィールドのアクセス修飾子をprivateにしgetter/setterメソッドを提供する事でフィールドを参照する設計方針を取る主な理由を説明せよ
- NullPointerExceptionが発生するのは主にどういう状況か?
- オーバーロードとオーバーライドの違いは何か?
- コンストラクタとは何か?
- インターフェイスを利用する目的を1つ説明せよ
#私の回答
1.
「==」はクラスが同一であるかの比較,「equals」は内部のデータ(Stringだと格納文字)が等しいかの比較.
Rubyだと「==」はJavaの「equals」と基本同じ扱いですね
2.
「+」は二つのStringクラスを組み合わせたStringを新しく作り返す.
StringBuilderは伸び縮みが可能なクラスでStringBuilderに連結すると自身に文字が拡張される.
Rubyでいうところの非破壊的か破壊的かの違いみたいなイメージ
3.
様々な型(クラス)で使えるようにするため.
例えばintには対応しているけどfloatには対応していないというのは不便.
だからといって全てのクラスについて定義するのもよろしくない,そういった状況を解消する.
一応C++プログラマなのでこれは間違いないかと
4.
メモリマッピングしていったときに指定幅を越えたとき?タイミングまでは知りません
5.
チェック例外や非チェック例外は名前自体聞いたことがないのでわかりません
6.
クラスに思わぬデータの使わせ方をさせたくないため.
例えば文字数と格納文字を保持するMyStringクラスが会った時,文字数と格納文字を同時に書き込むとお互いのデータで整合性が取れないヒューマンエラーなどを引き起こす要因となりうる.
そこでsetterクラスを用いることによって文字を格納すると同時に文字列の長さを変更することで細かな操作をクラス利用者が意識しなくてよくなる.
7.
例えばNullを参照したとき, 1+Null
を演算させたときなど.Rubyでもあるある.
8.
オーバーロードは引数の型や数の異なる同名のメソッドを同一クラス内に作ること.オーバーライドは親クラスから継承されたメソッドを上書きすること.なにげに演算子の再定義はなぜオーバーロードなのかわからずに言ってったりする(私としてはオーバーライドの感覚が近い)
9.
クラスを作ったときの最初の処理,主に初期化処理をする部分
10.
多重継承が許されないJavaにおいてインターフェース内のメソッドを親クラスなしに複数のクラスで共通化できる
これによりポリモーフィズム設計に適する
#おわりに
Java好きじゃないといいつつなんだかんだ基本的な問題はいくつか解けました
でも,うわべだけの知識なのでおそらく結構間違っているでしょう
ここまで見てくださった親切なJavaプログラマさん,もし時間が空いていましたら採点コメントのほどよろしくお願いします