【随時更新】スッキリわかるJava入門 第3版 学習記事【Java】

概要

スッキリわかる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)); 

/* 実行結果
false
true
*/

msg1とmsg2は同一の文字列が格納されているにも関わらず、演算子「==」で比較した際には実行結果としてfalseが返ってきています。

これは、javaにおいて、演算子「==」が同一の参照先であるかを比較するために起こるようです。

つまり、以下のように、二つのString変数が同一の参照先を示している場合には、trueが返ってきます。

// 文字列の比較方法
String msg1 = "Hello";
String msg2 = msg1;

System.out.println(msg1 == msg2); 

/* 実行結果
true
*/

しかし、先ほどのように、内容は同一でもnew演算子によって新たにメモリ上に参照先が作成された場合には、異なる参照先を示すためにfalseが返ってきてしまいます。

そこで、文字列の比較ではオブジェクトが示す内容が同一かを確かめるためにequals()が必要になるわけです。

詳しい説明はこちら

String (Java Platform SE 8)

を参照してください。

4章

3章は特に目新しい学びはなかったので省略。

配列の書き方

配列の宣言には型の宣言時に"[]"をつけるそうです。

// int型配列変数の宣言
 int[] hoge;
// int型の要素を作成
 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);
    }
    /*実行結果
    1+2=4
    */

しかし、配列など、一部変数を引数に用いた場合は参照渡しの挙動を示します。

    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);
        }
    }
    /*実行結果
    2
    3
    4
    */

これには、Javaの変数に「基本型」と「参照型」の2種類が存在することが起因しています。

参照型には配列、クラス(Stringなど)が該当し、基本型はそれ以外を指します。

簡単に言うと、引数で基本型は値渡し、参照型は参照渡しとなる。ということです。

詳しくはこちら

Javaの「参照型変数」を理解する:Eclipseではじめるプログラミング(9)(1/2 ページ) - @IT