■mainメソッド・インスタンス・メソッドの呼び出し
はじめに
この課題が終われば、もう簡単なコードは読めるはずです!
構造的な話で言えば、これまでやってきたこと以外で、javaのコードは成り立っていません。
それくらい大切な部分です。よくわかんないのは最初だけです!焦らず慣れて行きましょう慣れていきましょう。
Step1: mainメソッド
mainメソッドはJavaのプログラムにおける全ての始まりです↓
... public static void main(String[] args) { ... }
mainメソッドの決まり事①
mainメソッドは特別なメソッドです。
一番最初にmainメソッドの処理が実行されるため、
「プログラムのエントリポイント(入り口)」
と考えるとよいでしょう。
mainメソッドの決まり事②
mainメソッドは一つのクラスに一つしか記述することができません。
mainメソッドの決まり事③
mainメソッドは、「 public static void main(String[] args)
」という形式で記述します。
一字一句間違えないように記述しましょう。
また、mainメソッドはString
の配列、 args
という名前の 引数 を持っています。
明確な使い所はありますが、今は頭の片隅にでも入れておきましょう。
Step2: クラス
Javaで重要な用語として「 クラス 」というものがあります。
簡単にいうと、「データ」と「処理」の集まりのことで、よく 設計図 と言われます。
人にも、「名前」があったり、「特技」や「趣味」があります。
これを「パラメータ」と呼びます。
ビジネスマンであれば、「営業」や「休憩」などの「動作」があります。
これは「操作」と呼ばれます。
わかりやすい画像があるので↓を見てみてください。
コンストラクタなど、知らない単語は一旦おいてとください!
どんな中身かというと簡単に↓のようなものになっています。
//businessman.java public class businessman { //======パラメータ====== private String name = null; //なまえ private int gender = 0; //性別(1:男 2:女) private int length = 0; //身長 private int weight = 0; //体重 private String skill = null; //特技 private String magic = null; //趣味 //コンストラクタ public businessman() { } //======操作====== //・営業をする //・休憩する }
プログラムの上部にあるパラメータのまとまりを フィールド変数 といいます。
フィールド変数を宣言するときには、「 public 」や「 private 」などの アクセス修飾子 と呼ばれるものを記述します。
何度か見たことがあるかと思いますが、
publlic static void main (String args[]){ }
の public の部分です。
アクセス修飾子は、省略することも可能です。
フィールド変数として宣言したものは、そのクラス内であればどこからでも値を参照したり更新したりすることができます。
先ほど出た「アクセス修飾子」には、下記のような種類があります。
どこからなら参照させてOKかというものを決めます。
後ほど説明しますので、こんな種類があるのか。くらいで大丈夫です。
アクセス修飾子 | 概要 |
---|---|
public | すべてのクラスからアクセスできる |
protected | 現在のクラスとサブクラスからアクセスできる |
なし | 現在のクラスと同じパッケージのクラスからアクセスできる |
private | 現在のクラスからだけアクセスできる |
クラスはと、そのままではただの設計図なので、設計図からモノを作る必要があります。
これをインスタンス化といいます。
作られたものをインスタンス(実態、実際のモノ)といいます。
インスタンス化するにはNew演算子
を使います。
例えばTaiyaki
というクラスの変数であれば
Taiyaki tai = new Taiyaki();
のように記述して、new演算子によりTaiyakiクラスを呼び出してtai
という名前で使用可能な状態にします。
たい焼きの型(クラス)をインスタンス化してたい焼き(実体)を作るみたいなイメージです。
生成されたインスタンスをもとにして、そのクラスに宣言してあるフィールドを参照したり、
定義してあるメソッドを呼び出したりすることができるようになります。
インスタンスの生成は、 他のクラス内やmainメソッド内など、さまざまな場所で行うことができます。
例
例えば下記に示すものは、Exampleクラスのインスタンスを生成する記述です。
① クラス名
② インスタンス名(変数名)
③ 「=」で結んで、new演算子
④ コンストラクタ名
の順で記述します。
コンストラクタについては後述しますが、①と④は見た目は同じですが違うものと覚えておいてください。
(最初のクラス名「Example」
と最後のコンストラクタ名「Example()」
が 同じ )
改めて、インスタンス化の構文は↓になります。
クラス名 インスタンス名 = new コンストラクタ(引数の値);
Step3: コンストラクタ
先ほど出てきた__コンストラクタ__について説明します。
コンストラクタとはズバリ、 クラスをnewした瞬間に実行される関数のこと です。
コンストラクタと他のメソッドを見分ける基準は クラス名と同じ名前のメソッド名 が
コンストラクタになります。
Step2:クラスのbusinessmanクラスを例にとって考えてみましょう。
複数のパラメータをもったbusinessmanクラスがあります。
これは、ビジネスマンを形作る設計図になります。
今回は操作も追加してみました。
//businessman.java public class businessman { //======パラメータ====== private String name = null; //なまえ private int gender = 0; //性別(1:男 2:女) private int length = 0; //身長 private int weight = 0; //体重 private String skill = null; //特技 private String hoby = null; //趣味 //コンストラクタ public businessman() { this.name = "サラリーマン金太郎"; this.gender = 1; this.length = 180; this.weight = 80; this.skill = "商談"; this.hoby = "編み物"; } //======操作====== //営業メソッド public void sales() { System.out.println(this.name + "は外回りにいってきます!"); } //休憩メソッド public void rest() { System.out.println(this.name + "は" + this.hoby + "をして休憩しています。"); } public static void main(String[] args) { businessman bm = new businessman(); bm.sales(); bm.rest(); System.out.println(bm.skill + "が得意です!"); } }
コンストラクタに注目してください。
コンストラクタとは、__クラスをnewした瞬間に実行される関数のこと__です。と申し上げましたが、
businessman bm = new businessman();
にてbusinessmanクラスのインスタンス(実体)を作成した時に
コンストラクタが実行されます。
コンストラクタの中にthis
とありますがこれは、__このクラスの__という意味です。
例として、this.name = "サラリーマン金太郎";
は、フィールド変数のname
に値を代入しています。
クラスの中にあるメソッドはクラス名.メソッド名()
で呼び出すことができます。
また、メソッドだけではなく変数にもクラス名.変数名
でアクセス可能です
実行結果は下記のようになります。
Step4: カプセル化
少しレベルをあげて、カプセル化というものに触れてみましょう。
カプセル化とは、作成したクラスのデータ(フィールド)
や処理(メソッド)
を他のクラスから隠蔽することで、
作成したクラスに対する アクセス方法を限定する プログラミング技法です。
隠蔽などと難しい表現をしていますが、その実体は private
です。
必要性は?
「カプセル化」することによって、作成したクラスが何をしてくれるクラスなのかが 明確 になり、
他のクラスから使用しやすくなります。
また、 オブジェクト指向 においてはそのようにプログラミングするのが一般的です。
オブジェクト指向については次の章で解説していきますが、
オブジェクト指向とは、作りたいもの(オブジェクト)を、一つ一つの部品に分けて作っていくことです。
具体的には、通常はフィールドのアクセス修飾子をprivate
にして、メソッドのアクセス修飾子をpublic
にしておきます。
そのようにすれば大概はカプセル化
になっています。
アクセス修飾子の復習
アクセス修飾子とは、public
、protected
、private
といった修飾子のことで、
クラスや変数がどこからアクセス可能であるかを決定します。
アクセス修飾子 | 概要 |
---|---|
public | すべてのクラスからアクセスできる |
protected | 現在のクラスとサブクラスからアクセスできる |
なし | 現在のクラスと同じパッケージのクラスからアクセスできる |
private | 現在のクラスからだけアクセスできる |
例えば、 猫 をクラスとして考えてプログラミングしていきます。
なお、コンストラクタも通常のメソッドのように引数を受け取ることができるので
例を参考に復習してみてください。
メソッドについて忘れてしまった場合には→ メソッド
Cat クラス
public class Cat { private String name; public int age; public Cat(String n, int a) { name = n; age = a; } public void showName() { System.out.println("名前は、" + name + "です。"); } public void showAge() { System.out.println("年齢は、" + age + "才です。"); } public void agePlus() { age++; } }
Main クラス
public class Main { public static void main(String[] args) { Cat pepe = new Cat("ぺぺ", 3); // ←こちらで3歳と設定していますが、、、 pepe.agePlus(); pepe.age = 0; //←ageはカプセル化されてないために、このように不正な代入が行われる可能性がある! pepe.showName(); pepe.showAge(); } }
【実行結果】
名前は、ぺぺです。 年齢は、0才です。
解説
このCatクラスは、フィールドに猫の名前
と年齢
を持っています。
コンストラクタ では、引数に猫の名前と年齢の値を受け取り、それをもとにインスタンスを生成します。
続いて、アクセス修飾子が private
になっている name
の値を書き換えてみましょう。
Main クラス
public class Main { public static void main(String[] args) { Cat pepe = new Cat("ぺぺ", 3); pepe.agePlus(); pepe.age = 0; pepe.name = "タマ"; //←追加 pepe.showName(); pepe.showAge(); } }
下記の画像のようにコーディング段階でエラーが出力されているかと思います。
カプセル化(他のクラスから隠蔽)によって値の変更ができないようになっています。
イメージしやすい画像があったので参考までに載せておきます!
ぜひカプセル化を理解してプログラミングの幅を広げていきましょう!
課題
Java2章からはEclipseでの課題対応となります。
※ プロジェクトの作成方法については Eclipseの使い方 を参考にしてください。
プロジェクト名・・・ 2-2
パッケージ名 ・・・ study (java クラス作成時に設定してください。)
Java クラス名 ・・・ Main.java、Study.java (下記コードをコピー)
・Main.java
package study; /** * Main.java * * 本課題では、mainメソッド・インスタンス・メソッドの呼び出しの使い方を学んでいきましょう。 * 課題範囲は以下のとおりです。 * Study.java: 問① * Main.java: 問①から問② * 指定された値と変数名を守って記述してください。 * */ public class Main { public static void main(String[] args) { // ① 以下のルールに従いAccountクラスのインスタンスを生成してください。 // 変数名:「account」 // ② ①のインスタンス変数より、アカウント情報をコンソール出力するメソッドを呼び出しなさい。 } }
・Study.java
package study; /** * Study.java */ class Account { // フィールド変数 private String userName; private int id; private String password; // コンストラクタ public Account(String userName, int id, String password) { this.userName = userName; this.id = id; this.password = password; } // ① 以下のルールに従いアカウント情報(名前、ID、パスワード)を出力するメソッドを作成してください。 // アクセス修飾子:「protected」 // メソッド名:「printAccountInfo」 }
以下の添付画像のようにコンソールへ出力されるよう課題を実施し提出してください。
課題を提出するときには、「2-2」ディレクトリ配下にあるすべてのファイルをコミット、プッシュしてください。