この記事は?
タイトル通りではありますが、Java Oracle Silver を取得を目指して、学習内容をアウトプットするものとなります。
具体的には所謂黒本を解いてどうしても引っかかるところをこちらの記事に記載していこうというものになります。
そのため記事というより自分に向けた備忘録になりますので予めご了承ください。
(2019/9/28):記載を少し変更しました。
(2019/10/29):合格しました
教本:
徹底攻略 Jaca Silver SE8
合格しました
実は受けたのは中旬頃…更新が遅くなってしまいました。
正答率は**91%**でした。
楽勝か…?
所感としては…**「問題集そのまんまじゃん…」**というのが素直な感想です。
いや本当に。
時間が取れず前日や直前に間違えたところの見直しをやっていましたが、何か引っ掛けのようなものが出るわけでもなく、割と回答選択肢も変わりなくでこんなでいいの…?と思うほど。
ただ1点これから受ける方に伝えるならば、変数名等に惑わされないようお気をつけて。
変数名に関しては問題集と付け方が異なるんですよね…
なので最初の1問目を見た時に見慣れない変数名で焦るかもしれません(私は一瞬戸惑いました)
しかしその問題、問題集でやったところだよ!ってなれば割とサクサク解けると思いますので、是非自信を持って受けてください。
基準としては正直、2つの総まとめ問題が7割で、あとは間違えたところの見直しさえすればいけると思います。
わからない部分があれば紫本で。時間が取れないならKindleを買って電車内で読むのもおすすめです。
人によりけりではあると思いますが、参考までに。
全てのクラスはパッケージに属している
引っかかりポイント:「パッケージに属さないクラスもある」は誤り
実際にパッケージの記載を省略できるものの、その場合は無名パッケージに属するため、パッケージに属さないという言葉は適切でなく誤り。
補足
無名パッケージにアクセスするには同様の無名パッケージからしかアクセスできない。留意。
static インポートは変数やメソッドまで記載する必要がある
引っかかりポイント:通常のインポート文とは異なり、static インポートの時は使いたい変数やメソッドを記載する必要がある。その時、**()**はつけないこと。
以下に例を示す。
☓:import static hoge6.ClassName.method()
○:import static hoge6.ClassName.method
→これは変数も同様
補足
そもそも static インポートとは?
→外部の static メンバの呼び出しを簡略化するための方法
例えば以下
○static インポートなし
return Math.pow(4, 3)
○static インポートあり
import static java.lang.Math.pow;
return pow(4, 5)
Java バイトコードを実行するには「JVMを含む実行環境(ランタイム環境)」が必要
引っかかりポイント:コンパイルを通したクラスファイルを用意しておけばコンパイラは必要ない
質問が Java ソースコードならばコンパイラは必要だが、バイトコードなら必要ない
補足
Java バイトコードとは?
Java ソースコードをコンパイルした後に生成される中間のコード
つまるところ既にコンパイル済みなコードを示しているため、コンパイラは必要ない、と覚える
switch 文に使用できるのは byte,short,int,charでかつこれらの参照型+String型
引っかかりポイント:問題の switch 文の case 文の型に注意(数値なのか、単文字なのか、文字列なのか)
羅列すると以下
プリミティブ型:byte, short, int, char
参照型:Byte, Short, Interger, Character, String
修飾子のアクセス可能範囲の順序は[public > protected > 無記載 > private]
引っかかりポイント:なんとなく 無記載 > protected と考えることを注意
protected があまり見ないのと文字の感じから勘違いしてしまうのだろうか…
アクセス範囲は以下
| アクセス修飾子 | アクセス範囲 |
|---|---|
| public | 制限なし |
| protected | 同じクラスかつサブクラスからのみ |
| 無記載 | 同じクラスかつ同じパッケージからのみ |
| private | 同じクラスからのみ |
連想配列の2列目?は再初期化が可能
引っかかりポイント:以下に例を示すがコンパイルエラーとはならない
以下のようなことができる
// 配列が3つ作られ、その中に長さが5の配列が作られる
int[][] array = new int[3][5];
// こんなイメージ → [new int[5], new int[5], new int[5]]
// それを初期化する
// 小さいものも
array[0] = new int[1];
// 大きいものも
array[1] = new int[7];
// 結果
// [new int[1], new int[7], new int[5]]
暗黙の型変換は、変換後に「データの欠損がないこと」が条件
引っかかりポイント:変換後データの欠損がない値があったとしてもコンパイルエラーとなる
int in = 5;
double do = 10.5;
// int → double は可能 → データの欠損がないから
int i = do;
// double → int は不可 → データの欠損があるため(0.5 が見えなくなる)
double d = in;
// 以下の場合でも NG(あくまで「データ欠損の可能性がある」型変換は暗黙では許容しない、ということ)
double dou = 10.0
int n = dou;
検査例外には throws 宣言が必ず必要
引っかかりポイント:投げっぱでよいかどうかではない
// 検査例外:明示的に例外を投げた時なども含め、必ず Throws 宣言が必要で呼び元は catch も必要
public void hoge() throws Exception{
return new Exception()
}
// 非検査例外:Throws 宣言は必要なく、なんだったら catch する必要もない
public void hoge() {
return new RunTimeException()
}
arraycopy の 5 番目の引数は見た目通りではない
引っかかりポイント:多分自分の覚え方が間違っていた疑惑
arraycopy(array1, x, array2, y, z)
// array1:コピー元の配列
// x:コピー元のどこからコピーを開始するのか
// array2:コピー先の配列
// y:コピー先の配列のどこからコピーするのか
// z:"コピー元の"コピーする文字数を指定する
暗黙の型変換を行うためのプリミティブ型の関係性を理解する
引っかかりポイント:整数型は整数型同士でも必ず暗黙の型変換ができるわけではない
まあそりゃちゃんと理解していればわかることでしょうが…
例えば整数型だったら以下のプリミティブ型がある。
byte,short,int,long
これらは持てるサイズが異なり、その大きさの順が以下
byte < short < int < long
前述したとおり、暗黙の型変換は**「データの欠損が起こり得ない」場合にのみ正常である。
となると、short 型のサイズより大きい値を持つ int → short は「データの欠損」**が起こり得ることになる。
関係性は以下に記述する。
整数型
byte < short < int < long
浮動小数点型
float < double
char(変換可能な型)
char → int, long, float, double(おそらく byte のサイズで収まる文字コードが存在しないため)
変換不可
double, boolean