🥥
「Javaの基本のk」を書籍と動画で学び直して、改めて理解が深まったことをまとめる
参考書籍
本記事では、主な参考書籍1冊を先に記述する。
- 中川清喬/国元大悟.『スッキリわかるJava入門 第2版』
文法
-
代入時の自動変換
- 「大は小を兼ねる」的な代入ができる。 e.g.)short型の値をlong型の変数に代入。
- 例外として、intをbyteやshortに入るもんなら入れることもできる。
-
キャスト変換
- 大は小を兼ねないのに、無理矢理ぶち込むための手法。
-
int a = (int) 3.5;
のように表記すると、入らない部分は切り取って無理矢理代入できる。 - が、できないこともあるし不具合の原因にもなるし、よっぽどじゃない限り使わないのが◎
-
演算時の自動変換
- 演算子の左右のオペランドの型も、基本揃えないといけない。
- 揃ってなかったら、大きい型に統一される。 e.g.)2 + 3.5 → 2.0 + 3.5
- 片方がStringなら両方Stringになる。
-
配列の要素は自動的に初期化される
- 初期化しないで間違えて使っちゃっても、コンパイルエラーが出ない。
- 数値は0、Stringはnull、booleanはfalseで初期化される。
- 参照を切る :ある番地を参照していた参照型変数に、nullを代入して参照させなくすること。配列やStringに使える。
-
return文について
- return文の後に処理を書いても、実行されない。
- returnにはメソッドを終了させる役割もあるから。
- メソッドにreturnがあったとしても、戻り値を使わないなら、変数で受け取らないで呼び出すだけでもいい。
-
値渡しと参照の値渡しについて
- 参照の値渡しの場合、すなわち参照型変数をメソッドとかに渡して、その変数をなんか処理して変更かけると、住所教えて入られて内装変えられたのと同じだから、大元の変数の内容も変わる。
- 値渡しの場合、すなわち基本型変数をどっかに渡して変更しても、間取り図をコピペして渡しただけだから、大元は変わらない。
語彙
- 演算子 :式の中の記号。 +とか-とか*とか。
-
オペランド :式に含まれる演算子以外の部分。 5とかxとか3.14とかyとか。
- リテラル :オペランドの中の、値。データ型を持ってる。 5とか3.14とか"ラーメン"とか。
- リテラル以外のオペランド:変数(xとかyとか)、定数(finalってやつ)、命令の実行結果(戻り値ってことかな?)。
- 評価 :式に従って計算処理をすること。
- スコープ:変数が利用可能な範囲のこと。
- 入れ子/ネスト :多重構造のこと。 分岐in分岐とか分岐in繰り返しとか。
-
参照型変数 :具体的なデータではなくメモリ上の番地を代入する変数のこと。 はいれつとか。
- 基本型変数 :具体的なデータを代入する変数のこと。 intとかboolean とか。
-
実引数 :メソッドに値を渡す方の引数。メソッドを呼び出す時の
()
の中身。-
仮引数 :値を受け取る方の引数。メソッド定義の時の
()
の中身。
-
仮引数 :値を受け取る方の引数。メソッド定義の時の
-
ローカル変数 :メソッド内で宣言した変数のこと。
- その変数が属するメソッド内だけで有効。
- 独立性がある。異なるメソッドに属するローカル変数に同じ名前のものがあったとしても、それらは全くの無関係。
- 仮引数もローカル変数の一種である。
-
オーバーロード :仮引数の型or個数が異なる場合、同じ名前のメソッドを複数定義すること。
- シグネチャ :メソッド名と、引数の個数・型・並び順のこと。
-
コマンドライン引数:プログラム起動時に
java プロラム名
の後に指定する引数のこと。- JVMによって配列に変換され、mainメソッド起動時に
args[]
に格納される。 - これにより、プログラム起動時に追加情報を指定できる。
- JVMによって配列に変換され、mainメソッド起動時に
-
デフォルトパッケージ/無名パッケージ :特にパッケージ名の指定がないとき、これらのパッケージに属していると言われることがある。
- これに属するクラスを
import
はできない。
- これに属するクラスを
-
完全限定クラス名(FQCN) :
パッケージ名.クラス名
で表記される、いわば正式名称のこと。- Full Qualified Class Name
- フィールド :クラスブロック内に宣言された変数のこと。
-
ラッパークラス :それぞれの基本データ型(intとかStringとか)に対応したクラスのこと。
-
parseInt()
などの基本データ型に関する便利なメソッドを持ってる - 基本データ型を利用できないAPIのために、基本データ型をラッパークラスを用いてインスタンス化することができる。
- Java5以降では、ラッパークラス型と基本データ型との間で代入式を記述すると、自動的に型変換が行われるようになった。楽ちん!
-
-
チェック例外/Exception系例外 :例外処理が必須な例外。
- 他にも、Error系例外(回復の見込みが無いため例外処理不要)、RuntimeException系例外(キリがないので必ずしも常に例外処理をする必要はない)がある。
- APIリファレンスには、Exception系例外の発生可能性がある場合、メソッドやコンストラクタの引数リストの後に
throws 例外クラス名
と表記されている。それを見て例外処理を記述する。
- スタックトレース :JVMがプログラムのメソッドを、どのような順番で呼び出してどこで例外が発生したのか、の記録が記された情報。
記法
- n進数
int a = 0b11; //=3(10):0bを頭につけると2進数
int b = 011; //=9(10):0を頭につけると8進数
int c = 0x11; //=17(10):0xを頭につけると16進数
- 代入演算子
a += 10; //a = a + 10;と同義。優先順位は最低。右から左へ評価。
- インクリメント・デクリメント演算子
i++; //i = i + 1;と同義。優先順位は最高。評価の方法は左から右。
//++i、と、i++、で違いがあるため、他の演算子とは使わないようにすること。
- for文の例外的な書き方
for(; i<10; i++){...}; //ループ変数を初期化しなくても良い。
for(int i=0; i<10; ){...}; //繰り返し時の処理をしない。このままだと無限ループ。
- 無限ループの作成方法
while(true){...};
if(;;){...}; //条件を満たすまでループさせ、満たしたらbreakで抜けたりする。
- 拡張for文
for(要素の型 変数名:配列名){
処理内容
}; //変数に、配列の要素が0から最後まで順番に入って、ループしていく。
- try-catch構文
try{
本来の処理;
} catch (例外クラス1|例外クラス2|... e){
例外が発生した場合の処理;
} finally {
例外が発生してもしなくても必ずする処理;
} //後片付け処理(ファイルを閉じる、ネットワーク接続を切る、など)は必ずfinallyブロック内に書く。
//Java7以降は、後片付けが必須の処理だけはtryの直後に()を設けてその中に書くことで、finallyを記述しなくても自動的にcloseできるようになった。(java.lang.AutoClosableインタフェースを実装している型のみ)
- スロー宣言
//メソッドを定義する時、処理内容に例外処理が必要な箇所があったとしても、そのメソッド内で例外処理しないでメソッドを呼び出した奴に処理を伝搬する事ができる。
メソッド定義 throws 例外クラス1,例外クラス2...{
処理内容;
}
- 例外を投げる[1]
//本当はエラーも例外も起きないけど自分で、このときはこういう例外が発生するよ、って決めること。
throw new 例外クラス名("エラーメッセージ");
//例えば年齢を入力させてint型の変数に代入する時、負の数になってたりしたら例外を発生させるように分岐を作るとか。
メソッド
//aとbを比較して大きい方をかえす。
int m = Math.max(a, b);
//0~整数a未満の乱数発生
int r = new java.util.Random().nextInt(a);
//キーボードから1行の文字列or1つの整数の入力を受け付ける
String input = new java.util.Scanner(System.in).nextLine();
int input = new java.util.Scanner(System.in).nextInt();
文字列.length(); //文字数(全角も半角も1)が返ってくる。
配列.length; //配列の要素数が返ってくる。
//例外インスタンスに格納されてるメソッド
String getMessage(); //エラーメッセージを取得する。
void printStackTrace(); //スタックトレースの内容を画面に出力する。
豆知識
- 処理内容が1行なら、
{}
は省略可能。- この書き方はわかりにくいから非推奨だと思うけど、読むときにもし出会っても、え?!ってならんように。
- 短絡評価 :Javaは条件式の前半でtrueかfalseか確定しちゃったら、後半は評価しないで、答えまで一気にかっ飛ばしてくれる、賢い子。
-
JRE :JDK同様オラクル社が無償公開しているJavaのダウンロードパッケージ。
- 自分ではプログラム開発しないけど、他人が書いてくれたのを実行する、って人のためのもの。
-
javac
は動かないけどjava
は動く
-
JARファイル :複数のJavaクラスファイルを1つにまとめるファイル形式。zipファイルみたいなやつ。
- JDKに付属してる
jar
コマンドで作れる。 - javaプログラムの完成品は複数クラスファイルの集合体であり、誰かに配布するならその全部を渡さなきゃでめんどいから、できた。
- 他人にjavaプログラムを渡す際には、どのクラスにmainメソッドが入ってるか教えないと、起動できない。
- JDKに付属してる
- パッケージの命名について
- 小文字を使用するのが一般的で、
calc.logics
みたいにドットで区切った名前も多く使われる。 - が、別にドットで区切られてるだけでこれで1つの名前。間違っても、親子関係や階層関係があるわけではない。
- パッケージ名が衝突しないため、保有するインターネットドメインを逆順にしたものから始めることが、推奨されている。
- 小文字を使用するのが一般的で、
- その他命名について
- クラス名:名詞で頭文字は大文字。
- フィールド名:名詞で、頭文字は小文字、接続単語の頭文字を大文字。 itemListとか。
- メソッド名:動詞で、フィールドと同じ記法。
- java.langパッケージは、importしなくても自動的にimportされるという決まり。
-
クラスローディング :JVMが処理に必要なクラスファイルだけを読み込む処理。
- 例えば、langパッケージの中の全部のクラスを最初に読み込んでから処理を始めるんじゃなくて、処理の途中で必要にな時に必要な分だけ取りに行ってくれる。
- クラスファイルを取りに行く時、探しに見に行くためのフォルダの場所がクラスパス。
-
「例外を投げる」また「オリジナル例外クラスの定義方法」については、文法的に理解はしたものの、実際にどのような場面で使用されるのかへの理解が及んでいない。今後、演習を重ねたり現場で実物のコードを見たりする中で、学習したい。 ↩︎
Discussion