しぐれがき

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

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

f:id:shiguregaki:20170314004305j: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(日) 試験日

進捗

先週も出張が多い中、今日でオラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集の巻末の演習問題以外をすべて解き切りました。

点数は以下となりました。
1章 Javaの基本:10/16(62.5%)
2章 Javaのデータ型の操作:10/13(76.9%)
3章 演算子と決定構造の使用:17/20(85.0%)
4章 配列の作成と使用:17/20(85.0%)
5章 ループ構造の使用:20/27(74.0%)
6章 メソッドとカプセル化を操作する:33/37(89.1%)
7章 継承の操作:26/34(76.4%)
8章 例外の処理:31/41(75.6%)
9章 Java APIの主要なクラスの操作:16/23(69.5%)
全体 :180/231(77.9%)
1章を除き合格点である65%は達成できています。
1章は変数のスコープや{・・・}のひっかけなどにことごとくミスしてしまいました。
変数スコープや変な改行などには気を付けたいと思います。

また、間違えた問題の解き直しも終わったので、明日からは模擬試験に入りたいと思います。
模擬試験はオラクル認定資格教科書 Javaプログラマ Silver SE 8オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集の巻末にそれぞれあるので、2回分きちんと時間をはかって解きたいと思います。
これまで章ごとに演習問題をしてきたので、すべてまぜこぜで出てくると確認観点が分からず間違いやすくなると思います。
それぞれの構文や問題文の内容から確認観点を読み取る練習もしたいと思います。

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

演習問題を解くことで、気を付けるべきポイントが少しずつわかってきました。
自分の整理もかねて、Java Silver資格取得に向けて気を付けるポイントをまとめたいと思います。
※前回の日記(こちら)のアップデートになります。

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

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

注意ポイント
1 main関数の記述(補足)
2 ソースファイルにpublicクラスは1つしか定義できない
3 識別子の1文字目は数字はNG
4 アンダースコアはリテラルの先頭,末尾,記号の前には使えない
5 try~catchも1スコープ 変数定義には気を付けること
6 同じ変数名の変数が複数定義された場合、一番内側のブロックで定義された変数が優先的に使用される。
つまり、int set(int i){i=i;}では引数のiに同iを代入しているだけとなる。
7 staticとpublicはどちらも修飾子のため入れ替えても問題ない
8 静的インポート:static変数やstaticメソッドをクラス名を指定せずに使用するためのimport機能
import static パッケージ名.~には注意

メイン関数の記述

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するときはキャストしないとコンパイルエラーになる
7 比較式は左結合で実行
*1では、((i < 0) && (j < 0)が判定後、その判定結果と|| (k < 0)が判定される。

配列の初期値

配列はインスタンス化(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で配列の長さになる
6 拡張for文for(変数宣言 : 配列名){・・・}で配列には[]は不要

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

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

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

アクセス修飾子

<コンパイルエラーとなること>
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の継承はinterfaceに対してのみextends可能
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 キャストの無理やりな明示的な変換はコンパイルは通るが、実行時エラーとなる
19 getClass()は参照しているオブジェクトのクラス名が出力される
20 (キャスト)クラス.メソッド;は右から実行される
したがって、(キャスト)の対象はクラス.メソッドの戻り値に対する型変換となる
21 staticメソッドは「super.メソッド名()」の形式では呼び出せない。
「クラス名.メソッド」を使うこと

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メソッドの引数に不適切な値を入力すると、コンパイルは通るが実行時エラーが発生する。
5 Trowableクラスの主なメソッド
void printStackTrace():エラーのスタックトレースの表示
String getMessage():エラーメッセージを取得する
6 親と子のthrowsの取り扱いの違い
・親がthrows定義→子はthrowsつけなくても問題ない
・子がthrows定義→親にthrowsが定義されていないとコンパイルエラー

まとめ

テキストと問題集での知識定着ができたので、明日からは模擬試験に入りたいと思います。
模擬試験はオラクル認定資格教科書 Javaプログラマ Silver SE 8オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集の巻末にそれぞれあるので、2回分きちんと時間をはかって解きたいと思います。
あと残り5日ですが、頑張ります!

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

以上!

*1:i < 0) && (j < 0) || (k < 0