しぐれがき

これまで挑戦したことの備忘録です

【実践】Java Silverを1か月で取得する! その3

f:id:shiguregaki:20170305160851j:plain
こんにちは、しぐれがきです。

前々回の日記(こちら)で立てたスケジュールに従って勉強しています。

目次

補足:勉強スケジュール

勉強方法:4ステップ

ステップ1:知識詰め込み

オラクル認定資格教科書 Javaプログラマ Silver SE 8を一気読みします。
このとき、演習問題を解かずにとにかくスピード勝負で知識を詰め込みます。
不明なところ、重要そうなところは付箋でメモを残しておきます。

ステップ2:知識定着させる

再度、オラクル認定資格教科書 Javaプログラマ Silver SE 8を読み直します。
このときは知識の定着を心がけます。
演習問題をしっかり解き、間違えたところは解説ページのみならずそこを説明している個所に戻ります。
また、本だけでは解決できない問題はググるなりして、解決しておきます。
解決した内容は付箋なりでメモをきちんと残しておきましょう。
(私はこのときは本に直接書いてしまいます。)

ステップ3:問題集を解く

オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集を使って問題演習をします。
ここで間違えたときは問題集の解説にとどまらず、オラクル認定資格教科書 Javaプログラマ Silver SE 8にも立ち戻って確認をします。
ここでも本だけでは解決できない問題はググるなりして、解決しておきます。
解決した内容は付箋なりでメモをきちんと残しておきましょう。

ステップ4:前日に参考書を一気に読み直す

今回の資格はプログラムを見て解答するタイプですので、あまり効果はないかもしれませんが、知識問題の時はこれは効果絶大です。
いわゆる詰め込み学習で勢いで解いていくスタイルです。
前日にオラクル認定資格教科書 Javaプログラマ Silver SE 8を演習問題を除き一気に読み直すことにします。

勉強スケジュール

日程 ステップ
2017/2/15(水)-2/19(日) ステップ1
2017/2/20(月)-3/1(水) ステップ2
2017/3/2(木)-3/17(金) ステップ3
2017/3/18(土) ステップ4
2017/3/19(日) 試験日

進捗

先週は出張が多い中でも、どうにか目標であったステージ2は達成できました。
※なかなかブログを更新できなかったですが。。。

日程 ステップ 進捗
2017/2/15(水)-2/19(日) ステップ1 完了
2017/2/20(月)-3/1(水) ステップ2 完了
2017/3/2(木)-3/17(金) ステップ3 着手中
2017/3/18(土) ステップ4 未着手
2017/3/19(日) 試験日 -
現在ステージ3を着手中です。
オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集を購入しました。


Java Silver資格取得に向けて気を付けるポイント

演習問題を解くことで、気を付けるべきポイントが少しずつわかってきました。
自分の整理もかねて、Java Silver資格取得に向けて気を付けるポイントをまとめたいと思います。

Javaプログラムのコンパイルと実行

注意ポイントは下記です。

注意ポイント
1 main関数の記述(補足)
2 ソースファイルにpublicクラスは1つしか定義できない
3 識別子の1文字目は数字はNG
4 アンダースコアはリテラルの先頭,末尾,記号の前には使えない

メイン関数の記述

main関数の記述は下記
public static void main(String args){...}

<コンパイルエラー>
stringが小文字(Stringは大文字であるべき)
・戻り値がない/void以外(戻り値はvoidであるべき)
・引数なし(Stringがあるべき)

<実行時エラー>
Stringのがない
staticがない
Mainのようにmain関数が大文字始まり

<注意>
・引数名はargsでなくてもOK
・引数はString argsでも可
public static void main(String args){...}とは別のmain関数をオーバーロードすることは可能(実行はされないが)

1次元配列

注意ポイントは下記です。

注意ポイント
1 配列の添え字は0から n=new int[3]に対してn[0]-n[2]はアクセスできるが、n[3]アクセスは実行時エラーとなる
2 配列の初期値(補足)
3 ArrayList<データ型>のデータ型は参照型のみ有効。
基本データ型(intやdoubleなど)は使用できない。ラッパークラス(IntegerやDoubleなど)を使うこと
4 < >のデータ型が左右で会わない->ArrayListコンパイルエラー
5 < >で指定された以外のデータ型を格納->ArrayListコンパイルエラー
6 ArrayListジェネリックスを使用しないこともできるが、.getするときはキャストしないとコンパイルエラーになる

配列の初期値

配列はインスタンス化(newしたとき)に以下の値に初期化される。

データ型
byte,short,int,long 0
float,double 0.0
char \u0000
boolean false
参照型 null

演算子と分岐文

注意ポイントは下記です。

注意ポイント
1 インクリメントとデクリメントの前置き(++a,--a):先に計算してから代入
インクリメントとデクリメントの後置き(a++,a--):代入後に計算
2 newを使用しないStringはすでに同じ文字列があったら参照先を同じにする。
newを使用すると、同じ文字列でも別々に定義も可能
3 StringStringBuilderの仕様の違い<文字追加>
String:新しい文字列として追加された文字列の参照先を定義する
StringBuilder:既存の参照先の文字列に追加する
4 nullは小文字 大文字は予約文字ではない
5 Switch文の式の評価結果のデータ型はbyte,char,short,int,enum,Stringのみ有効
Switch文の式の内では変数定義できない->コンパイルエラーする

繰り返し文と繰り返し制御文

注意ポイントは下記です。

注意ポイント
1 while(false)コンパイルエラー
2 for(式1;式2;式3)で式1は文である必要がある。
例えば、for(i1;式2;式3)コンパイルエラー
for(i1++;式2;式3),for(i1=0;式2;式3)などはOK
3 for(式1;式2;式3)の式は省略できるが、;は省略できない
無限ループもfor(;;)とする。
4 繰り返し文以外のところでcontinueコンパイルエラー
5 配列の長さを求めるlengthは()はいらない array.lengthで配列の長さになる

クラス定義とオブジェクトの生成・使用

注意ポイントは下記です。

注意ポイント
1 オーバーロードは戻り値による区別はない
2 staticメンバはクラス名で呼び出すことができる(クラス名.static変数名,クラス名.メソッド名)
インスタンス化済みのオブジェクト名でも呼び出しも可能
3 アクセス修飾子について(補足)
4 引数の型に注意
・データ型:値をコピーしているだけなので、返値などで値もらわないと引数の値は変わらない
・参照型:参照先を渡すので、実行元に戻っても引数の値は変わっている。
5 パッケージ化したクラスはクラス名単体で扱えなくなる
パッケージ名に対応するディレクトリ構成にする必要がある->構成が違うと実行時エラーとなる
6 importでのワイルドカードはパッケージ名には使用できない->コンパイルエラーとなる

アクセス修飾子

<コンパイルエラーとなること>
protected,privateはクラス宣言時に使用不可
・ローカル変数には修飾子は使用できない

継承とポリモフィズム

注意ポイントは下記です。












注意ポイント
1 extendsできるのは1つだけ->コンパイルエラーとなる
2 finalクラスをextends->コンパイルエラー
finalメソッドをおーばライド->コンパイルエラー
3 finalの位置はアクセス修飾子の次に記載する
[アクセス修飾子] final 戻り値の型 メソッド名(引数リスト)
4 this()はコンストラクタ定義の先頭につける->つけないとコンパイルエラー
5 super()の落とし穴(補足)
6 this(),super()の呼び出しはコンストラクタ定義の先頭にする
7 abstractは戻り値の前に入れる->異なる位置に入れるとコンパイルエラー
[修飾子] abstract クラス名{...}
[修飾子] abstract 戻り値 メソッド名(引数リスト);
メソッド名(引数リスト)の次に{}はいらない
8 interfaceに宣言できる変数はstaticな定数のみ->初期化しないとコンパイルエラー
※強制的にpublic static final修飾子がつけられす->public以外の変数はコンパイルエラーとなる
9 interfaceでのメソッドは以下の3つ
・抽象メソッド(暗黙でpublic abstractがつくのでpublic以外の修飾子はコンパイルエラーになる)
・デフォルトメソッド([修飾子] default 戻り値 メソッド名(引数リスト)で定義)
・staticメソッド
10 デフォルトメソッドではjava.lang.Objectクラスで提供されているequals(),hashCode(),toString()はオーバーライドできない
11 extendsとimplementsを両方書くときはextendsを先に書くこと->コンパイルエラーになる
12 interfaceの継承はextendsで実装可能
さらに、interfaceは複数のinterfaceを継承(extends)することができる。
※具象クラスや抽象クラスは1つしか継承(extends)できない
13 演算対象(オペランド)の最少はint型
short s1=10;
s1 = s1 + 1;->(s1 + 1)はint型となるためコンパイルエラーになる
s1 = (short)(s1 + 1);->キャストしないといけない
14 オペランドの変換はdouble型->float型->long型->int型の順に変換していく
15 instance ofは右辺と左辺が継承関係でないとコンパイルエラーになる ※0以外の値が変えるとかでないのに気を付ける
16 Autoboxingは暗黙の型変換を行わない
double d1 = 10;->暗黙の型変換で10が10.0と変換されている
Double d2 = 10;->暗黙の型変換が行われないため、コンパイルエラー
17 親子関係で気を付けること
・アクセス修飾子はのスーパークラスに比べて同じかより広い範囲のもの
・戻り値はスーパークラスのメソッドと同じかその型のサブクラス
スーパークラス側がprivateになっていないか(publicである必要あり)
・親クラスでコンストラクタがオーバーライドされていないか(super()の落とし穴)
18 キャストの無理やりな明示的な変換はコンパイルは通るが、実行時エラーとなる

super()の落とし穴

明示的に定義しないと親クラスのコンストラクタはsuper()が実行される。


Java APIの利用

注意ポイントは下記です。

注意ポイント
1 StringBuilderは必ずnewによる生成が必要
StringBuilderでのequals()の比較はできない※toString()でString型に変換して比較する
2 異なるラッパークラス間でのequals()はfalseになる
Integer val1 = 150;
Long val2 = 150;
val1.equals(val2)
->false
val1.equals(val2.intValue())->true
3 クラス名をprintlnしたときはtoString()メソッドが呼ばれる
4 paeseメソッドの引数に不適切な値を入力すると、コンパイルは通るが実行時エラーが発生する。
5 <実行時エラーのパターン>
・日付の範囲外設定->DateTimeException例外
・日付のフォーマットが異常->DateTimeParseException例外
・asListで生成した固定リストに対し、削除や追加する->UnsupportedOperationException例外

例外処理

注意ポイントは下記です。

注意ポイント
1 catchする例外の順番はサブクラス->スーパークラスの順に書く->コンパイルエラーとなる
2 throwsthrowは別物
throws:メソッドにつける、エラー発生時に親クラスに投げる
throw:任意の場所で例外を発生させられる
3 例外のオーバーライド時の注意
・親クラスの例外と同じかサブ例外
・RuntimeExceptionとそのサブクラスは継承を意識せずスロー可
スーパークラスのメソッドにthrowsがあっても、サブクラス側でthrowsをつけなくともOK
3 クラス名をprintlnしたときはtoString()メソッドが呼ばれる
4 paeseメソッドの引数に不適切な値を入力すると、コンパイルは通るが実行時エラーが発生する。

まとめ

上でまとめたポイントをもとにステップ3として演習問題を解いていきます。
ステップ3の納期である3月17日まで残り2週間弱ありますが、最近出張やイベントが多いので計画的に進めていきたいと思います。
引き続き頑張っていきます!

※1ヶ月程度の知識でいろいろ注意するポイントをまとめましたので間違いがある可能性がありますがご容赦ください。

以上!