2003 -0308 ver 0.95 原稿完成 -0318 ver 1.10 Java 規則 「インスタンスメソッドとは」追加 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2003 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 7928部(まぐまぐ:6591 melma!:753 Pubzine:475             ティアラオンライン:19 めろんぱん:90) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第40号 2003/03/08  クラスとインスタンスのメソッドと変数 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.4.0,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ========================================================================= 交換広告(交換希望の方は,jmaga@yscon.co.jpまで) ----☆PR☆--------------------------------------------------------------           コンピュータ関係の資格を取りたい方へ              毎日届く,宿題メールの勉強仲間に入りませんか? ..&&&& **** %%%%. &&&&&&******%%%%%% 登録: http://backno.mag2.com/reader/Back?id=0000001414 '&┃&''*┃*''%┃%' 発行元:末広ページ http://www.3721p.com --------------------------------------------------------------☆PR☆---- ======================================================================== ▼ 第39号の訂正  第39号の訂正をします。  オーバーロードの日本語は,「多重定義」です。間違って,再定義と書いたと ころが数カ所ありました。  多重定義(オーバロード)において,引数のパターンが違うことにそれぞれ定義 ができますが,戻り値型の違いだけでは,多重定義はできません。勘違いしてい ました。同一メソッド名,同一引数パターンで,戻り値の型が違う場合,コンパ イルエラーなります。  末広ページの伝言版,また,メールにてご指摘をいただきありがとうございま した。  保存用は修正してあります。  http://www.yscon.co.jp/j/java/jmaga/alljmagatxt/jmaga039.txt ======================================================================== ▼ クラスとインスタンス  クラスを本体,インスタンスをそれからできた分身とJマガで呼んできました。 一般的には,クラスは設計図,インスタンスはそれからできた製品のようにたと えられています。  この号では,クラスがする仕事と持っている値,インスタンスがする仕事と持っ ている値を区別することを勉強しましょう。 ------------------------------------------------------------------------ ▼インスタンスのメソッドと変数  挨拶をする基本プログラムを見ましょう。 xHello.java を見てみましょう。 例 j39-01 xHello.java ソース http://www.yscon.co.jp/j/java/jmaga/j39/xHello.java 1: // Java 基本プログラム アプリケーション "Hello"を表示 2: 3: public class xHello { 4: public static void main(String xargs[]){ 5: System.out.println("Hello"); 6: } 7: }  このプログラムを実行すると,画面に "Hello" と表示されます。ここで, Date クラスを継承した xDay クラスを定義し,その xDay クラスのインスタンス に "Hello" と言わせましょう。 例 j40-01 xStatic00.java ソース http://www.yscon.co.jp/j/java/jmaga/j40/xStatic00.java 1: // インスタンスメソッドの定義例 2: 3: import java.util.Date; 4: 5: public class xStatic00 { 6: 7: public static void main(String xargs[]){ 8: 9: xDay xday01 = new xDay("分身その1"); 10: xDay xday02 = new xDay("分身その2"); 11: 12: System.out.println("Hello! 僕は," + xday01.getBunshinName()); 13: System.out.println("Hello! 僕は," + xday02.getBunshinName()); 14: 15: } 16: } 17: 18: class xDay extends Date{ 19: 20: String xname; 21: 22: xDay(String xstr){ 23: xname = xstr; 24: } 25: 26: String getBunshinName(){ // 単純なインスタンスメソッド 27: return xname; 28: } 29: }  実行すると S:\ftpyscon\j\java\jmaga\j40>java xStatic00 Hello! 僕は,分身その1 Hello! 僕は,分身その2 となります。  18 〜 29 行目は,Dateクラスを継承して,xDay クラスを定義しました。 20: String xname;  は,インスタンス(分身)が持つ値を保持する変数(注意1)を用意しています。 注意1:String は,クラスですので,xname は,そのインスタンスになります。 String は見た目は基本型とほぼ同等であり,String クラスのインスタンスもほ ぼ,変数として振る舞うため,この号では変数と呼びました。そうしないと, 「インスタンスが持つ変数」を「インスタンスが持つインスタンス」と混乱する ためです。この場合,正確な表現は,「インスタンスが持つ変数もしくはインス タンス」です。 22: xDay(String xstr){ 23: xname = xstr; 24: }  22 〜 24 行目は,コンストラクタ(構築子)です。xDay のインスタンス(分身)が 作くられるときに利用されます。インスタンス(分身)の名前が,xname に記憶され ます。 26: String getBunshinName(){ // 単純なインスタンスメソッド 27: return xname; 28: }  26 〜 28 行目は,この xDayクラスのインスタンス(分身)の名前をこたえるメ ソッド(仕事)を定義しています。 9: xDay xday01 = new xDay("分身その1"); 10: xDay xday02 = new xDay("分身その2");  は,xDay のインスタンス(分身)を2つ,作っています。名前をそれぞれ,"分 身その1","分身その2"と付けています。 12: System.out.println("Hello! 僕は," + xday01.getBunshinName()); 13: System.out.println("Hello! 僕は," + xday02.getBunshinName());  は,xDay のインスタンスの xday01 と xday02 に,それぞれ,getBunshinName() という仕事(メソッド)をさせています。  getBunsinName() という仕事は, 26: String getBunshinName(){ // 単純なインスタンスメソッド 27: return xname; 28: }  でした。xname を応えます。xday01.getBunshinName()とxday02.getBunshinName() は,それぞれ,"分身その1","分身その2"と応えます。つまり,xnameという同 じ変数名ですが,xday01 の xname と xday02 の xname,それぞれに別々にある ことが分かります。  このように,インスタンス(分身)ごとに持っている変数を,インスタンス変数 と呼びます。インスタンス変数の対義語は,クラス変数です。クラス変数は次の 節であつかいます。  -- Java 規則 ---------------------------------------------  インスタンス変数とは   インスタンス(分身)ごとに保持する変数   対義語 クラス変数  ============================================= Java 規則 ==  -- Java 規則 ---------------------------------------------  インスタンスメソッドとは   インスタンス(分身)がする仕事(メソッド)   対義語 クラスメソッド  ============================================= Java 規則 == ------------------------------------------------------------------------ ▼クラスのメソッドと変数  インスタンス(分身)に挨拶をさせましたので,今度は,クラス(本体)にも挨拶 をしてもらいましょう。 例 j40-01 xStatic01.java ソース http://www.yscon.co.jp/j/java/jmaga/j40/xStatic01.java 1: // クラスメソッド,クラス変数の定義例 statict登場 2: 3: import java.util.Date; 4: 5: public class xStatic01 { 6: 7: public static void main(String xargs[]){ 8: 9: xDay xday01 = new xDay("分身その1"); 10: xDay xday02 = new xDay("分身その2"); 11: 12: System.out.println("Hello! 僕は," + xday01.getBunshinName()); 13: System.out.println("Hello! 僕は," + xday02.getBunshinName()); 14: 15: System.out.println("Hello! 僕は," + xDay.getHontaiName()); 16: 17: } 18: } 19: 20: class xDay extends Date{ 21: 22: static String xhontaiName = "デェイ"; 23: String xbunshinName; 24: 25: xDay(String xstr){ 26: xbunshinName = xstr; 27: } 28: 29: static String getHontaiName(){ 30: return xhontaiName; 31: } 32: 33: String getBunshinName(){ 34: return xbunshinName; 35: } 36: }  xDay クラスの定義で変えたところは,名前を保持する変数名を xhontaiNameと xbunshinNameにしたところと,クラスの名前を返すメソッドを追加したところです。 22: static String xhontaiName = "デェイ"; 23: String xbunshinName;  22 行目で,xhontaiName に デェイという文字列を記憶させました。23行目と 比較すると,22行目では,static がついています。static を付けることによって, この xhontaiName という変数は,インスタンスが持つ変数ではなく,クラスが 持つ変数であるとされます。これが,クラス変数です。  追加したメソッドは 29: static String getHontaiName(){ 30: return xhontaiName; 31: }  です。メソッドの前に,static がついているところに注目してください。これ もこの static で,このメソッドは,分身が実行する仕事(メソッド)ではなく, 本体(クラス)が実行するメソッドであるとされます。これをクラスメソッドと いいます。  static というのは,「静かな」を意味する形容詞です。static electricity と言うと,静電気を意味します。static の反対語は,dynamic です。  クラスの定義は,ソースプログラムに書かれており,コンパイルの時に,すで に存在する感じです。プログラム実行時にはすでに,静かにそこにいるというこ とで,static がつきました。それに比べて,インスタンスは,プログラム実行時 の,new のところで,生成されます。そのため,インスタンスは dynamic という 形容詞が似合います。インスタンスの場合は,dynamic という形容詞を使われて いなく省略されていると考えていいでしょう。  一般的に,ソフトウェア用語として,static は,実行前に決定してことがら, dynamic は,実行時に決定することがら表す形容詞として使われます。  -- Java 規則 ---------------------------------------------  クラス変数,クラスメソッドの定義には   修飾子 static がつく。  ============================================= Java 規則 ==  -- Java 規則 ---------------------------------------------  クラス変数は,   宣言時に修飾子 static がつく変数で,クラスが保持する。  ============================================= Java 規則 ==  -- Java 規則 ---------------------------------------------  クラスメソッドは,   宣言時に修飾子 static がつくメソッドで,クラスがする仕事 (メソッド)。  ============================================= Java 規則 ==  挨拶を表示するところをみましょう。 12: System.out.println("Hello! 僕は," + xday01.getBunshinName()); 13: System.out.println("Hello! 僕は," + xday02.getBunshinName()); 14: 15: System.out.println("Hello! 僕は," + xDay.getHontaiName());  xday01.getBunshinName()とxday02.getBunshinName()は,インスタンスメソッ ドです。  xDay.getHontaiName()は,クラスメソッドです。  メソッド名の前にそれぞれ,インスタンス名,クラス名を付けています。  このサンプルプログラムでは扱いませんでしたが,クラスメソッドは, xday02.getHontaiName() のように,前にインスタンス名をつけても実行できま す。つまり,インスタンスからはクラスのメソッドは自分のメソッドのように扱 うことができます。  -- Java 規則 ---------------------------------------------  インスタンスメソッド,クラスメソッドの呼び出し方法  インスタンス名.メソッド名();  クラス名.メソッド名();  ただし,クラスメソッドは,インスタンス名.メソッド名()でも よい。  ============================================= Java 規則 == ------------------------------------------------------------------------ ▼ アプリケーションの main メソッド  クラスのメソッド,変数を表す,static は,いままで,何度も登場しています。 例 j39-01 xHello.java ソース http://www.yscon.co.jp/j/java/jmaga/j39/xHello.java 1: // Java 基本プログラム アプリケーション "Hello"を表示 2: 3: public class xHello { 4: public static void main(String xargs[]){ 5: System.out.println("Hello"); 6: } 7: }  の 4 行目に  public static void main(String xargs[])  として,すでに登場していました。今まで,解説してきませんでしたが,この static も,クラスメソッドであることを示しています。つまり,main メソッ ドは,クラスメソッドでした。  この xHello.java に新たにクラスメソッド,そして,クラス変数,インスタン スメソッド,インスタンス変数を追加してみましょう。 例 j40-03 xHello01.java ソース http://www.yscon.co.jp/j/java/jmaga/j40/xHello01.java 1: // "Hello"にインスタンスメソッド,インスタンス変数,クラス変数を追加 2: 3: public class xHello01 { 4: 5: static String xhontaiName = "ハロー表示クラス"; //クラス変数 6: String xbunshinName; //インスタンス変数 7: 8: // コンストラクタ 9: public xHello01(String xstr){ 10: xbunshinName = xstr; 11: } 12: 13: public static void main(String xargs[]){ 14: System.out.println("Hello"); 15: } 16: 17: // クラスメソッド 18: public static String getHontaiName(){ 19: return xhontaiName; 20: } 21: 22: // インスタンスメソッド 23: public String getBunshinName(){ 24: return xbunshinName; 25: } 26: }  この xHello01 実行すると,"Hello"と表示されるだけです。単純に実行すると, main()メソッドが実行されるからです。  xHello01をテストするために,xDrvHello01.java を次のように作成しました。 例 j40-04 xDrvHello01 ドライバ xHell01ドライバ ソース http://www.yscon.co.jp/j/java/jmaga/j40/xDrvHello01.java 1: // ドライバ xHell01ドライバ 2: 3: public class xDrvHello01 { 4: public static void main(String xargs[]){ 5: 6: xHello01 xh01 = new xHello01("分身その1"); 7: xHello01 xh02 = new xHello01("分身その2"); 8: 9: System.out.println("Hello! 僕は," + xh01.getBunshinName()); 10: System.out.println("Hello! 僕は," + xh02.getBunshinName()); 11: 12: System.out.println("Hello! 僕は," + xHello01.getHontaiName()); 13: 14: xHello01.main(xargs); 15: 16: } 17: }  これを実行すると,xDrvHello01 の中から xHello01が呼び出されます。 9: System.out.println("Hello! 僕は," + xh01.getBunshinName()); 10: System.out.println("Hello! 僕は," + xh02.getBunshinName());  で,xHello01 のインスタンスメソッドが2回実行され 12: System.out.println("Hello! 僕は," + xHello01.getHontaiName());  で,xHello01 のクラスメソッド getHontaiName()が実行され 14: xHello01.main(xargs);  で,xHello01 のクラスメソッド main()が実行されます。次のように4行が 表示されます。 S:\ftpyscon\j\java\jmaga\j40>java xDrvHello01 Hello! 僕は,分身その1 Hello! 僕は,分身その2 Hello! 僕は,ハロー表示クラス Hello ------------------------------------------------------------------------ ▼ クラス(本体)とインスタンス(分身)の相互利用  クラスメソッドやクラス変数は,実行前に用意されています。正確には,実行 が開始される段階の初期化のところで主記憶上に用意されます。インスタンスは, 実行時の new のところで,主記憶上に生成されます。そのため,クラスメソッド から,インスタンスメソッドやインスタンス変数を利用することは,単純には できません。使うためには,一度,new をして生成しておく必要があります。  一方,インスタンスから見ると,クラスはすでに主記憶上に存在していますの で,クラスメソッド,クラス変数は好きなときに使うことができます。  Jマガ風に言うと,本体(クラス)から分身(インスタンス)の技(メソッド)や 持っているもの(変数)を使うには,生成してからしか使うことはことは出来ない が,分身側からは本体の技や持っているものすぐに使えるということになります。 ------------------------------------------------------------------------ ▼ static に注目  Java の API の一覧を見ると,メソッドや変数に static がついているものと 付いていないものがあります。static が付いているものは,実は,クラスメソッ ド,クラス変数でした。  考えずに使うと,コンパイルエラーで,「これは static のところで使えない」 とかしかられたと思います。このからくりがあったからです。  次回は,public を勉強しましょう。これも毎回登場していますね。publicが 付くとき,付かないとき,どういう違いがあったのか,解説したいと思います。  知りたいテクニック,また,解説してほしいクラスなどリクエストお寄せくだ さい。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,商用を含めて,再利用,改変, 発表を制限しません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。 この号の内容 1 良かった 2 普通 3 良くなかった コメント,リクエストもどうぞ。