しぐれがき

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

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

f:id:shiguregaki:20170319173801j:plain
Javaプログラマ SE8 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 パッケージ名.~には注意
9 0除算について
整数型に対しての実行時エラーになるが
double型の0除算は以下のような振る舞いをする
dnum > 0 dnum/0Infinity
dnum = 0 dnum/0NaN
dnum < 0 dnum/0-Infinity

メイン関数の記述

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)が判定される。
8 可変長変数は配列定義と同じ
public static void main(String... v){・・・}
public static void main(String[] v){・・・}と同表現になる

配列の初期値

配列はインスタンス化(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文の式の内では変数定義できない->コンパイルエラーする
6 演算子の優先順位(補足)

演算子の優先順位

種類 演算子 結合規則
1 単項演算子 ++ -- + - ~ !
2 算術演算子 * / %
+ -
3 シフト演算子 << >> >>>
4 比較演算子 < > <= >= instanceof
== !=
5 ビット演算子 &
^
|
6 論理演算子 &&
||
7 三項演算子 ?:
8 代入演算子 = *= /= %= += -= <<= >>= >>>= &= ^= |=
※優先度が高い順

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

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

注意ポイント
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.メソッド名()」の形式では呼び出せない。
「クラス名.メソッド」を使うこと
22 基本データ型の暗黙型変換(補足)

super()の落とし穴

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


基本データ型の暗黙型変換

基本データ型の型変換は広いほうへの代入はOK


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プログラマ SE8 Silverの資格試験に向けて勉強する中で同じところ、あいまいなところがいくつかあったので直前の知識の整理のために本記事をまとめました。
個人的に間違えたところを中心にまとめていますが、結構間違いやすいところって共通しているのではないかと思います。
Javaプログラマ SE8 Silverの資格試験を目指している方に役立てば幸いです。

以上!

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