Java Silver(1Z0-808-JPN: Java SE 8 Programmer I)の受験申込がようやく完了したので、そろそろ試験勉強を始動。買ってきたテキストは1冊のみ「Java SE 8 Silver 問題集」(通称、黒本)を使用します。
元々9月に受験する予定だったのですが、学校の都合で10月中旬に変更しました。
試験直前に見返す用のメモがあるので、せっかくなら記事にしていつでも読めるようにしとこと思ってこの記事を書いています。自分用のメモなので、記録として残しておきます。
内容は黒本で出来なかったところや躓いた部分を抜粋しているだけのもの。
CONTENTS
- Java の基本
- Java のデータ型の操作
- 演算子と判定構造の使用
- 配列の作成と使用
- ループ構造の使用
- メソッドとカプセル化の操作
- 継承の操作
- 例外処理
- Java API の主要なクラスの操作
- // ***** String ***** //
- // ***** String Object methods ***** //
- // ***** 定義済み文字クラス ***** //
- // ***** StringBuilder ***** //
- // ***** StringBuilder Object method ***** //
- // ***** λ ***** //
- // ***** LocalDateTIme ***** //
- // ***** LocalTime ***** //
- // ***** Collection ***** //
- // ***** thread safe ***** //
- // ***** == と equals( ) ***** //
- // ***** コンスタントプール ***** //
Java の基本
// ***** package ***** //
- 名前空間を提供。
- アクセス制御機能。
- クラスの分類を可能にする。
- どのクラスもデフォルトで無名パッケージに属する(パッケージに属さないクラスは無い)
// ***** 省略可能なパッケージ宣言 ***** //
- java.lang パッケージの宣言
- 同じパッケージに属するクラスのインポート宣言
// ***** Javaコマンド ***** //
java クラス名 引数 引数 引数……⇒この引数をコマンドライン引数、起動パラメータと呼ぶ
// ***** リテラル表記 ***** //
2進数:頭に「0b」をつける
8進数:頭に「0」をつける
16進数:頭に「0x」をつける
// ***** アンダースコア「_」の付け方 ***** //
・リテラルの先頭と末尾はNG
・記号の前後はNG
・アルファベットの前後はNG
// ***** 参照変数の命名規則 ***** //
・使える記号はアンダースコア_とドル$ だけ
・数字から始めてはいけない
Java のデータ型の操作
// ***** Switch文の条件式にできない型 ***** //
- long
- float
- double
- boolean
// ***** case値について ***** //
・case文は値が確定できないとだめ(コンパイル時に値が確定している必要がある)使用できる値は、以下。
- 条件式の戻り値と同じ型か互換性がある。
- 定数や計算式。
- nullではないこと
・case文はbreak; がないと、default までも行ってしまう。
・ガーベジコレクション:どこからも参照されなくなったインスタンス。nullを代入したタイミングが代表的。
・「真偽値式 ? true : false」
// ***** 型の範囲 ***** //
byte | -128 ~ 127 |
short | -32768 ~ 32707 |
float< double | |
int < long |
演算子と判定構造の使用
追記予定
配列の作成と使用
・配列の参照変数を宣言するときに、要素数は宣言できない。
・配列のインスタンスを生成するときは、要素数を宣言しないといけない。
・配列の時は「null」はリテラルとして普通に入って、表示もできる。
・nullにlengthは無い。要素数を数えようとするとNullPointerException
// ***** 配列の要素数 ***** //
(1)要素数は整数値。⇒浮動小数点数はダメ。long型もダメ。
(2)1次元目の要素数を省略することはできない
ex. ) int[ ][ ] array = new int[ ][3]; ⇒コンパイルエラー
(3)次元数は一致させる。
ex. ) int[ ] array2 = new int[4][ ]; ⇒コンパイルエラー(宣言は1次元、インスタンスが2次元になっている)
配列インスタンスの生成、宣言、初期化
int[ ] array = { 2, 3 };
int[ ] array = new int[ ]{ 2, 3 };
⇨ error ) new int[2]{ 2, 3 };
⇨ newと{ } を同時に使うとき、要素数は自動算出されるので[ ]に要素数を指定できない。
要素数ゼロの配列インスタンス
int[ ] array = { };
int[ ] array = new int[0];
多次元配列の生成、宣言、初期化
int[ ][ ] array = { { 2, 3 }, { 4, 5 } };
int[ ][ ] array = new int[ ][ ]{ };
⇨ error ) int[ ][ ] array = new int[ ]{ };
int[ ][ ] array = { };
int[ ][ ] array;
array = new int[ ][ ]{ };
配列のコピー ( clone )
int[ ] arrayA = { 1, 2, 3, 4 };
int[ ] arrayB = array.clone( );
⇨ 同じ要素の配列の複製が作れるが、複製したインスタンスは別なので、( arrayA == arrayB ) → false となる。
配列の一部コピー ( arraycopy )
System.arraycopy( arrayA, 1, arrayB, 0, 4 )
⇨ arrayA の1番目から arrayB の0番目へ, 4個の要素数をコピーする。
ループ構造の使用
- for文の初期化文で複数の変数を宣言できるが、型は全て同じ必要。
- forの初期化で宣言した変数は、forブロックの中でのみ有効。forの外で使おうとするとエラーになる。
- 更新文は、繰り返し処理が終わってから実行される。
for ( int i=0, j=1, i<3, i++; ) {
⇨ forで複数OKなのは、初期化文と更新文のみ。条件文は1個だけ。
error ) ⇒ for ( int i=0, j=0, i<3, j<5, i++ )
ok ) ⇒ for ( int i=0, j=0, i<3 && j<5, i++ )
// ***** 無限loop ***** //
- true
- 条件式を省略
- インクリメントしない
while ( true ) { }
for ( int i=0; true; i++ ) { }
for ( int i=0; ; i++ ) { }
for ( int i=0; i<5; ) { }
continue // 残りの繰り返し処理をスキップする
メソッドとカプセル化の操作
// ***** 可変長引数 ***** //
void sample ( int… num ) { }
- 配列扱い
- 異なる型はまとめられない
- 引数リストの最後に書く
// ***** static ***** //
- staticなメンバはインスタンスの有無に関わらず使える。
- staticでないメンバはインスタンスがないと使えない。
- staticなメソッドからstaticではないメソッド(未インスタンス化)にアクセスしようとすると、存在しないものにアクセスすることになり、エラー。
- staticなもの同士はインスタンスの有無に関わらず使える。
// ***** オーバーロード ***** //
- 引数の「数」「型」「順番」が異なる
- アクセス修飾子は含まれない
// ***** コンストラクタ ***** //
コンストラクタのアクセス修飾子は、どのクラスからインスタンスかするかの制限をかけるために使われる。
- voidを含む戻り値型を書けない。
- メソッド名はクラス名。
- newと一緒にしか呼べない。
- { 初期化ブロック } を使えば、オーバーロードされた全てのコンストラクタで共通の前処理が宣言できる。
- デフォルトコンストラクタは、他のコンストラクタが1つも定義されなかったときのみ自動で作られる。
- 明示的にコンストラクタを作ったときは、デフォルトコンストラクタが作られないので注意。
this ( ) | そのクラスのコンストラクタ |
super ( ) | 親クラスのコンストラクタ |
継承の操作
// ***** label ***** //
break; continue; の時に、制御を移す場所を自由に指定できる。ほぼ全部の箇所につけられる。
// ***** @Over ride ***** //
- シグニチャが同じ。
- 戻り値型が同じかサブクラス。
- アクセス修飾子は厳しくできない。
・オーバーライドしたメソッドは、元のメソッドよりも厳しいアクセス制限ができない。
⇨ ポリモーフィズムで、見かけの親クラスにあるメソッドが見えない下位クラスで制限されることになる。型さえ分かれば使えるはずなのに、実際には動作出来ないメソッドになってしまうから。
・ポリモーフィズムで、スーパークラスとサブクラスに同じ名前のフィールドがあるとき
⇨ どっちのフィールドを利用するかは、宣言した変数の型による。
・扱っている型で定義されてるもの以外のメンバはつかえない
// ***** 型変換 ***** //
ダウンキャストは自動でされないので、明示的に行う必要がある(互換性の保証)。
ex.) スーパークラス型→サブクラス型
ex.) インターフェース型→実装クラス型
A型の変数で扱っている参照を、B型の変数に代入しようとしたとき、Aクラスの定義にはBと互換性があるとの記述がない。
A a = new B ( );
B b = a;
⇒ コンパイラはA型の値をB型として扱えるか判断できず、コンパイルエラーになる。
⇒ B b = (B) a; と書くのが正解。
例外処理
例外処理 | |
IndexOutOfBoundsException | コレクション、配列、文字列の範囲外 |
ArrayIndexOutOfBoundsException | 配列の要素外 |
StringIndexOutOfBoundsException | 文字列の範囲外 |
ClassCastException | 継承関係や実現関係にないクラスにキャストしようとしてる |
IllegalArgumentException | 不正な引数を渡された |
IllegalStateException | オブジェクトを異常な状態のまま利用しようとしている、利用準備ができてない |
ExceptionInInitializerError | Staticイニシャライザの中でトラブル |
StackOverFlowError | 再帰呼び出しでスタック領域が足りなくなった |
NoClassDefFoundError | JVMがクラスファイルを発見できない |
AssertionError | 条件式で合致しないものがあった |
OutOfMemoryError | ヒープメモリ(インスタンス保存・クラス定義が保存されている領域)がいっぱいになった |
VirtualMachineError | JVMが壊れているか、動作継続リソースがない |
InternalError | JVMで何らかのエラー |
Java API の主要なクラスの操作
// ***** String ***** //
・immutable(不変)オブジェクト ⇒すでに与えられた文字列を変更するときは、新しいインスタンスを作る必要がある。
・メソッドチェイン ⇒Stringクラスのメソッドの多くは、新しく作られたStringインスタンスへの参照を返す。その新しい参照に対してさらにメソッドを呼ぶこと。
ex.) String str2 = str.substring (1, 3) .replace (“b”, “c”)
// ***** String Object methods ***** //
replaceAll( ) | 文字列置換。置換後の結果は、新しいStringインスタンスに格納。 |
charAt( ) | 引数で指定した位置の1文字を返す。文字番号は0から始まる。 |
indexOf( ) | 引数で指定した文字が文字列の何番目かを返す。文字番号は0から始まる。存在しなければ、-1を返す。 |
substring( ) | 引数で指定した範囲の文字列を抽出。文字と文字の間に線を引いて番号をふる。 |
trim( ) | 文字列の前後の空白(スペース、\t、\n、\r)を除去。文字間の空白は除去されない。 |
replace( ) | 文字列置き換え。char型とCharSequence型の2種類、両方の型の引数を同時には受け取れない。 |
length( ) | 文字数を返す。半角も全角も1文字扱い。 |
startsWith( ) | 文字列が引数で指定された文字から始まるか。返答値は真偽値。 |
endWith( ) | 文字列が引数で指定された文字で終わるか。返答値は真偽値。 |
split( ) | 文字列を分割。正規表現。 |
concat( ) | オブジェクト内部の文字列と引数の文字列を連結。 |
+演算子 | 数値も文字列もそのまま連結できる。※数値は左から実行。 |
ex. ) str = 10 + 20 + “a”; →「30a」 |
|
ex. ) str = “a” + 10 + 20; →「a1020」 |
// ***** 定義済み文字クラス ***** //
「. 」任意の文字 | |
「\d」数字 | 「\D」数字以外 |
「\s」空白文字 | 「\S」非空白文字 |
「\w」単語構成文字 | 「\W」非単語文字 |
・参照を持たない意味のnullは、”null”文字列に置き換えられて文字列として連結される。
// ***** StringBuilder ***** //
・変更可能な文字列を扱うクラス。(Stringだと、”a” + “b” + “c” で5つもインスタンスが作られてしまう。「a」「b」「c」「ab」「abc」)
・StringBuilderはデフォルトで「文字列+16文字分」のバッファを持ってる
// ***** StringBuilder Object method ***** //
append( ) | 既存の文字列の後ろに追加。引数ほぼ何でも受け取れる。プリミティブ型は全て文字列に変更される。 |
ex. ) sb.append(true); →真偽値も受け取れ、文字列として扱われる。 「”true”」 |
|
ex. ) sb.append(“abcde”, 1, 3); →文字列とその読み込む範囲が送られている。 「bc」 |
|
insert( ) | 文字列を引数で指定した場所に挿入。 |
delete( ) | 引数で指定した範囲の文字列を削除。 |
deleteCharAt( ) | 引数で指定した位置の文字を削除。 |
reverse( ) | 文字列を反転させる。 |
// ***** λ ***** //
・ローカル変数と同じ名前の変数は、ラムダ式内で宣言不可。
・functionパッケージの Predicate<T>:断定。引数を受け取り、booleanを返す。
{ } あり
→複数の処理を記述できる
→戻り値を戻すにはreturnが必要
{ } なし
→処理1つのみ
→戻り値を戻すにはreturnを書けない
// ***** LocalDateTIme ***** //
・Calendarは0から始まるが、LocalDateTImeは1から始まる
・immutable
Durationクラス | |
between ( ) | 2つの日時の差。 |
toHours ( ) | 時間の差。 |
Periodクラス | |
plusDays ( ) | 日を足す。 |
until ( ) | 日付の差を計算する。 |
// ***** LocalTime ***** //
・24時間で扱うが、午前午後の区別なし
of ( ) |
now ( ) |
parse ( ) |
plusHours ( ) |
// ***** Collection ***** //
コレクションAPIは、オブジェクトであればどんな型の集合でも扱える。
list.add( ); の引数は「new Object( )」「”test”」「new Integer( );」などどれでも可能なので、<ジェネリクス>で型を指定する方法が導入された。
ex. ) ArrayList<String> list = new ArrayList<String>( );
ArrayList | |
add( ); | 末尾に要素を追加。 |
set( ); | 要素を置き換える。 |
remove( ); | 引数で受け取ったObject型インスタンスと同値のもの(同値=equals( ) がtrueを返すもの)を削除。複数要素が該当する場合、最初に合致するものだけが削除される。 |
// ***** thread safe ***** //
並行処理をしたときに意図しない結果になることを防ぐ機能が備わっているか。
ある処理を行いながら他の処理もできるため、処理が終わるのを待つ必要がない。
片方のthreadからインスタンスを変更している最中に、他のthreadからさらに変更されたときに整合性が取れるか。
// ***** == と equals( ) ***** //
・等値( == )
⇒完全に同一の存在、同じアドレスを指している
・等価( equals )
⇒同じ内容、同じアドレスを指していなくても良い。クラスにオーバーライドで定義された内容による。x. equals( null ) → falseを返す
// ***** コンスタントプール ***** //
同じ文字列リテラルを使っているStringインスタンスは、参照が使いまわされる。(定数値としてインスタンスとは異なる定数用のメモリ空間に作られる。Stringインスタンスは多用されるので、特別扱いしている)
⇒コンスタンスプールが使用されるのは、Stringに”リテラル” を直接代入してインスタンス化したときのみ。
String a = ” sample “;
String b = ” sample “;
⇒同じリテラルなので、コンスタントプールの仕組みによって、同じインスタンスが使いまわされる。
String a = new String( “sample” );
String b = ” sample “;
⇒aはインスタンス用のメモリ空間のStringインスタンスの参照が入る
⇒bはコンスタントプールによる定数用メモリ空間のStringインスタンスの参照が入る
・Stringクラスは、文字列リテラルが同じなら、equals( ) はtrueを返す。
・Stringは、( == ) で同じ参照が入っているかを判断し、( equals ) で同じリテラルかどうかを判断する。