概要
スッキリわかるJava 入門 第3版で学習したことについて、ノート代わりにまとめていく記事になります。
私の読書ペースとやる気次第で更新されます。
目次
1章
Java のコードファイル名について
私は書籍に記載されているdokojavaではなく、実際に自分で環境構築を行なってプログラムを模写していく形をとりました。
環境構築を終え、サンプルプログラムを実行しようとすると、以下のエラーが起きました。
The public type Class must be defined in its own file
なぜだろう?と思い読み進めてみると、Java ではソースファイル名とpublicクラス名が同一である必要があるらしく 、ソースファイル名をcode0_1,publicクラス名をmainとしていたいきなりつまづきました。
驚きのルールですが、関数ごとにファイルを分ける癖がつきそうなので良いのかもしれないですね。
コードブロック構造について
C/C++ などの言語では、「{」「}」で区切られた範囲のことをコードブロック、なんて呼びますが、Java では、コードブロックが必ず2重構造になる ようです。
各ブロックはクラスブロック、メソッドブロックと呼ばれ、メソッドブロックにコードを記述していくことになります。
Java におけるブロック構造
また、メソッドブロックで使うであろう変数には、いくつかの予約語 が存在します。この予約語 を変数名に当てることはできないので、注意が必要になります。
予約語 一覧はこちら
Java | Javaの予約語
2章
実際に変数に格納するなど、プログラムに記述される数値や文字のことを、リテラル と呼びます。
この時、リテラル は記法次第で様々なデータ型へと変化します。
特に、 「long 」「float 」型は他言語と記法がかなり違うので、気をつけないといけません。
主なリテラル の種類
記入方法
整数(int)
123
整数(long)
123L
浮動小数 (double)
1.23
浮動小数 (float)
1.23F
文字(char)
'1.23'
文字(string)
"1.23"
末尾につける「l」や「f」などの文字は、大文字でも小文字でもどちらでも大丈夫です。
一部を抜粋しただけなので、詳しく知りたい人はこちらをご確認ください。
Java : リテラルの表記方法いろいろ - プログラミングTIPS!
軽く検索した中で一番わかりやすかったです。
ちなみに、long型にint型を、double型にfloat型を格納することはできましたが、int型にlong型を、float型にdouble型を格納することはできませんでした 。
Type mismatch: cannot convert from double to float Java
これは、Java が数値型に取り扱う数値範囲を元にして大小関係をつけており、小さな型から大きな型の変数へ代入する場合のみ変数の型に変換されて代入される、という仕様を持っているからだそうです。
数値型
型
扱える範囲の大きさ
浮動小数 点型
double
大
浮動小数 点型
float
整数型
long
整数型
int
整数型
short
整数型
byte
小
とはいえ、もちろん正しく格納するのが一番なので、基本的には公式で推奨されている形に従って書くのが良いでしょう。
文字列型の比較
文字列型(String)の比較は通常の比較方法ではなく、equals() を用いて行う。
以下はプログラム例。
String msg1 = "Hello" ;
String msg2 = new String(msg1);
System.out.println(msg1 == msg2);
System.out.println(msg1.equals(msg2));
msg1とmsg2は同一の文字列が格納されているにも関わらず、演算子 「==」で比較した際には実行結果としてfalseが返ってきています。
これは、java において、演算子 「==」が同一の参照先であるかを比較するために起こるようです。
つまり、以下のように、二つのString変数が同一の参照先を示している場合には、trueが返ってきます。
String msg1 = "Hello" ;
String msg2 = msg1;
System.out.println(msg1 == msg2);
しかし、先ほどのように、内容は同一でもnew演算子 によって新たにメモリ上に参照先が作成された場合には、異なる参照先を示すためにfalseが返ってきてしまいます。
そこで、文字列の比較ではオブジェクトが示す内容が同一かを確かめるためにequals()が必要になるわけです。
詳しい説明はこちら
String (Java Platform SE 8)
を参照してください。
4章
3章は特に目新しい学びはなかったので省略。
配列の書き方
配列の宣言には型の宣言時に"[]"をつけるそうです。
int [] hoge;
hoge = new int [5 ]
int [] hogehoge = new int [10 ]
他言語でよく使われる以下の形でも配列の宣言が出来ますが、上記の形でも間違いではないことに注意です。
int hoge[];
hoge = new int [5 ]
int hogehoge[] = new int [10 ]
5章
メソッド
Java はオブジェクト指向言語 ですから、関数の他にメソッドという概念が存在します。
関数同様、引数を与えることができ、戻り値を返すことができます。
使い方も機能も似通っているので、オブジェクトの中にある関数=メソッド という理解でも困ることはないのかなと思いました。
具体的な細かな違いについては、以下のQiita記事が参考になりました。
関数とメソッドの違いとそれぞれを考えてみる(Javaで) - Qiita
値渡しと参照渡し
Java では、引数の渡し方に値渡しと参照渡しの2つの手法が存在します。
厳密にはJava には値渡ししか存在しないようですが、著書で理解を簡単にするために参照渡しと呼んでいるので私もそれに倣っています。詳しくは[こちら]もう参照渡しとは言わせない - Qiita
メソッドに引数を与えると、基本的には値渡しとなるので、以下のような挙動を示します。
public static int add(int x,int y){
x++;
int ans = x + y;
return ans;
}
public static void main(String[] args){
int a = 1 ;
int b = 2 ;
int ans = add(a,b);
System.out.println(a + "+" + b + "=" + ans);
}
しかし、配列など、一部変数を引数に用いた場合は参照渡しの挙動を示します。
public static void incArray(int [] array){
for (int i = 0 ;i < array.length; i++){
array[i]++;
}
}
public static void main(String[] args){
int [] array = {1 ,2 ,3 };
incArray(array);
for (int i : array){
System.out.println(i);
}
}
これには、Java の変数に「基本型」と「参照型」の2種類が存在することが起因しています。
参照型には配列、クラス(Stringなど) が該当し、基本型はそれ以外を指します。
簡単に言うと、引数で基本型は値渡し、参照型は参照渡しとなる。ということです。
詳しくはこちら
Javaの「参照型変数」を理解する:Eclipseではじめるプログラミング(9)(1/2 ページ) - @IT