お得なAmazonタイムセールはこちら

【完全版】独学Java入門・コンパイルや実行まで・オブジェクト・クラス・インスタンス・メソッドも

独学でプログラミング_Java入門 プログラミング
スポンサーリンク

JDKのインストール

Javaの開発キット(JDK)をインストールしましょう。インストール手順は以下のサイトに分かりやすく説明してあったのでこちらの手順でインストールをしてみてください

JDKのインストール手順はこちら

基本的には上記のサイトで説明してあるのですが少し補足させて頂きます。

※環境変数の設定
JDKをインストール後に環境変数の変更を行います。

デスクトップの左下のWindowsのマークを右クリックして「システム」をクリックします。

次に関連設定の「システム情報」をクリックします。ウィンドウの状態で表示される位置が異なりますのでご注意ください。

Java-1

「システムの詳細設定」をクリックします。

あとはご紹介しているサイトを確認してもらえると環境変数の設定をできるかと思います。

また、プログラミングで実行するための命令文をソースコードと呼びますが、ソースコードはエディタを使用して書いていきます。メモ帳でも問題ありませんが、フリーのエディタをインストールして快適にプログラミングを行いましょう。

コンパイル

実際にソースファイルを作成して実行までの流れを見てみましょう。

エディタで以下のソースコードを入力してください。コピーペーストでも構いません。

class test01 {
    public static void main(String args[]) {
		    System.out.println("Hello World");
	  }
}

//コメントはコピーペーストしないでください
//右が切れる時は左にスワイプしてください

簡単にご説明させて頂きます。以下のようにクラスメソッドを定義しています。このサイトのPython入門をすでに見てもらった方はクラスとメソッドがどのようなものが理解されているかと思いますので以下のコードも何となく意味が分かるかと思いますが、とりあえずこういうふうに書くだけご紹介させて頂きます。

//クラスの定義
class ファイル名 { //※1  

    //メソッドの定義
    public static void main(String args[]) {  //※2
        処理A;    //最後にセミコロン ;  
        処理B;    //最後にセミコロン ;
    }  //※2
} //※1

//右が切れる時は左にスワイプしてください

ここで覚えておいてもらいたいのは2点あります。処理の最後に「; (セミコロン)」をつけることです。Pythonは不要ですがこれをつけ忘れるとエラーになりますので注意してください。

もう1点は※をつけていますが、処理の範囲(ブロック)の範囲を明確にするために「{ }」で囲む必要があります。こちらも1行ごとのセミコロンと同様に付け忘れるとエラーになります。Pythonでは処理の影響の範囲を{}で区切らずインデントで示すという違いがありました。

最後にこちらの記述は「Hello World」という表示を行うように命令します。とりあえず、こう書けばいいのかとだけ思ってもらえればと思います。

System.out.println("Hello World");

それではC:¥の直下に「Java_test」というフォルダを作成し、その中に「test01.java」と名前を付けて1番最初にご紹介したソースコードを保存してください。

JavaはPythonと異なりコンパイルという作業が必要になります。

コンパイルとは機械が理解できるようにソースコードを変換することです。日本語が分からないアメリカ人に日本語で話しかけても相手は理解できませんので、通訳の方にお願いするか辞書で英訳して英文で伝える必要があります。この例のように人が「Hello World」と表示してくれとコンピュータに伝えてもコンピュータは理解できませんので人が書いたソースコードを機械語に変換する必要があります。

このサイトでも解説しているPythonではこのコンパイルを行う必要はありませんでした。これはPythonとJavaの実行方式が異なるためPythonはコンパイルが不要なのです。このコンパイルを省略できることがPythonは手軽で初心者向きであると言われる理由の1つです。

Javaはソースコードを実行する前にコードの全てをコンピュータが理解できる機械語に翻訳する必要があります。このようなプログラミング言語の方式をコンパイル方式と呼び、コンパイルするためのソフトウェアをコンパイラと呼びます。

それに対してPythonはソースコードを毎回1行ずつ翻訳しながら実行するため最初にコンパイルを行う必要がありません。これのような方式をインタプリタ方式と呼びます。

コンパイル方式は最初に全部機械語に変換するという手間がかかる反面、実行速度が極めて速いという特徴があります。インタプリタ方式はその逆になりますが、ユーザーが実行前にコンパイルする必要がないため手軽ですが実行速度がコンパイル方式と比較すると遅いという特徴があります。一般論としては試作ではインタプリタ方式が向いていて、製品などではコンパイル方式が向いていると言われることが多いのですが、インタプリタ方式を支持する人は現在のハードウェア(コンピュータ)の処理がものすごく速いのでインタプリタで十分という主張もあります。

一般の道路を時速60km/hで走ることができれば軽自動車で十分、300km/h出せるフェラーリは不要という考え方です。しかも、ビッグデータのようにデータが膨大な場合は全部をコンパイルするのはものすごい時間がかかるため必要な部分だけを翻訳するインタプリタ方式がビッグデータ解析には向いているという意見もあります。ただ、僕が専門とするエレクトロニクス業界のマイコンなどはC言語で書いてコンパイルする方式がまだまだ多いです。研究ではなくアプリなど一般のユーザーが軽快に動いた方が良い製品を開発する業界ではやはりJavaなどのコンパイラ方式が今後も強いと考えられます。

それでは実際にコンパイルをしてみましょう。デスクトップの左下に「cmd」と入力してコマンドプロンプトを起動してください。

黒い無機質な画面が立ち上がり、慣れない方はかなりのアレルギー反応が出るかと思いますが大丈夫です。難しいことはありません。2~3分くらい画面を見続けているとアレルギーも落ち着いてくるかと思いますから落ち着いたら、まずは「cd c:¥Java_test」と入力してENTERキーを押してください。これで作業しているフォルダが最初に作成した「Java_test」に移動しました。

次に「javac test01.java」と入力してENTERキーを押してください。改行されるとコンパイル成功です。

Java_testのフォルダ内に「test01.class」というクラスファイルが作成されていることを確認します。

【もしもエラーが発生したら】
・ソースコードをコピーペーストしてください(記載していますが最後の2行は貼り付けないでください)
・Cドライブ(C:¥)に「Java_test」というフォルダを作成し、その中に「test01.java」というファイル名でソースファイルを保存していますか?
・コマンドの入力に間違いはありませんか?
・大文字、小文字は正しく入力していますか?
・全て半角英数で入力されていますか?

次回の「実行で」実際にクラスファイルを実行してみましょう。

>>目次に戻る

クラスファイルの実行

それでは前回コンパイルして生成されたクラスファイルを実行してみましょう。
「java test01」と入力してENTERキーを押してください。

画像に alt 属性が指定されていません。ファイル名: コンパイル⑧.png

クラスファイルを実行することに成功し、「Hello World」を表示できました。

偉そうに説明をしている僕ですが、久しぶりにJavaでソースファイルを書くとシンプルなこの動作を実行するのにもエラーを出してしまいました。エラー内容をご紹介させて頂きますので僕の失敗を参考にしてもらえればと思います。

Javaでは「//」とスラッシュを2つ付けるとその右側は無効になりメモのようにコメントを書くことができます。

class test01 {
	public static void main(String args[]) {
		System.out.println("Hello World");
	}
}

//スラッシュを2つ付けるとその右は実行されません
//半角英数でコメントをしても問題ありませんが
//日本語のコメントをするとエラーが出ました

上記のようにコメントを日本語で書いていたらコンパイル時にエラーが発生しました。

対策はコンパイル時に以下のように
「javac -encoding utf-8 ファイル名.java」をすると日本語のコメントを使用してもコンパイルが通ります。ただ、このサイトでは手間を省くために日本語のコメントは控えたいと思います。

僕は日常的にマイコン(マイクロコンピュータという電子部品)のプログラミングでC言語を使用し、このサイト立ち上げ時にPythonでずっとソースコードを書いていたのでJavaのこのようなルールをすっかり忘れてしまっていました。僕の失敗談を参考にしてもらえればと思います。

>>目次に戻る

変数

変数とはデータを保存しておく入れ物のことです。Javaのデータ型には以下のようなものがあります。 

データ型記号説明
整数型byte-128~127
short±約3万
int±約21億
long±約9,000,000兆
浮動小数点型float小数点7桁
double小数点16桁
文字列型String”  “で囲む “taro”
文字型char‘  ‘で囲む   ‘A’
論理型booleantrue, false

Pythonを先に学習された方に注意して欲しい重要なポイントがあります。Pythonでは文字列を「’」か「”」ではさむ必要がありましたが、Javaでは「”」しか使えませんので注意してください。その代わりに「’」を使用するchar(文字型)ですが、こちらは今回の最後にご説明します。

論理型とは条件を満たしていればtrue、満たしていなければfalseの2択だけを持つデータ型でブール型とも呼びます。

まずは変数の使い方を見てみましょう。解説は後ほどさせて頂きます。以下のソースコードをコンパイルして実行してみます。

class sum {
    public static void main(String args[]) {
        int num1 = 5;
        int num2 = 3;
        int sum = num1 + num2;

        System.out.println("SUM = " + sum);
    }
}

//コメントはコピーペーストしないでください
//右が切れる時は左にスワイプしてください

数値型の5 + 3を計算して結果の8を表示することができました。

int num1 = 5;
int num2 = 3;
int sum = num1 + num2;

最初にintが記述されています。これは変数のデータ型の宣言を行っています。Pythonではこの宣言が不要でしたがJavaやC言語などはこれから使用する変数がどのようなデータ型かを最初に必ず宣言をする必要があります。

//Pythonはいきなり変数を使用できる

num1 = 5  //代入すると自動でにint型になる
num2 = 3    
sum = num1 + num2

//-------

//Javaは最初に変数の宣言を行う必要がある

int num1 = 5;
int num2 = 3;
int sum = num1 + num2;

//右が切れたら左にスワイプしてください

変数の使い方について補足させて頂きます。こちらの「num1は5」というのが容易に理解してもらえるかと思います。このように変数の宣言を行ってから最初にデータを代入することを初期化と呼びます。

int num1 = 5;

では、こちらはどうでしょうか?

int num1 = 5;
num1 = num1 + 1;

こちらは数学では成立しない方程式ですね。2行目の左辺と右辺が等しくありません。こちらはプログラミングで代入を表しています。num1にさらに1を追加する、すなわち2行目でnum1は2になります。

num1 = num1 + 1;

Pythonにはない書き方でJavaやC言語には以下のような書き方もあります。それぞれインクリメントデクリメントと呼びます。

//それぞれ同じ意味
a = a + 1;
a++;  //インクリメント

a = a - 1;
a--;  //デクリメント

最後にchar型の使い方をご紹介します。アスキーコードをご存じでしょうか?アスキーコードとはコンピュータでは文字を表す場合に数値が割り振られており、例えばAは65が割り振られています。charを使用すると文字を数値に変換することができます。実際の使い方を見てみましょう。

class char1 {
    public static void main(String args[]) {
        char ascii = 'A';
        int num = ascii;

        System.out.println("'A' = " + num);
    }
}

//コメントはコピーペーストしないでください
//右が切れる時は左にスワイプしてください

char型はちょっと難しいので厳しいようでしたら、今回は飛ばしてもらっても構いません。直感的に分かりやすいものから理解しづらい型まで様々ですが、少しずつ慣れてもらえればと思います。

>>目次に戻る

四則演算

前回、変数の足し算を行いましたがもう少し詳しく変数の計算を行ってみましょう。算数で足し算、引き算よりもかけ算、割り算を優先し、「()」が最優先というルールはどのプログラミング言語でも同じです。演算子はPythonと同じで以下の記号を使用しますがPythonにあった「**」の累乗がJavaでは対応していませんので注意してください。(見やすいように演算子の項目は一部全角を使用していますが実際は半角で入力してください)

演算子意味
足し算
引き算
かけ算
/割り算の商
%割り算のあまり

実際に計算して動作を確認してみましょう。

class cal1 {
    public static void main(String args[]) {
        int num1 = 1;
        int num2 = 2;
        int num3 = 3;

        int result = num1 + num2 * num3 ;

        System.out.println("result = " + result);
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

1 + 2 × 3 を計算して7を表示することができました。 

次の2つの表記では計算結果が異なりますがなぜか分かりますか?(以下のソースコードはクラスやメソッドの定義を省略しています)

//計算式2  cal2
int num1 = 3;
int num2 = 2;
int result = num1 / num2;

//計算式3  cal3
float num1 = 3;
float num2 = 2;
float result = num1 / num2;

//右が切れたら左にスワイプしてください

計算式2の結果です。

計算式3の結果です。

計算式2は数値をint(整数型)で定義し、計算式3はfloat(浮動小数点型)で定義しています。そのため、計算式2は小数点以下が切り捨てになり、計算式3は小数点以下も有効になっています。

余談になります。Pythonは変数の型を定義せずいきなり計算できますがこのように浮動小数点型で認識して計算してくれます。

最後に文字列の計算も行ってみましょう。文字列は「’」シングルクォーテーションか「”」ダブルクォーテーションのどちらかで前後をはさんで定義します。

class str1 {
    public static void main(String args[]) {
        String myoji = "YAMADA";
        String name = "TARO";
        String shimei = myoji + name;

        System.out.println("SHIMEI = " + shimei);
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

今回、変数は同じ数であってもデータ型で結果が変化するということ、また文字列も足し算ができるということをご紹介しました。データ型や演算子を変えてテストしながら慣れることをおすすめします。

>>目次に戻る

比較演算子と論理演算子

比較演算子とはAとBの比較を行って条件を満たしているかを確認するための記号です。比較演算子を表にまとめます。

比較演算子意味
A > BAはBより大きい
A >= BAはB以上
A < BAはBより小さい
A <= BAはB以下
A == BAとBは一致する
A ! BAとBは一致しない

次に論理演算子とは2つの条件の両方、片方、もしくは満たしていないかを確認するために使用される記号です。論理演算子も表にまとめます。Pythonではandやor、notが使用されていましたがJavaでは記号になります。

論理演算子意味
 A && BAとBの両方が成立する
 A || BAとBの片方が少なくとも成立する
 !AAは成立しない

この比較演算子と論理演算子の使用例をご紹介します。

A < 5    //Aが5未満
A == 5   //Aが5と一致

A < 5 && B < 5  //Aが5未満かつBが5未満
A < 5 || B < 5  //Aが5未満かBが5未満もしくはAもBも5未満

//右が切れたら左にスワイプしてください

このような演算子を使用すると条件が一致した時としなかった時で処理を分岐することができるようになります。次回は分岐についてのご紹介をさせて頂きます。

>>目次に戻る

if文

if文とは前回ご紹介した比較演算子を使用して処理を分岐する場合に使用されます。if文の記述方法を以下にご紹介します。条件を定義した後に行う処理のブロックは「{}」で囲みます。

if (条件A) {
    処理A;
} else {
    処理B;
}

実際に動作を確認してみましょう。身長が170cm以上だとL、170cm未満だとMを表示するソースコードを書いてみます。

class size1 {
    public static void main(String args[]) {
            int ht = 168;
		
            if (ht >= 170) {
                System.out.println("L");
            } else {
                System.out.println("M");
            }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

次は分岐を2択ではなく3つ以上したい場合に使用するelse if文をご紹介します。ちなみにPythonではelif文とちょっと短縮されています。else if文による分岐はいくつでも用意することができます。もしも、仮に条件Aと条件Bの両方を満たす場合は前の条件が優先されて片方の処理のみ実行されます。

if (条件A) {
    処理A;
} else if (条件B) {
    処理B;
   ・
   ・
   ・
} else {
    処理C;
}

身長が180cm以上であればLL、180cm未満かつ(&&)170cm以上はL、170cm未満はMと表示するソースコードを作成します。今回は比較演算子と合わせて論理演算子も使ってみます。

class size2 {
    public static void main(String args[]) {
            int ht = 175;
		
            if (ht >= 180) {
                System.out.println("LL");
            } else if (ht < 180 && ht >= 170) {
                System.out.println("L");
            } else {
                System.out.println("M");
            }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

Pythonのif文でもご説明しましたが、if文の中にもif文を書くことができますがそのような状態をネストと呼び、if文の中にif文、さらにif文と続くことをネストが深いという言い方をし、理解しづらい書き方の代表例になりますので注意してください。

>>目次に戻る

switch文

switch文は変数の値によって処理を分岐したい場合に使用されます。if文でも同じ処理を実現できますがswitch文の方が記述が少なくすっきりと書ける場合があります。基本的な書き方をご紹介します。

switch (変数) {
    case a:    //:コロンが必要
        処理A;
        break; //最後にbreak
    case b:
        処理B;
        break;
        ・
        ・
        ・
    default:
        処理C;
}

実際にswitch文を使用してみます。aという変数が0か1の時にはその変数を表示し、それ以外の時にはelseと表示させるソースコードです。

class switch1 {
    public static void main(String args[]) {
        int a;

        a = 1;
        switch (a) {
            case 0:
                System.out.println(a);
                break;
            case 1:
                System.out.println(a);
                break;
            default:
                System.out.println("else");
        }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

好みによるところが大きいですが、条件はswitch文の方が見やすく、if文だとbreakが不要なので記述は少なくて済みますね。また、if文は「<」などの比較演算子や「&&」などの論理演算子も条件に入れられるので様々な条件に対応できるというメリットがあります。状況に応じて使い分けてください。

//if文の場合
if (a == 0) {
    System.out.println(a);
} else if (a == 1) {
    System.out.println(a);
} else {
    System.out.println("else");
}

//switch文の場合
switch (a) {
    case 0:
        System.out.println(a);
        break;
    case 1:
        System.out.println(a);
        break;
    default:
        System.out.println("else");
}

//右が切れたら左にスワイプしてください

>>目次に戻る

for文

for文とはカウントを行いながら繰り返しの処理をする構文です。基本的な記述の方法は以下の通りです。

for (カウンタに初期値代入; 条件 ;カウントアップ) {
    処理1;
    処理2;
   ・
   ・
   ・
}

//右が切れたら左にスワイプしてください

実際にfor文の動きを見てみましょう。カウンタはiを使用し初期値は0で5になるまでカウンタの値を表示します。

class for1 {
    public static void main(String args[]) {
            int i;
        
            for (i = 0; i <= 5; i++) {
                    System.out.println(i);
            }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

ここで補足させて頂きます。カウンタ(カウントアップの変数)には「i」を使用しましたが、別にaでも動きには問題ありません。iを使用した理由はプログラミング業界では暗黙のうちに繰り返しのカウンタにはiが使用されるからです。これはJavaだけでなくC言語やPythonでも同じでプログラミングに慣れている方が見ると「これは繰り返しの回数をカウントしている変数だな」と理解してもらえますので特別な事情がなければカウンタはiを使用した方が無難です。

>>目次に戻る

while文

while文もfor文と同様に繰り返しの処理をする構文です。基本的な記述の方法は以下の通りです。

while (条件) {
    処理1;
    処理2;
   ・
   ・
   ・
}

実際にwhile文の動きを見てみましょう。カウンタはiを使用し初期値は0で5以下の場合はカウンタの値を表示します。

class while1 {
    public static void main (String args[]) {
        int i = 0;
        
        while (i <= 5) {
            System.out.println(i);
            i++;
        }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

do-while文という処理の仕方もあります。これは最初の1回目は条件を確認しないで処理を行うという特徴があります。

do {
    処理1;
    処理2;
   ・
   ・
   ・
} while (条件);    //最後にセミコロン

先ほどのソースコードをベースにdo-while文の動作を確認してみます。

class do_while1 {
    public static void main (String args[]) {
        int i = 0;
        
        do {
            System.out.println(i);
            i++;
        } while (i <= 5) ;
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

while文には条件をtrue固定にすることで無限ループさせる方法があります。

class inf_while {
    public static void main (String args[]) {
        int i = 0;
        
        while (true) {
            System.out.println("inf.roop");
            i++;
        }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

「inf.roop」の表示がその名の通り無限に続いていきます。右上の×を押して終了しましょう。無限ループは広く使われる処理なのでぜひ覚えておいてください。

>>目次に戻る

配列

配列とは複数のデータを一覧で管理するデータ型です。以下は配列を定義する方法ですが、2パターンご紹介します。

//定義方法1
データ型 変数名[] = new データ型 [要素数];

//定義方法2
データ型 変数名[] = {要素1, 要素2,・・・};

//右が切れたら左にスワイプしてください
//定義方法1の例
int list[] = new int [5];
list[0] = 0;
list[1] = 1;
list[2] = 2;
list[3] = 3;
list[4] = 4;

// []の数字がインデックス(添え文字)
//インデックスは0から始まります

//定義方法2の例
//インデックス 0  1  2  3  4
int list[] = {0, 1, 2, 3, 4};

//右が切れたら左にスワイプしてください

定義方法1と定義方法2を使用してソースコードを作成して動きを確認してみます。実行結果はどちらも同じになります。

【定義方法1】

class list1 {
    public static void main(String args[]) {
        int list[] = new int [3];
 
        list[0] = 0;
        list[1] = 1;
        list[2] = 2;
        
        System.out.println(list[0]);
        System.out.println(list[1]);
        System.out.println(list[2]);
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

【定義方法2】

class list2 {
    public static void main (String args[]) {
        int list[] = {0, 1, 2};
       
        System.out.println(list[0]);
        System.out.println(list[1]);
        System.out.println(list[2]);
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

for文を組み合わせると「System.out.println」を何度も書く必要がなくシンプルになります。

class list3 {
    public static void main (String args[]) {
        int i;
        int list[] = new int [3];
 
        list[0] = 10;
        list[1] = 11;
        list[2] = 12;

        for (i = 0; i <= 3; i++) {
            System.out.println("index["+ i +"]=" + list[i]);
        }
    }
}

//コメントはコピーペーストしないでください
//右が切れたら左にスワイプしてください

配列の応用もあるのですが今回は省略させて頂きます。興味をお持ちの方は2次元配列拡張for文で検索してみてください。

>>目次に戻る

オブジェクト

オブジェクトを言葉で説明するのは難しいのでソースコードでご説明させて頂きます。

太郎は身長170cm、体重60kg、35歳です

この例の場合、太郎は「太郎という名前」「身長は170cm」「体重は60kg」「年齢は35歳」という情報(プロパティ)を持つ物体ですね。物体は英語でオブジェクト、つまり太郎さんは身長、体重、年齢のデータを持つオブジェクトです。これをPythonのプログラミングのルールに則って表現すると以下のようになります。

//太郎は以下の情報を持つオブジェクト
taro.name = "taro";
taro.ht = 170;
taro.wt = 60;
taro.age = 35;

//変数名.フィールド = データ; で定義する

//右が切れたら左にスワイプしてください

初めて見られた方も何となくイメージしやすいのではないでしょうか?ここでname、ht、wt、ageをフィールドと呼びます。

クラスとインスタンス

クラスとインスタンスについて今回はご説明します。このサイトのPythonを学習された方がスムーズに理解してもらえるように同じ例で進めていきます。

ライザップという有名なスポーツジムで例えたいと思います。ライザップでは入会申込書が用意されています。この未記入の入会申込書がクラスのイメージです。項目は決まっていますが具体的な数値や文字列は入っていません。空っぽの入会申込書からはどんなお客様かイメージできません。

入会申込書
氏名name
身長ht
体重wt
年齢age

太郎さんが入会申込書の各項目(フィールド名)に記入しました。

入会申込書
氏名nametaro
身長ht170
体重wt60
年齢age35

記入された入会申込書からは太郎さんがイメージできるようになりました。このように具体的な数値や文字列などのデータを持ったクラスがインスタンスです。

入会申込書に記入できるのは「人」だけなので、入会申込書に記入を行った「太郎さんは人です」という条件も付けたいと思います。

//クラスの定義 人は以下の情報を持つ
class human
{
    String name;
    float ht;
    float wt;
    int age;
}

//太郎は人です と定義

クラス名 変数名 = new クラス名();
human    taro  = new  human();

実際にソースコードで確認してみます。

//クラスの定義
class human
{
    String name;
    float ht;
    float wt;
    int age;
}

class taro_human
{
    public static void main (String args[]) {

        //インスタンス化
        human taro = new human();
        taro.name = "taro";
        taro.ht = 170;
        taro.wt = 60;
        taro.age = 35;
  
        System.out.println(taro.age);
        System.out.println(taro.ht);
        System.out.println(taro.wt);
    }
}

//コメントはコピーペーストしないでください
//または-encoding utf-8をつけて
//コンパイルしてください
//右が切れたら左にスワイプしてください

前回分と合わせてここまでをまとめると、人である太郎は空欄の入会申込書(クラス)の項目(フィールド)に太郎の身長や体重などの具体的なデータ(プロパティ)を入力すると(インスタンス化)、今まで空欄で意味を持たなかった入会申込書から太郎という具体的なイメージ(インスタンス)ができました。

ここで前回の太郎のオブジェクトとインスタンス化で定義しているものが全く一緒じゃないかと思われたかと思います。実はそうです。インスタンスの別名がオブジェクトになります。Pythonも考え方は同じです。

>>目次に戻る

メソッド

メソッドとはオブジェクトに行う処理のことです。Pythonではメソッドよりも先に関数をご紹介しましたが今回はメソッドのみをまずはご説明させて頂きます。

まずは引数戻り値という2つの重要な用語について解説します。

「y = 2x」という数学の関数を例にすると関数に与えるxによって結果であるyが変化します。プログラミングでこのxに相当する「関数に与える変数を引数」、yに相当する「関数で計算された結果を戻り値」と呼びます。引数と戻り値は重要なキーワードなのでまずご理解をお願いします。

前回、ライザップに入会した太郎さんを例にメソッドをご説明します。

おさらいですが、未記入の入会申込書がクラス、太郎さんが自分の身長や体重などのデータ(プロパティ)を記入して具体的になったものがインスタンス(オブジェクト)でした。

太郎さんはどのくらい減量したいかによってコースを選択します。太郎さんは標準コースを選びました。このコース(メソッド)は入会申込書(クラス)にしっかりと記載されています。すなわちクラスの宣言の中でメソッドを定義する必要があります。

コースメソッド
軽め5%減wt * 0.95
標準10%減wt * 0.9
ハード20%減wt * 0.8

前回のソースコードに体重を0.9倍にする「rizap」というメソッドを追加して動作させてみます。最後にPythonとの比較もしてみます。

//クラスの定義
class human
{
    String name;
    float ht;
    float wt;
    int age;

//メソッドを追加
    float rizap()
    {		
        return wt * 0.9f; //floatの小数は最後にf
    }
}

//taro_rizapに変更
class taro_rizap
{
    public static void main (String args[]) {

        //インスタンス化
        human taro = new human();
        taro.name = "taro";
        taro.ht = 170;
        taro.wt = 60;
        taro.age = 35;
  
        System.out.println(taro.age);
        System.out.println(taro.ht);
        System.out.println(taro.wt);
        System.out.println(taro.rizap());		
    }
}

//コメントはコピーペーストしないでください
//または-encoding utf-8をつけて
//コンパイルしてください
//右が切れたら左にスワイプしてください

今回は日本語のコメントがあってもエラーが発生しない方法でコンパイルしてみました。それではメソッドの定義についてご説明します。

戻り値のデータ型  メソッド名()
{		
    処理1
   ・
   ・
   ・    
    return 戻り値;
}

//戻り値のがない場合はreturnの記述は不要
//その場合は最初の戻り値のデータ型はvoid

//メソッドを使用する場合
変数名.メソッド名()

//引数がある場合は()の中に記入
//右が切れたら左にスワイプしてください

次に体重を0.9倍にするメソッドの定義をPythonとJavaで比較します。Pythonをまだ学習されていない方は飛ばしてもらってもOKです。

//Pythonでのメソッドの定義
def rizap(self):   //先頭はdef
    return self.wt * 0.9


//Javaでのメソッドの定義
float rizap()     //先頭は戻り値のデータ型
{		
    return wt * 0.9f;  //最後にf
}

//右が切れたら左にスワイプしてください

並べてみると似ているようでだいぶ違いますね。まず、JavaではPythonで使用していたselfを記述する必要がありません。Javaにはselfと似た考え方にthisというものがありますが、今回は省略します。

また、0.9の後に「f」がついています。これは小数にfをつけるとfloat型、fがないとdouble型を表すというルールになっているためです。そのため今回の例ではfがないとエラーになります。とりあえず、現時点ではfloat型では最後にfをつけるとだけ覚えてもらえればと思います。

>>目次に戻る

BMIを計算

前回のソースコードを一部変更してBMIを計算するソースコードをご紹介します。BMIの判定基準を引数としてメソッドに渡し、if文でBMIの結果を判定して表示を変化させます。さらに太郎だけではなく次郎も追加しました。まずはコピーペーストして動きを確認してください。

//クラスの定義
class human
{
    String name;
    float ht;
    float wt;

//メソッド
    void bmi_cal(float level)
    {		
        float bmi;
        bmi = wt / (ht * ht);

        System.out.println(name);
        System.out.println(bmi);
       
        if (bmi > level) {
            System.out.println("肥満気味です");
        } else {
            System.out.println("問題ありません");
        }
    }
}

//bmi_testに変更
class bmi_test
{
    public static void main (String args[]) {
 
        float ft_level = 25.0f;  //BMI判定基準  
  
        //太郎でインスタンス化
        human taro = new human(); 
        taro.name = "taro";
        taro.ht = 1.7f;
        taro.wt = 60;
  		
		    //次郎をインスタンス化
        human jiro = new human(); 
		    jiro.name = "jiro";		
        jiro.ht = 1.65f;
        jiro.wt = 80;
		
        taro.bmi_cal(ft_level);  
        jiro.bmi_cal(ft_level);		
    }
}

//コメントはコピーペーストしないでください
//または-encoding utf-8をつけて
//コンパイルしてください
//右が切れたら左にスワイプしてください

ソースコードの内容を理解してもらえましたか?何度も自分の手で打ち込み、内容をちょっと変化させて結果がどう変わるかを確認するとより効果的です。例えば、小数のfを外したらエラーになりますが、fを外してもエラーが出ないようにするにはどうしたら良いかをネットで調べるとより理解度を高めることができるかと思います。

>>目次に戻る