第11章 メンバ変数とメンバメソッド
メンバ変数とメンバメソに関する基本的な考え方について説明します
homepage
# **メンバ変数とメンバメソッド** *** クラスは次の要素で構成されています。 ``` public class Classname{ //メンバ変数定義 //メンバメソッド定義 } ``` <br> ## **1.メンバ変数とは** メンバ変数とはクラスのメンバとして定義され、クラス内に直接書かれる変数のことで、フィールドまた属性と呼ばれます。 フィールドはクラス内のメソッドから参照可能な変数になっています。 [Television.java] ``` class Television{ int channelNo;//メンバ変数 void setChannel(int newChannelNo){ channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } } ``` <br> ### **1-1.メンバ変数の定義** ``` [修飾子] データ型 変数名; ``` * メンバ変数は、int、doubleなどの基本型だけでなく、クラス型、配列型の変数も定義できます。 <br> ### **1-2.メンバ変数に値を格納する** * メンバ変数が定義されている同じクラスの中で値を格納する * メンバ変数が定義されているクラスのメソッドを使って値を格納する [Television.java] ``` public class Television{ int channelNo; void setChannel(int newChannelNo){ //同じクラスの中で値を格納 channelNo = newChannelNo; //「自分自身のクラス」にあるメンバ変数の正式な記述方法が下記ですが、this省略可です。 //this.channelNo = newChannelNo; } void dispChannel(){ System.out.println("現在のチャンネルは " + channelNo + " です"); } } ``` <br><br> [Ctest.java] ``` public class Ctest{ public static void main(String args[]){ Television tv1 = new Television(); //違いクラスの中で値を格納 tv1.channelNo = 1; tv1.dispChannel(); } } ``` <br> * **メンバ変数とローカル変数の違い** ローカル変数とはメソッド内で定義される変数のことです。 このローカル変数の有効範囲(スコープ)としてはメソッド内だけなので、他のメソッドから別のメソッドのローカル変数にアクセスすることはできませんし、メソッドを抜けるとそのローカル変数は消滅します。 [JmSaple.java] ``` public class JmSaple { int memberVar = 10; //メンバ変数memberVarを定義 void methodA() { int localVarA = 20; //ローカル変数localVarAを定義 //メンバ変数なので他のmethodAから参照可能 System.out.println("メンバ変数(memberVar):" + this.memberVar); //methodA内に定義したローカル変数なのでmethodAから参照可能 System.out.println("ローカル変数(localVarA):" + localVarA); //methodA内に定義したローカル変数ではないのでmethodAから参照不可 //System.out.println("ローカル変数(localVarB):" + localVarB); } void methodB() { int localVarB = 20; //ローカル変数localVarBを定義 } } ``` <br><br> ## **2.メンバメソッドとは** メンバメソッドとはクラスの中で定義されているメソッドのことで、そのクラスの中で何かの動作をするためのものです。 メソッドを呼び出すときに引数を指定したり、メソッドからの戻り値を設定することもできます。 <br> ### **2-1.メソッドの定義** ``` [修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ....){ } ``` <br> 何も値を返さない場合はvoid型を指定することになっていますので、とりあえず「void」を記述して下さい。 #### **例** [JSample11_1.java] <pre><code>package JmSaple; public class JSample11_1 { public static void main(String[] args) { departure(); arrive(); annouce(); } private static void departure() { System.out.println("出発します。"); } private static void arrive() { System.out.println("到着します。"); } private static void annouce() { departure(); arrive(); } } </code></pre> #### **実行結果** <pre> <iframe src="javascript:'<html> 出発します。<br> 到着します。<br> 出発します。<br> 到着します。 </html>'"></iframe> </pre> ### **2-2.メソッドの呼び出し** メンバメソッドの呼び出し方は、メンバ変数の場合と同様で、同じクラス内から呼び出す場合には「メンバメソッド名(引数)」か「this.メンバメソッド名(引数)」と記述しますし、メンバメソッドが定義されているクラスの外からオブジェクトを介して呼び出す場合には「オブジェクト名.メンバメソッド名(引数)」の形式で呼び出します。 下記の例に、mainメソッドで、 myMethod()メソッドを呼び出します。 #### **例** [JSample11_2.java] <pre><code>package JSample; public class JSample11_2 { static void myMethod() { System.out.println("Hello World!"); } public static void main(String[] args) { myMethod(); } } </code></pre> #### **実行結果** <pre> Hello World! </pre> **・引数を使ってメソッドに値を渡す** <br> メソッドを呼び出す時に呼び出し元から値をメソッドに渡すことができます。まずどのような場合に使うのかを確認してみます。 #### **例** [JSample11_3.java] <pre><code>package JSample; public class JSample11_3 { public static void main(String[] args) { int english = 58; check("英語", english); } private static void check(String language, int score) { System.out.print("この応募者の" + language + "能力は"); if (score > 70) { System.out.println("ビジネスレベルです。"); } else { System.out.println("日常会話レベルです。"); } } } </code></pre> #### **実行結果** <pre> この応募者の英語能力は日常会話レベルです。 </pre> <br> **・return文** **(1)** メソッドから呼び出し元に値を返す場合。 #### **例** [JSample11_4.java] <pre><code>package JSample; public class JSample11_4 { public static void main(String[] args) { int kekka; kekka = bai(5); System.out.println(kekka); } private static int bai(int n) { return n * 2; } } </code></pre> #### **実行結果** <pre> 10 </pre> <br> **(2)** return文がメソッドの中で実行されると、それ以降の処理を実行せずに呼び出し元へ処理を移すことができます。 #### **例** [JSample11_5.java] <pre><code>package JSample; public class JSample11_5 { public static void main(String[] args) { int data[]; test(15, 4); test(7, 0); } private static void test(int n1, int n2) { if (n2 == 0) { System.out.println("0で割ることはできません"); return; } System.out.println(n1 + " / " + n2 + " = " + (n1 / n2)); return; } } </code></pre> #### **実行結果** <pre> 15 / 4 = 3<br> 0で割ることはできません </pre> <br> ## **3.コンストラクタ** コンストラクタとは、クラスのインスタンス生成時に実行されるメソッドで、主にそのクラスのメンバ変数を初期化するときに使用します。 コンストラクタはインスタンス生成時に呼び出される特別なメソッドで、通常のメソッド同様に引数を指定することも可能です。 ``` public class Calculate { private double syohizei; //クラス名と同一のメソッド名であるコンストラクタを定義 //コンストラクタの中では、メンバ変数syohizeiの初期値を指定 public Calculate (double x) { this.syohizei = x; } ----- その他の処理 ----- } ``` <br> ### **3-1.コンストラクタの定義** ``` [アクセス修飾子] コンストラクタ名 (引数型 引数名) ``` <br> ### **3-2.複数のコンストラクタ** コンストラクタは引数の型や引数の数を変更することで1クラス内に複数宣言することができます。 例えば、コンストラクタ内でいくつかのメンバ変数を初期化する場合、指定する初期値があるときは指定し、ない時はデフォルト値を指定するというように、初期化処理を使い分けたいケースがあります。このような時にコンストラクタを複数宣言します。 どのコンストラクタが呼び出されるかは呼び出し元の引数の型、引数の数により決定されます。 #### **例** [SetNumber.java] ``` package JSample; public class SetNumber { private int basicNum; private int specialNum; //int型の引数を持つコンストラクタ public SetNumber(int spn) { this.basicNum = 100; this.specialNum = spn; } //引数を持たないコンストラクタ public SetNumber() { this.basicNum = 100; this.specialNum = 500; } public static void main(String[] args) { //コンストラクタの呼び出し、引数を指定しない SetNumber insA = new SetNumber(); System.out.println("insAのSetNumber()でbasicNumは" + insA.basicNum+"です"); System.out.println("insAのSetNumber()でspecialNumは" + insA.specialNum+"です"); //コンストラクタの呼び出しにint型の引数1つを指定 SetNumber insB = new SetNumber(1000); System.out.println("insBのSetNumber(1000)でbasicNumは" + insB.basicNum+"です"); System.out.println("insBのSetNumber(1000)でspecialNumは" + insB.specialNum+"です"); } } ``` #### **実行結果** <pre> insAのSetNumber()でbasicNumは100です<br> insAのSetNumber()でspecialNumは500です<br> insBのSetNumber(1000)でbasicNumは100です<br> insBのSetNumber(1000)でspecialNumは1000です </pre> <br> *** > **練習** >> **問題**[JEx11_1.java] Numクラス(Num.java)を使用して、2 整数の比較は最大値を取ります、次のプログラムを完成しなさい。 ``` package JSample; public class Num { public int test(int n1, int n2) { //ToDo } } ``` JEx11_1クラスを使用して、次のプログラムを完成しなさい。 ``` package JSample; import java.util.Scanner; public class JEx11_1 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("キーボードから数値1を入力してください。"); int n1 = scan.nextInt(); System.out.println("キーボードから数値2を入力してください。"); int n2 = scan.nextInt(); Num num = new Num(); int k = num.test(n1, n2); System.out.println(n1 + " と " + n2 + " 比較的な最大値は:" + k); } } ```
content
戻る