Java Silver試験が迫っており、最後の一週間しか時間がない!
そんなあなた。
試験合格に向けて、Java Silver黒本で覚えるべき重要なポイントをしっかり押さえましょう。
試験に出題されやすく忘れやすいトピックを中心に、暗記用チートシートを用意しました。
(まだ未完成ですが、役に立つ箇所もあるはず。という思いで公開しています)
『JavaSilverの受験直前で効率よく勉強するには?』
こんな疑問に答えます。
引っ掛かりやすいところ
初期化しないとコンパイルエラーになるケース
- ローカル変数の初期化
- finalのインスタンス変数の初期化
- finalのクラス変数(static)の初期化
初期化しなくてOK(デフォルト値が代入)のケース
- クラス変数(nullで初期化)
- インスタンス変数(nullで初期化)
- 配列(宣言した型のデフォルト値で初期化)
デフォルト値の例
- 整数(int/short/byte/long:0
- 浮動小数点数(float/double): 0.0
- 文字(char) :\u0000
- 真偽(boolean):false
- 参照型(String/配列/クラス):null
NullPointerExceptionにならないケース
- printlnメソッドにnullを渡したとき
System.out.println(null); ”null”と表示される
NullPointerExceptionになるケース
-
switch文でnullを評価したとき
条件はハッシュコードなのでnullを渡すとNullPointerExceptionとなる - 値がnullの参照型変数(クラス変数など)内のフィールドやメソッドを参照したとき
スコープ
スコープは変数やメソッドがどこからアクセス可能かを示すもので、コードを理解するための重要
- フィールド変数とメソッドの引数が同じ名前の場合
インスタンス変数にアクセスする際にはthisを付ける - スコープを省略した場合
同一パッケージ内からのみアクセス可能 - ラムダ式内の場合
宣言したメソッドのローカル変数へアクセス可能
ただし、メソッド内でローカル変数の値変更はNG(実質的にfinalでないとダメってこと)
引っ掛かりやすいところを色々と書きましたが、基本は黒本です。
筆者の場合、JavaSilverとGold(SE11)ともに黒本のみで合格いたしました。
かなり手厚く解説が書いてあります。
徹底攻略Java SE 11 Silver問題集[1Z0-815]対応
徹底攻略Java SE 11 Gold問題集[1Z0-816]対応
OracleJavaGoldの勉強方法・勉強時間・参考サイト♪
演算子
- インクリメント演算子
後置インクリメント:代入後に増加する
// bの値はインクリメント前の5 int a = 5; int b = a++;
前置インクリメント:代入前に増加する
// bの値はインクリメント後の6 int x = 5; int y = ++x;
基本データ型と文字列の操作
プリミティブデータ型と演算子
- 変数のプリミティブデータ型同士の型変換に注意が必要。広い方から狭い方への型変換はキャストが必要
- リテラルのプリミティブ型の演算は大きい方にキャストされる(int+LongならLong+Longとなる)
String型
- Stringはイミュータブル(変更不可)。新しい文字列を作成すると、元の文字列は変更されず、新しい文字列が作成される
- String型は参照型だがプリミティブ型のように代入できる
例)下記は両方ともsにabcが代入される String s = "abc"; String s = new String("abc")
メソッド
- int length()
文字列の長さを返却 - boolean equals(Object anObject)
同じ文字列ならtrue、そうでないならfalseを返す - String substring(int beginIndex, int endIndex)
beginIndexからendIndexまでの部分文字列を返却
例)”abcde”の”bc”を取得するにはbeginIndexに1、endIndexに3を指定
要素で挟むイメージ
- String replace(char old, char new)
old置換対象の文字(列)をnew:置換後の文字(列)に変換する
public class ReplaceExample { public static void main(String[] args) { String originalString = "Hello, world!"; // 文字列内の一部を置換 String replacedString = originalString.replace("world", "Java"); System.out.println("Replaced String: " + replacedString); // 文字を置換 replacedString = originalString.replace('o', 'X'); System.out.println("Replaced String: " + replacedString); } }
Replaced String: Hello, Java! Replaced String: HellX, wXrld!
String replace(CharSequence old, CharSequence new)もある
var(型推論)
- ローカル変数のみ使用可能(フィールド変数はNG)
- varに代入するジェネリクスの型を省略するとオブジェクト型になる
配列の操作
インデックスの範囲指定
- 配列や文字列などのインデックスは0から始まります。指定範囲は0からカウント
簡単だがボーっとしてたら引っ掛け問題があるので注意。過信は禁物。
配列
- 配列は参照型なので、インスタンスの生成が必要
int[] numbers = new int[5]; // numbers[0] から numbers[4] までの要素が0で初期化される
- 基本は初期化子{}は変数宣言と同時でないと使えない
明示的に配列数を指定すれば、あとから初期化子も使える
// 初期子で宣言と同時に初期化 int[] numbers = {1, 2, 3, 4, 5};
// 配列の宣言 int[] numbers; // 宣言後に初期化子を使用して初期化 numbers = new int[]{10, 20, 30, 40, 50};
インスタンスとメソッド
コンストラクタ
- 戻り値の型がないメソッド(クラス名と同名)
- コンストラクタチェイン
サブクラスのコンストラクタにはスーパークラスのコンストラクタを呼び出しsuper()が暗黙的に追加される
明示的に追加してもOKclass SuperClass { public SuperClass() { System.out.println("SuperClassのデフォルトコンストラクタ"); } } class SubClass extends SuperClass { public SubClass() { // 暗黙的に super() が追加されて、スーパークラスのデフォルトコンストラクタが呼び出される System.out.println("SubClassのデフォルトコンストラクタ"); } }
- 初期化子
全てのコンストラクタで共通する前処理を実行するために記述。コンストラクタが実行される前に実行される
Class Sample{ int a; String b; { a = 3; //コンストラクタが実行される前に実行 b = 4; } Sample(){ } }
スタティック
staticなメソッドやフィールドはクラス自体に関連づけられ、インスタンス化されたオブジェクトとは独立する(コンパイル時にメモリ割り当てされる)
- staticなフィールド変数(クラス変数)はインスタンス間で共有される
- staticなメソッドからインスタンス化されたメソッドを呼べない
- static初期化子
staticなクラスはstatic初期化子で初期化処理を実施(インスタンス化されれないのでコンストラクタがない)
Class Sample{ static int a; String b = "test"; static{ a = 3; //クラスのロード時に実行 } }
クラスの継承、インタフェース、抽象クラス
オーバーライド
同じメソッド名で下記の条件を満たすこと
- オーバーライドするメソッドのシグネチャ(メソッド名、引数の型と個数)は親クラスと一致させる
- オーバーライドするメソッドの戻り値の型は、同じクラスかサブクラス(共変戻り値)
- オーバーライドするメソッドのアクセス修飾子は親クラスのメソッドよりも緩いスコープでオーバーライド
- オーバーライドするメソッドは例外をスローする場合、同じクラスかサブクラスで例外をスロー
オーバーロード
同じメソッド名で下記の条件を満たすこと
- シグニチャ異なる(戻り値は関係ない)
インターフェース
- 抽象メソッドを持つ
- デフォルトメソッドを使うと実装できる
interface MyInterface { void abstractMethod(); // 抽象メソッド default void defaultMethod() { // デフォルトメソッド System.out.println("これはデフォルトメソッドです。"); } } class MyClass implements MyInterface { @Override public void abstractMethod() { System.out.println("抽象メソッドの実装"); } } public class Main { public static void main(String[] args) { MyClass obj = new MyClass(); obj.abstractMethod(); // MyClassで実装された抽象メソッド obj.defaultMethod(); // インタフェースのデフォルトメソッド } }
抽象クラス
- 抽象クラスは抽象メソッドだけでなく、具体的なメソッドも含むことができる
関数型インタフェース、ラムダ式
ラムダ式
抽象メソッドを1つだけ持つインタフェースはラムダ式が使用できる。
ラムダ式の基本構文
- パラメータなし
() -> { 処理内容 } - パラメータあり
(パラメータ) -> { 処理内容 }
(int パラメータ) -> { 処理内容 } - ()を省略:パラメータが1つの場合のみOK
パラメータ->{処理内容 } - {} を省略:処理内容が1文の場合のみOK
(パラメータ) -> 単一の式
※戻り値がある場合もOKだが、returnは記入できない - 戻り値あり
(パラメータ) -> { return 戻り値; } - メソッド参照(staticメソッド)
クラス名::メソッド名 - メソッド参照(Instanceメソッド)
インスタンス名::メソッド名
ラムダ式の例
Calculatorという簡単な関数型インターフェースを作成し、ラムダ式を使用してcalculateメソッドを実装
ラムダ式は(a, b) -> a + bで、2つの整数を受け取り、それらを足し合わせる処理
//例1: ラムダ式を使用して、2つの数値を足し合わせる
// インターフェース
interface Calculator {
int calculate(int a, int b);
}
public class LambdaExample {
public static void main(String[] args) {
// ラムダ式を使用してCalculatorインターフェースのcalculateメソッドを実装
Calculator addition = (a, b) -> a + b;
int result = addition.calculate(5, 3);
System.out.println("5 + 3 = " + result);
}
}
関数型インターフェース
java.util.functionパッケージに所属する関数型インターフェース
関数型インタフェースは抽象メソッドを1だけ持つ
- Consumer<T>:accept抽象メソッド
– 消費者。引数を受け取るが、結果は返さない。 - Supplier<T>:get抽象メソッド
– 供給者。引数は無く、結果を1つ返す。 - Predicate<T>:test抽象メソッド
– 断定。引数を受け取り、真偽値を返す。 - Function<T, R>:apply抽象メソッド
– 関数。引数を受け取って結果を返す。
後述するAPIのComparatorインタフェースもcompare抽象メソッドを持つ関数型インターフェース
API
Iterableインタフェース
Iterable
└継承:Collection
└─継承:List-実装:ArrayList
└─継承:Setー実装:HashSet、TreeSet
└─継承:Mapー実装:HashMap、TreeMap
メソッド
- default void forEach(Consumer<? super T> action)
要素数だけConsumer.acceptメソッドを実行
Collectionインタフェース
親クラス:Iterable
メソッド
- add(E e)メソッド
- clear()メソッド:
- default boolean removeIf(Predicate<? super E> filter)
指定された述語を満たすこのコレクションの要素をすべて削除
Listインタフェース
親クラス:Collection
実装クラス:ArrayList
要素の順番を持つ
重複要素OK
要素数の増減OK
Setインタフェース
重複要素NG
挿入順を持つ
親クラス:Collection
実装クラス:HashSet、TreeSet
Mapインタフェース
親クラス:Collection
実装クラス:HashMap、TreeMap
キーと値が対となった要素を持つ
キーの重複はNG
メソッド
- keyset()メソッド
- values()メソッド
- put(K key,V value)
指定された値と指定されたキーをこのマップで関連付けます(オプションの操作)。
マップにすでにこのキーに対するマッピングがある場合、古い値は指定された値に置き換えられます。
TreeMapとHashMapの違い(これは試験にでないかも)
- HashMapではキーの順番を保証しない
- TreeMapではキーを自動的にソートし、順序を保証します。
- HashMapはnullはOK
- TreeMapはnullがNG
- 両方ともキーの重複を許さない
- 両方とも利用できるメソッドは共通
- TreeMapでは、引数にComparatorを渡すことで、ソート規則を変更できる
ArrayListクラス
ざっくりいうと動的配列を実現するクラス
- Listインタフェースの実装
- スレッドセーフではない
要素数だけfor文を回し、内部でadd or removeメソッドを使うと途中で要素数が変動して実行時例外が発生 - of(E e)メソッド
staticメソッドなのでList.of(“a”,”b”,”c”)のように直接呼び出せる
immutable(変更不可)なので、add、remove、clear、sort等のメソッドを実行するとUnsupportedOperationException - set(int index, E e)メソッド
Arraysクラス
メソッド
- public static <T> List<T> asList(T… a)
指定された配列に連動する固定サイズのリストを返す
例)
List<String> stooges = Arrays.asList(“xxx”, “yyy”, “aaa”);
型パラメータ:T – 配列内のオブジェクトのクラス
パラメータ:a – リストの基となる配列
※固定長リストなので戻り値のListにaddメソッドなどを実行するとUnsupportedOperationException - public static int mismatch(配列1, 配列2)
2つの配列間の最初の不一致のインデックスを見つけて返す。
一致した場合は -1を返します。 - public static int compare(配列1, 配列2)
2つの配列を辞書順に比較します。
配列1と配列2を比較し、配列1が小さいなら負の整数を返す
配列1と配列2を比較し、両者が等しいなら0を返す
配列1と配列2を比較し、配列1が大きいなら正の整数を返す
他クラスのcompareメソッドも同じような仕様
Comparatorインタフェース
リストなどのコレクション内の要素をソートする際に使う関数型インターフェース
抽象メソッドはcompareメソッドのみのため、ラムダ式が適用できる。
compareメソッドの仕様
・1つ目の引数と2つ目の引数を比較し、1つ目が小さいなら負の整数を返す
・1つ目の引数と2つ目の引数を比較し、両者が等しいなら0を返す
・1つ目の引数と2つ目の引数を比較し、1つ目が大きいなら正の整数を返す
compareメソッドをオーバライドして自作の比較結果を作ることができるのがミソ
例えば、オーバライドしたcompareメソッドで戻り値に符号を反転させることもできる。
その後に、ListインタフェースのsortメソッドはComparaterなので自作compareで降順にできる。
compareToメソッドが絡むとややこしいので例をあげる
Integer a = 12;
Integer b = 15;
// a(12) と b(15) の比較(12より15が大きいのでマイナスを返す)
a.compareTo(b)
Mathクラス
- Math.pow(2,3) :2の3乗
- Math.sqrt:平方根
LocalDateクラス
LocalDateクラスとCallenderクラスの違い
- Callenderは月が0始まりだが、LocalDateは1始まり
- Callenderはmutable(可変)だが、LocalDateはimutable(不変)
- LocalDateは日付を操作する便利なメソッドが追加された
LocalDateクラスのメソッド
- ofメソッド:日付を指定してインスタンスを生成
- nowメソッド:現在日付でインスタンスを生成
- parseメソッド:文字列の日付をLocalDateクラスに変換
- withメソッド:日付の変更
例外処理
- 例外は検査例外(Exceptionを直接継承する例外)と非検査例外(ErrorおよびRuntimeExceptionを直接継承する例外)に分類。
- 非検査例外はtry-catchまたはthrows句が必要ない。
- RuntimeExceptionはExceptionのサブクラスだが非検査例外。
- try-with-resources構文を使用してリソースを自動的に閉じれる。
モジュールシステム
複数のパッケージを1つにまとめ、公開するパッケージと非公開にするパッケージを分けて管理できる
目的はパッケージ単位の情報隠蔽。
モジュール実行の流れ
- モジュール用のディレクトリ作成
- モジュール用のディレクトリにmodule-info.javaを作成
- module-info.javaとソースファイルをコンパイル
- 実行したいモジュールの実行
module-info.java
記述できること
- どのパッケージを公開するのか(exports)
- ほかのどのモジュールを使うのか(requires)
基本の流れ
module-info.javaとソースファイルをコンパイルしてモジュール化する
- コンパイルの構文
javac△-d△クラス出力先△コンパイルするmodule-info.java のパス△コンパイルするファイルパス
module-info.javaもコンパイルされてClassファイルができる - コンパイル例と実行後の構成
コンパイル例
javac -d mods/unko src/unko/module-info.java src/unko/com/sample/Main.java
コンパイル実行後の構成
├─mods
│ └─unko
│ │ module-info.class
│ │
│ └─com
│ └─sample
│ Main.class
│
└─src
└─unko
│ module-info.java
│
└─com
└─sample
Main.java
モジュールの実行
- モジュール実行の構文
java△–module-path△モジュールのルートディレクトリ△-m△実行クラス - モジュール実行例(モジュールと完全修飾クラスの間はスラッシュで区切る)
java –module-path mods -m unko/com.sample.Main
Hello
モジュールの公開と利用する流れ
モジュールとディレクトリ構成
├─mods
│ ├─boo
│ └─unko
│
└─src
├─boo
│ │ module-info.java
│ │
│ └─com
│ └─test
│ A.java
└─unko
│ module-info.java
│
└─com
└─sample
Main.java
module unko {
requires boo; //booモジュールを利用する
}
module boo {
exports com.test; //testパッケージを公開する
}
module-info.javaとソースファイルをコンパイルしてモジュール化する
booのコンパイル
javac -d mods\boo src\boo\module-info.java src\boo\com\test\A.java
A.javaは”This is class A.”をprintlnで表示
unkoのコンパイル
javac –module-path mods -d mods\unko src\unko\module-info.java src\unko\com\sample\Main.java
※–module-path をルートに指定する
Main.javaは”Hello”をprintlnで表示して、Aを呼び出し
モジュールの実行
java –module-path mods -m unko/com.sample.Main
Hello
This is class A.
その他
- 利用モジュールを伝搬:a1がa3モジュールを利用できる(transitive)
module a1{
requires transitive a3
} - モジュールの説明表示
java –module-path mods –describe-module boo
boo file://mods/boo/
requires java.base mandated
contains com.test - JMODファイル形式のモジュールファイル(jmod)
作成
jmod create –class-path mods/boo boo.jmod
説明の表示
jmod describe boo.jmod - 依存関係を調査(jdeps)
jdeps –list-deps unko.jar - 依存モジュールのサーチ内容(–show-module-resolution)
java –module-path mods –show-module-resolution -m unko/com.sample.Main - 非公開パッケージを1時的に利用するコンパイル(–add-exports)
javac –module-path mods –add-exports boo/com.test=unko -d mods\unko src\unko\module-info.java src\unko\com\sample\Main.java
最後に…
いかがでしたでしょうか。
JavaSilverの受験直前で効率よく勉強するために、引っ掛かりやすいところや出題されそうなところを重点的にまとめました。
これらのポイントをしっかり覚え、試験に自信を持って挑みましょう。
最後の一週間を有効に活用すれば、合格への道は開かれています。頑張ってください!
本記事では伝えきれないこともありました。
『もう少し詳細を知りたいよ~』
という場合はココナラのサービスも覗いてみてね♪
↓ココナラ
JavaSilver・Gold試験をサポートします~勉強方法で学習コストが決まる!効率的に合格しよう♪~
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級