このメモの使い方
対象:Java Silver SE11受験予定の方
Java Silverに合格したので、その過程でまとめたノートを公開します。
「黒本」に沿った構成にしています。このノートに書いてあることをマスターすれば合格できると思います。
試験で覚える必要がある箇所や、間違えやすいJavaのルールをまとめてありますので、ご活用ください。
第1章 簡単なJavaプログラムの作成
◆javaコマンド
・書き方:java 完全修飾クラス名 [引数、引数、・・・]
※完全修飾名とは、「java.lang.String」のような正式名のこと。「String」クラスは、単純名と呼ぶ。
・引数は、スペースで区切って列挙する。
・ ¥" =「”」と1引数として出力される。
・コマンドの種類
①実行コマンド:java ファイル名(.javaなどの拡張子は不要)/java ファイル名.java(拡張子をつけることでコンパイルが不要になる)
②コンパイルコマンド:javac ファイル名.java(拡張子必要)
③モジュールコマンド: jmod
・javaコマンド実行時の動作:
①JVMを起動
②指定されたクラスをクラスパスから探し出してロードする
③String型オブジェクトを作成し、起動パラメータ(引数)を格納する
④起動パラメータ(引数)を保持したString配列型オブジェクトへの参照を引数に渡してメソッドを実行
◆整数リテラル
・整数リテラルの種類: 整数値(int型)、文字(char型)、浮動小数点数(double型)、真偽値(boolean型)の4つ。
・リテラルを他のデータ型であると明示したい時は、long型は「L」「l」、float型は「F」「f」 といった接尾辞を値の後ろにつける。
・各進数の接頭辞
①2進数:「0b」を接頭辞としてつける。 例えば10進数の「63」は「0b0111111」と表現。
②8進数:「0」を接頭辞としてつける。 例えば10進数の「63」は「077」と表現。
③16進数:「0x」を接頭辞としてつける。 例えば10進数の「63」は「0x3F」と表現。
・「_」アンダースコア:桁数の多い数値リテラルを見やすくする。リテラルの先頭&末尾と記号の前後には記述できない(記号例:「.」「L」「F」「0b」「0x」 )。それ以外であれば出現する場所、回数は自由。
◆識別子
・命名規則:
①予約語(abstract, if, intなど)を識別子として使えない
②記号は「_」と通貨記号$のみ使える
③数字から始められない
第2章 Javaの基本データ型と文字列操作
◆型変換
・型変換には2種類ある。
①暗黙の型変換:キャスト式が必要ではない。小さいデータ型を、大きいデータ型に入れる。
②明示的な型変換:キャスト式が必要。大きいデータ型を、小さいデータ型に入れる。
・型の大きさ順
(小) byte→short→int→long→float→double (大)
char型=int,long,float,doubleに自動変換される。
◆var
・ローカル変数のみに使える。
・使えない: フィールドの宣言、引数の型宣言、ラムダ式、配列の初期化式、null
◆Stringクラス
・Stringは不変(immutable) なオブジェクト。文字列を変更するには、新しくインスタンスを作る。
【Stringクラスの主なメソッド】
■indexOfメソッド:検索したが一致しない場合、-1を返す。引数と一致した場合、その開始位置を返す。
■replaceメソッド:先頭から最後まで一致するものを全て置き換えていく。
■replaceAllメソッド:置換した結果の文字列を持った新しいStringインスタンスを作り、そのインスタンスへの参照を戻す。
■lengthメソッド:文字数(半角、全角関係なく)
■concatメソッド:文字を連結させる。
第3章 演算子と判定構造
◆equalsメソッド
・Objectクラスに属する、オーバーライドして同値性を確認するメソッド。オーバーライドせず使用した場合は、同値性ではなく同一性を確認する。
public boolean equals(Object obj){
return(this == obj);
}
・同値性(オーバーライド時): 異なる参照を持つインスタンスだが、持っている値が同じである性質のこと。
・同一性(オーバーロード時): 異なる参照を持っているかを確認する。異なる場合、falseを返す。
・引数にnullが入った時は、必ずfalseを返す。
◆internメソッド
・文字列がコンスタントプールにあるか確認し、すでにあればその文字列を返す(再利用)。なければその文字列を追加する。
◆if文
・{}が省略できる。省略した場合、最初の一文のみがif文内の処理とみなされる。
if(a<10)
//{
system.out.print("true") //←この文だけif文の処理とみなされる
//}
system.out.print("false")
・条件文に合致し処理内容が実行されたら、その後の条件文は実行されない。
◆switch文
・case値のルール
①switch文の引数にある値と、同じ型/互換性がある型であること。
②定数(final宣言された変数)か、リテラルであるか
③nullでないこと。
final int NUM = 0;
int num = 0;
switch(num){
case "10": System.out.print("A"); //引数numはint型であるが、
break; //"10"はString型なのでコンパイルエラー
case num: System.out.print("B"); //numはfinal宣言されてないのでコンパイルエラー
break;
}
・default
は、どれにも当てはまらないときに実行される。
・null
を引数に渡すと、NullPointerException
がスローされる。
#第4章 制御構造
◆while文
・{}を省略する時の注意点:do{処理}
の処理は、一文しか書けない。2つ以上書くとコンパイルエラーになる。
int cnt = 0;
do
system.out.println("A");
system.out.println("B"); //中かっこを省略し2つの分を記述しているのでコンパイルエラー
while (cnt++<5);
◆for文
・初期化子と更新文は複数記述できる。
・初期化子は同じ型でないといけない。2つ目の初期化子からは、型名を書かなくて良い。
・条件式は1つしか記述できない。 複数記述するとコンパイルエラー。
for(int i=0, j=2; i<10; i++, j++){
//処理
}
◆条件式を複数記述したいときは[[論理演算子]]を使う
for(int i=0, j=2; i<10 && j<10; i++, j++){
//処理
}
・更新文は繰り返し処理が終わったときに実行される。
・for文内で宣言した変数は、for文内のみで有効。
・continue
以降に何か処理を書くと、到達不可能コードとしてコンパイルエラーが出る。
第5章 配列の操作
◆配列
//データ型[] 配列変数名
int[] num;
//または
//データ型 配列変数名[]
int num[];
//配列変数名 = new データ型[要素数]
int[] num = new int[5];
//または
int[] num;
num = new int[5];
//データ型 配列変数名 = {配列に入れる値}
int[] num = { 1, 2, 3, 4, 5};
・配列のインスタンスを生成すると、値が入ってなくても自動的に0, nullなど型に合わせてデフォルト値で初期化される。(int型→0 Integer型→null double型→0.0 boolean→false String型→¥u0000)
・次のようにも記述可能。int[] e[]
・「int[ ] a = new int[0] 」のように、要素数が0の場合、ハッシュコードが表示される。
・継承関係:スーパークラス型の配列型変数で、サブクラスのインスタンスの集合を扱える。
public interface A{}
public class B implements A{}
public class Main{
public static void main(String[] args){
A[] array = new B[]{new B(), new B()};
}
}
・無名配列:大かっこ[]
の中に数字は入れられない。
//[]の中に数字は入れない。
int[] array = new int[] {}
//誤った記述例
int[] array = new int[5] {}
第6章 インスタンスとメソッド
◆Staticなフィールド
・staticで修飾されたフィールドやメソッドは、static領域と呼ばれる領域に配置される。
・staticなフィールドへのアクセス
①「クラス名.フィールド名」 (例)Sample.num = 10;
②通常通りにインスタンス生成、「参照.フィールド名」でアクセス。
Sample s = new Sample();
s.num = 10;
・クラス単位で管理される。=クラスから作られた全てのインスタンスで共有される。
・staticなフィールドは、インスタンスを生成しなくても使える。
・staticなメソッドは、staticなメンバ(staticで修飾されたフィールドやメソッド)にしかアクセスできない。(反対に、staticでないメソッドから、staticなメンバにはアクセス可能)
◆ローカル変数
・初期化されていないローカル変数を参照すると、コンパイルエラー。
・final
をつけて宣言できる。
◆this
・ローカル変数(メソッド内で定義した変数)より、フィールド変数(メソッド外で定義するクラス変数)を優先したい時に用いる。
◆インスタンス
・ダブルクオテーションで文字リテラルを囲うことでも、インスタンスの生成ができる。(例:String="sample";
)
◆メソッドの呼び出し
・戻り値がvoid(つまり、何も値を戻さない)の場合、戻り値を受け取るような代入式を記述するとコンパイルエラー。
class Sample{
public void hello(){
system.out.println("hello");
}
}
public class Main{
public static void main(String[] args){
Sample s = new Sample();
String a = s.hello(); //戻り値がvoid型のメソッドを代入して、
//sで値を受け取ろうとしているのでコンパイルエラー
s.hello(); //ただメソッドを呼び出すだけで何も受け取らないのでエラーにならない
}
}
◆return文
・機能①:呼び出し元のメソッドに値を戻す。
・機能②:呼び出しもとに制御を戻す。メソッドの処理を強制終了し、呼出し元のメソッドに戻る。
・return文の後ろの処理は実行不可能。return文の後ろに何らかの処理をするコードを記述すると、コンパイルエラー。
◆オーバーロード
・オーバーロードのルール: シグニチャ(引数の数や型、順番)が異なること。アクセス修飾子の違いは関係ない。
・戻り値型だけが異なるメソッドは、オーバーロードとみなされず、同じメソッドが重複して存在するとして、コンパイルエラーになる。
<正しくオーバーロードされていない例>
int calc(double a, int b){処理内容}
をオーバーロードしたい。
→double calc(double a, int b){処理内容}
:戻り値が異なるだけで、オーバーロードされていない。
◆コンストラクタ
・別のコンストラクタを呼び出すときは、this
を使う。最初に記述しないとコンパイルエラー。
・コンストラクタは、インスタンス生成時にしか呼び出せない。
・void
など戻り値型がついていたら、コンストラクタではない。
・extends
等で継承しても、サブクラスには引き継がれない。
・コンストラクタを修飾するアクセス修飾子に制限はない。
・コンストラクタチェイン:サブクラスをコンパイルすると、サブクラスのコンストラクタにはスーパークラスのコンストラクタを呼び出すsuper();
が追加される。
public class B extends A{
B(){
this(4);
System.out.print("3");
}
B(int b){
super(); //←コンパイルして追加されたスーパークラスAの呼び出し
System.out.print(b);
}
◆final
・finalで修飾された変数は定数であり、変更できない。
・変更するためには、コンストラクタで値を初期化する必要がある。
public class Sample{
private final int num; //定数の宣言
pibliv Sample() {} //コンストラクタ内で定数を初期化していないのでコンパイルエラー
public Sample(int num){
this.num = num; //コンストラクタ内で定数を初期化している
}
}
◆可変長引数
・自由に数を変更できる引数のこと。
・引数の型の直後にピリオド3つを付けて宣言する。
void sample(int... num){
//do something
}
・注意点:
①異なる型はまとめられない。
②可変長引数以外の型も引数に含める場合、可変長引数は最後に書く。
第7章 クラスの継承、インターフェース、抽象クラス
◆インターフェース
【基本的なルール】
・インターフェースを継承した具象クラスは、抽象メソッドを具象メソッドに書き換えなければいけない。
・インターフェースで実装する抽象メソッドは、自動的にアクセス修飾子がpublicになる。
・インスタンス化できない
・インターフェースを継承したクラスでは、メソッドをオーバーライドするときにpublic以外のアクセス修飾子へ変更できない。>>p.522
・定数フィールド(static, final) しか定義できない。
【その他のルール】
・defaultメソッド:defaultメソッドを使うと、メソッドの処理内容が書ける。インターフェースを継承したクラスは、オーバーライトせずにメソッドを使える。
・抽象メソッドをオーバーライドした抽象メソッドでは、戻り値の型を変更できる。(この場合の型は、スーパーメソッドで指定されている型のサブクラス型でなければならない。= 「共変戻り値」 )>>p.523
・デフォルトメソッドとstaticメソッドとして実装を定義できる。
◆抽象クラス
・抽象メソッドと具象メソッドが書ける。
・抽象メソッドには、必ずabstractをつけ、中身を書いてはいけない。
・抽象メソッドはオーバーライドされる前提なので、private以外のアクセス修飾子であれば自由に設定できる。
・抽象クラスを継承したサブクラスでは、抽象メソッドをオーバーライドしなければならない。
・インスタンス化できない。
・抽象クラスを継承した抽象クラスを定義できる。
◆オーバーライド
・オーバーライドのルール:
■シグネチャ(メソッド名、引数の型、引数の数、順番)が同じであること。
■戻り値型は同じ型か、サブクラス型であること。
■アクセス修飾子は同じか、より緩くするここと。
■throwsで宣言する例外は、スローする例外と同じ型かサブクラス型であること。
◆ポリモーフィズム
・同じ名前のメソッドなのにあるクラスでの振る舞いと別のクラスの振る舞いで違う動きをする
第9章 API
◆Map
・キーとバリューの組み合わせで管理するコレクション。表のようなイメージ。
・keyメソッド:キーを取り出す。
・valueメソッド:バリューを取り出す。
◆ArrayList
・スレッドセーフではない
◆compareメソッド
・2つの配列を辞書順に並べた時の、並び順を比較する。
・2つの配列が等しい場合:0を返す。
・第1引数が第2引数よりも辞書順で先の場合:-1を返す。
・第1引数が第2引数よりも辞書順で後の場合:1を返す。
◆Mathクラス
・Math.pow:累乗した値を取得する。例)Math.pow(2,3); → 2の3乗=8
・Math.sqrt:引数の平方根をdouble型で取得する。例)Math.sqrt(16); →4.0(double型なので小数点まで表示される)
・Math.round:引数を小数点第一位で四捨五入し、整数にする。
◆stringBuilderクラス
・デフォルトで16文字分のバッファを余分に持っている。
例:"abcde"という文字列を、stringBuilderクラスのcapacity()メソッドでキャパを調べると、16+5=21になる。
第10章 例外処理
◆例外処理
try {
例外が発生する可能性のある処理
} catch (例外の型 引数) {
例外が発生した場合の処理(例外が発生しなければ行われない処理)
} finally {
例外の有無に関わらず、最後に必ず実行される処理
}
・例外処理が実行される順番:①closeメソッド → ②catchブロック → ③finallyブロック
・catch文を複数書くときの注意:先にサブクラスの例外を書く。スーパークラスを先に書くと、コンパイルエラー。
・throw:意図的に例外を発生させたいときに、処理内容に書く。
・throws:検査例外をスローするメソッドに書かなければいけない。mainメソッドでcatchする場合は、このthrowsを用いて宣言するか、Exceptionをcatchの引数に(catch(Exception)
)記入しなければならない。
・複数のtry-catchがネストしている場合、スローされた例外を受け取るのは、その例外に対応した最も近いcatchブロック。
・tryブロックで宣言した変数の有効範囲は、tryブロック内のみ。
・非検査例外:RuntimeExceptionとそのサブクラス。throwsで宣言しなくて良い。
・return文が最後にあったら、finally→catchの順に出力される。
・戻り値が入る箱は1つしかないので、最後にreturn文で返された戻り値が、最終的な値になる。
◆主な例外の種類
・NullPointerException:配列に値が入ってない時に呼び出そうとするとスローされる。system.out.print()で表示される分にはスローされない。
・IndexOutOfBoundsException:ArrayIndexOutOfBoundsExceptionやStringIndexOutOfBoundsExceptionのスーパークラス。
・ClassCastException:あるオブジェクトを継承関係にないクラスにキャストしようとしたことを示すためにスローされる。
・ConcurrentModificationException:オブジェクトの並行変更を検出したメソッドによって、そのような変更が許可されていない場合にスローされる。例えば、あるスレッドで配列の値を順に取り出しているときに、もう1つのスレッドで配列の値を変更しようとしたときなど。
・UnsupportedOperationException:変更不可なコレクションに、変更が行われた場合。(list.of
で作られた配列が変更されたときなど)
第11章 モジュールシステム
【コマンドの種類】
java --describe-module
jmod describe
:モジュールの設定情報を調べる
jdeps --list-deps
java --show-module-resolution
:クラスやモジュールの依存関係を調べる