2003 -0405 ver 0.01 サンプル作成開始 -0410 ver 0.90 発行予定原稿完成 -0412 ver 1.00 発行版 -0412 ver 1.10 コラムの表現一部修正 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2003 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 7963部(まぐまぐ:6638 melma!:740 Pubzine:478             ティアラオンライン:18 めろんぱん:89) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第42号 2003/04/12  変数の有効範囲 継承との関係 ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  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☆---- ======================================================================== ▼ お知らせ(再掲載:パズル出題)  書籍『C言語のしくみ』が好評発売中の平田豊氏が,Jマガのために,パズル 作成してくれました。ぜひ,挑戦して下さい。 JavaScript または Java のソースを添付して,jmaga@yscon.co.jp までお送り 下さい。  締め切り 4月25日  問題は,前号の後ろの方に掲載しています。  http://www.yscon.co.jp/j/java/jmaga/alljmagatxt/imaga041.txt ======================================================================== ▼ 変数名の有効範囲はどこまであるか?  前号では,一つの変数名が,メソッドの壁を越え,さらに,クラスの壁,フォ ルダの壁をどう越えるか見てきました。この号では,継承関係において,変数名 がどこまで有効かを見ていきましょう。 ------------------------------------------------------------------------ ▼ 前号の復習 クラスの越えた変数  同一ソースファイル内で,クラスの壁を越えた変数の共有の例を見ましょう。 前号の例です。 例 j41-05 xScope03.java ソース http://www.yscon.co.jp/j/java/jmaga/j41/xScope03.java 1: // 可視範囲 広域変数(クラスをまたいで共通 ただし同一ソースファイル) 2: 3: public class xScope03 { 4: 5: public static void main(String xargs[]){ 6: 7: xCount10 xobj = new xCount10(); 8: 9: xobj.i = 3; // インスタンス変数 10: xCount10.xsi = 30; // クラス変数 11: 12: System.out.print(xobj.i); 13: System.out.print(" " + xCount10.xsi); 14: 15: xobj.xcount10(); 16: 17: System.out.print("注目→ "+ xobj.i); 18: 19: } 20: } 21: 22: class xCount10{ 23: 24: int i; // private int i; とすると,外部から参照できず 25: static int xsi; // private int xsi; とすると,外部から参照できず 26: 27: void xcount10(){ 28: System.out.println(); 29: for(i=1; i<=10; i++){ 30: System.out.print(i +" "); 31: } 32: System.out.println(); 33: } 34: }  変数と宣言と利用の視点から構造をまとめると以下のようになります。 3: public class xScope03 { 5: public static void main(String xargs[]){ 7: xCount10 xobj = new xCount10(); 9: xobj.i = 3; // インスタンス変数 10: xCount10.xsi = 30; // クラス変数 19: } 20: } 21: 22: class xCount10{ 24: int i; 25: static int xsi; 34: }  24,25 行目のクラス内の変数宣言で,private とか public とかは,付いてい ません。private とか public は,変数のアクセス可能は範囲を決定することか ら,アクセス修飾子といいます。この例では,xCount10 クラスの i,xsi は,宣 言に,アクセス修飾子が省略されています。アクセス修飾子が省略されていると きは,同一フォルダ内で利用可能になります。  クラスが別のフォルダにある場合を見てみましょう。 xCount10 が,xsubfdr フォルダある場合 例 j41-09 xCount10.java ソース http://www.yscon.co.jp/j/java/jmaga/j41/xsubfdr/xCount10.java 1: // 可視範囲 広域変数(クラスをまたいで共通 フォルダもまたぐ) 2: 3: package xsubfdr; // package 宣言が必要 4: 5: public class xCount10{ // public が必要 6: 7: public int i; // public が必要 8: public static int xsi; // public が必要 9: 10: public void xcount10(){ // public が必要 11: System.out.println(); 12: for(i=1; i<=10; i++){ 13: System.out.print(i +" "); 14: } 15: System.out.println(); 16: } 17: } と 例 j41-08 xScope05.java ソース http://www.yscon.co.jp/j/java/jmaga/j41/xScope05.java 1: // 可視範囲 広域変数(クラスをまたいで共通 フォルダをまたぐ) 2: 3: import xsubfdr.xCount10; 4: 5: public class xScope05 { 6: 7: public static void main(String xargs[]){ 8: 9: xCount10 xobj = new xCount10(); 10: xobj.i = 3; // インスタンス変数 11: xCount10.xsi = 30; // クラス変数 12: System.out.print(xobj.i); 13: System.out.print(" " + xCount10.xsi); 14: 15: xobj.xcount10(); 16: 17: System.out.print("注目→ "+ xobj.i); 18: 19: } 20: }  で,ここでも変数の宣言と利用の視点で整理すると。 3: package xsubfdr; 5: public class xCount10{ 7: public int i; 8: public static int xsi; 9: 17: } と 3: import xsubfdr.xCount10; 5: public class xScope05 { 7: public static void main(String xargs[]){ 9: xCount10 xobj = new xCount10(); 10: xobj.i = 3; // インスタンス変数 11: xCount10.xsi = 30; // クラス変数 19: } 20: } になります。  フォルダを越えるときは,利用される xCount10 の定義側で, package 宣言が 必要でした。また利用する,xScope05 クラス側では,import 宣言が必要でした。 フォルダを越えて公開する,xCount10 クラスや xcount10 メソッド,i,xsi 変 数には,public というアクセス修飾子が必要でした。これにより,フォルダを越 えて,利用することができます。  また,private をというアクセス修飾子を使うと,クラスの外では,同一のソー スファイルでも使用することができませんでした。  ┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓   public フォルダを越えて利用可能を示す   (アクセス修飾子なし) 同一フォルダで使用可能を示す   private そのクラス内のみ使用可能を示す  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ------------------------------------------------------------------------ ▼ 継承関係の中の変数 同一フォルダ内  上の2つの例は,プログラムの中から別のクラスの変数を利用する例でした。 今度は,継承関係の中で親の変数を利用する場合をみてみましょう。  例を簡単にするために,クラス変数のみを扱います。インスタンス変数は, それぞれのインスタンスに属しますので,継承関係は関係がありません。  次の例を見て下さい。 例 j42-01 xOyaCount10.java 継承の元になるクラスの例 ソース http://www.yscon.co.jp/j/java/jmaga/j42/xOyaCount10.java 1: // 継承の元になるクラスの例 2: 3: class xOyaCount10{ 4: 5: static int i; 6: 7: static void xcount10(){ 8: System.out.println(); 9: for(i=1; i<=10; i++){ 10: System.out.print(i +" "); 11: } 12: System.out.println(); 13: } 14: }  これを継承して,次のプログラムを作成します。同一フォルダに作ります。 例 j42-02 xScope10.java 可視範囲 親クラスの変数を使用 ソース http://www.yscon.co.jp/j/java/jmaga/j42/xScope10.java 1: // 可視範囲 親クラスの変数を使用 2: 3: public class xScope10 extends xOyaCount10{ 4: 5: public static void main(String xargs[]){ 6: 7: xcount10(); 8: System.out.println("注目→ "+ i); 9: 10: i = 20; 11: xDummy.xdummy(); 12: } 13: } 14: 15: class xDummy extends xOyaCount10{ 16: static void xdummy(){ 17: System.out.println("注目→ "+ i); 18: } 19: }  xScope10.java の中では,2つクラスを定義しています。最初に動作する, xScope10 クラスと,そこから呼ばれて動作する,xDummyクラスがあります。とも に xOyaCount10 クラスを継承しています。これを実行すると, 1 2 3 4 5 6 7 8 9 10 注目→ 11 注目→ 20 となります。これは,xScope10 の 7: xcount10(); 8: System.out.println("注目→ "+ i); 9: 10: i = 20; 11: xDummy.xdummy(); の実行結果です。 7: xcount10(); で,1 から 10 を表示しました。これは,親クラスで定義してあるメソッドです。 それを実行した直後の i を表示すると,11 と表示されています。これは,xScope10 の中の i と親クラス内で定義してある i と共有化されていることが分かります。 次に, 10: i = 20; 11: xDummy.xdummy(); をすると,xDummy クラス の 次の xdummy() メソッド 17: System.out.println("注目→ "+ i); が実行されます。20 が表示されました。  このことから,親クラスのインスタンス変数は,public とか private などの アクセス修飾子を付けないと,同一フォルダの場合,継承された複数のサブクラ スとともに共有することが分かります。 ------------------------------------------------------------------------ ▼ 継承関係の中の変数 同一フォルダ内  では,フォルダの壁があった場合はどうでしょうか。xOyaCount10 クラスをサ ブフォルダの xsubfdr に入れて,名前を,xBetuFdOyaCount10 クラスとしました。 例 j42-03 xBetuFdOyaCount10.java 継承の元になるクラスの例 ただし別フォルダ ソース http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10.java 1: // 継承の元になるクラスの例 ただし別フォルダ 2: 3: package xsubfdr; 4: 5: public class xBetuFdOyaCount10{ 6: 7: public static int i; 8: 9: public static void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  package 宣言を追加し,クラス名を変更し,さらに,フォルダを越えるという ことで,アクセス修飾子 public を 外部から利用される,3箇所つけました。 付けた所は,クラス,変数i,メソッドxcount10の宣言のところです。  これを利用するプログラムは, 例 j42-04 xScope11.java 可視範囲 別フォルダにある親クラスの変数を使用 ソース http://www.yscon.co.jp/j/java/jmaga/j42/xScope11.java 1: // 可視範囲 別フォルダにある親クラスの変数を使用 2: 3: import xsubfdr.xBetuFdOyaCount10; 4: 5: public class xScope11 extends xBetuFdOyaCount10{ 6: 7: public static void main(String xargs[]){ 8: 9: xcount10(); 10: System.out.println("注目→ "+ i); 11: 12: i = 20; 13: xDummy.xdummy(); 14: } 15: } 16: 17: class xDummy extends xBetuFdOyaCount10{ 18: static void xdummy(){ 19: System.out.println("注目→ "+ i); 20: } 21: }  と,3 行目に import 宣言がついただけで変更はありません。実行結果も全く 同じとなります。  アクセス修飾子 public を付けることで,外部から利用できることがこれで分 かり,親クラスの public 付きのインスタンス変数は,子クラスともそのまま共有 することができます。 ------------------------------------------------------------------------ ▼ 継承関係の中の変数 同一変数名で上書き  xBetuFdOyaCount10 クラスを継承した,次 のxScope12 プログラムを見て下さ い。 例 j42-05 xScope12.java 可視範囲 変数の上書き宣言 ソース http://www.yscon.co.jp/j/java/jmaga/j42/xScope12.java 1: // 可視範囲 変数の上書き宣言 2: 3: import xsubfdr.xBetuFdOyaCount10; 4: 5: public class xScope12 extends xBetuFdOyaCount10{ 6: 7: static int i = 1; 8: 9: public static void main(String xargs[]){ 10: 11: //int i = 2; 12: 13: xcount10(); 14: System.out.println("注目→ "+ i); 15: 16: } 17: }  実行すると, 1 2 3 4 5 6 7 8 9 10 注目→ 1 となります。これは,7 行目の 7: static int i = 1;  で,i が新たにこのクラスのインスタンス変数と定義されたため,親クラスの i が隠蔽されました。13 行目で実行されている親クラスの xcount10 の内部の i とこの xScope12 の i とは別の i となりました。  また,このプログラムで,7 行目を次のように 7: // static int i = 1; コメント扱いして,11 行目の // をとって, 11: int i = 2; として,コンパイル&実行すると, 1 2 3 4 5 6 7 8 9 10 注目→ 2 となります。  これは,public static void main(String xargs[]) 内のローカル変数の i と宣言されたため,親クラスの xcount10 の内部の i と,この main メソッド 内の i が別物となったためです。  これらを,「変数 i が上書き(オーバライド)をされた」といいます。  親クラスの i を使いたい時は,xBetuFdOyaCount10.i と i の前に クラス名を 付けることで利用可能です。 ------------------------------------------------------------------------ ▼ アクセス修飾のいろいろ  継承の元となる別のフォルダにある親クラスは,public がついていました。 例 j42-03 xBetuFdOyaCount10.java 継承の元になるクラスの例 ただし別フォルダ ソース http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10.java 1: // 継承の元になるクラスの例 ただし別フォルダ 2: 3: package xsubfdr; 4: 5: public class xBetuFdOyaCount10{ 6: 7: public static int i; 8: 9: public static void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  ここで,アクセス修飾子の実験をしたいと思います。このプログラムの 5: public class xBetuFdOyaCount10{ 7: public static int i; 9: public static void xcount10(){  の public のところをいろいろかえて実験していきます。  実験用のプログラムは,このクラスを継承し,親クラスのメソッドを実行しま す。親クラスの名前は,xBetuFdOyaCount10x として,それぞれのテストバージョン を,BetuFdOyaCount10x01 のように,x の後ろに数字をつけて保存しておきます。 コンパイルするときは,xBetuFdOyacount10x とリネームしています。 例 j42-06 xScope13.java 可視範囲 別フォルダにある親クラスの変数を使用 ソース http://www.yscon.co.jp/j/java/jmaga/j42/xScope13.java 1: // 可視範囲 利用される親クラスのアクセス修飾子テスト用ドライバ 2: 3: import xsubfdr.xBetuFdOyaCount10x; 4: 5: public class xScope13 extends xBetuFdOyaCount10x{ 6: 7: public static void main(String xargs[]){ 8: 9: xcount10(); 10: System.out.println("注目→ "+ i); 11: 12: } 13: } ------------------------------------------------------------------------ ▼ クラスに public なし  クラスの宣言に public なしにしてみましょう。 例 j42-07 xBetuFdOyaCount10x01.java クラスに public なし http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10x01.java 1: // アクセス修飾子実験 その1 クラスに public なし 2: 3: package xsubfdr; 4: 5: class xBetuFdOyaCount10x{ // public 必要 6: 7: public static int i; 8: 9: public static void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  上のクラスを継承する xScope13.java をコンパイルすると xScope13.java:3: xsubfdr の xsubfdr.xBetuFdOyaCount10x は public ではあり ません。パッケージ外からはアクセスできません。 import xsubfdr.xBetuFdOyaCount10x; ^ とエラーになります。  フォルダを越えてクラスを利用するためには,アクセス修飾子 public の省略 は許されません。 ------------------------------------------------------------------------ ▼ クラス変数に public なし  次のように,クラス変数の pulibc をなしにしてみましょう。 例 j42-08 xBetuFdOyaCount10x02.java クラス変数に public なし http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10x02.java 1: // アクセス修飾子実験 その2 クラス変数に public なし 2: 3: package xsubfdr; 4: 5: public class xBetuFdOyaCount10x{ 6: 7: static int i; // 他のフォルダからは利用しようとするとエラー 8: 9: public static void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  上のクラスを継承する xScope13.java をコンパイルすると xScope13.java:10: xsubfdr.xBetuFdOyaCount10x の i は public ではありませ ん。パッケージ外からはアクセスできません。 System.out.println("注目→ "+ i); ^ とエラーになります。  このクラス変数 i も public がついていないとエラーになります。  今まで触れてきませんでしたが,アクセス修飾子には,public,praivate の他 に,protected もあります。protected を使うと,public の用に,フォルダを超 えることができますが,継承したクラスのみに利用可能になります。  次のプログラムを見て下さい。 例 j42-08 xBetuFdOyaCount10x03.java クラス変数に protected http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10x03.java 1: // アクセス修飾子実験 その3 クラス変数に protected 2: 3: package xsubfdr; 4: 5: public class xBetuFdOyaCount10x{ 6: 7: protected static int i; // 子クラスのみ利用可能 8: 9: public static void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  上のクラスを継承する xScope13.java をコンパイルすると,今度は無事にコン パイルできます。  protected を 変数に付けることで,フォルダを越えて,サブクラスのみから, その変数は利用可能にします。 ------------------------------------------------------------------------ ▼ みんな protected だと  今度は,すべて protected にしてみましょう。 例 j42-09 xBetuFdOyaCount10x04.java クラス変数に public なし http://www.yscon.co.jp/j/java/jmaga/j42/xsubfdr/xBetuFdOyaCount10x04.java 1: // アクセス修飾子実験 その4 クラス,変数,メソッドも protected 2: 3: package xsubfdr; 4: 5: protected class xBetuFdOyaCount10x{ // 他のフォルダより使用できない。 6: 7: protected static int i; 8: 9: protected void xcount10(){ 10: System.out.println(); 11: for(i=1; i<=10; i++){ 12: System.out.print(i +" "); 13: } 14: System.out.println(); 15: } 16: }  上のクラスを継承する xScope13.java をコンパイルすると, .\xsubfdr\xBetuFdOyaCount10x.java:5: 修飾子 protected をここで使うことは できません。  とコンパイルエラーになります。  クラスは,やはり,public でないと,フォルダを越えられないようです。 ------------------------------------------------------------------------ ▼ アクセス修飾子  protected を入れて,アクセス修飾子の規則をまとめてみます。  ┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓   public フォルダを越えて利用可能を示す   protected 子クラスのみで使用可能,ただし,クラスが,               public でないとフォルダを越えない。   (アクセス修飾子なし) 同一フォルダで使用可能を示す   private そのクラス内のみ使用可能を示す  ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  Java のアクセス修飾子は,public,protected,private の3つです。ア クセス修飾子以外の修飾子は,他にいくつかあります。今まで,何度も登場し てきた,static も,修飾子の一つです。static は,アクセスの範囲を決める 修飾子でないので,アクセス修飾子とはいいません。まだ,Jマガで扱って いませんが,final という就職子もあります。protected は,基本情報で出題 される可能性が低いですが,public, private,static,そして,final は, 出題される可能性が高いです。final は,Jマガの次号で扱いましょう。  修飾子は,クラス,メソッド,変数の宣言時に使われ,それらの宣言を修飾 するところから,その名前がついています。  変数の有効範囲を通じて,アクセス修飾子を説明しましたが,クラスもメソッ ドはほぼ同じです。  良く登場した,xHello.java の /* Java 基本プログラム アプリケーション "Hello"を表示 */ public class xHello { public static void main(String[] xargs){ System.out.println("Hello"); } }  の public,static は修飾子でした。  アクセス修飾子の説明で,「フォルダを越えて」という言い方をしてきました が,Java では,フォルダをパッケージという単位で管理します。「同一フォルダ」 という言い方は,「同一パッケージ」と同じ意味になります。 ------------------------------------------------------------------------ ▼ コラム:Jマガを利用した基本情報直前対策  Jマガでは,基本情報技術者試験のJavaの範囲をほぼ説明しました。残すのは, final と「抽象クラス」だけでしょう。final と「抽象クラス」は次号で解説し ます。  基本情報技術者試験の今までのJavaの問題を見ると,GUI,アプレット,携帯電 話のJavaは出題されません。Java の現場でも仕事をみてみると,ほとんどがサー バで動作するプログラムですので,GUI関係は,今後も基本情報で出題されないと 予想されます。  出題されるのは,アプリケーションで,とくにオブジェクト指向に関係する文 法の知識が問わると予想されます。具体的には,クラス,インスタンスの区別, 継承,インターフェースなどです。また,参照型変数の知識も問われるでしょう。  Jマガでは,GUI,アプレット関係も扱って来ましたので,J マガを利用して, 基本情報の勉強をされるとき,順番にすべての号をやっていくというのは無駄が 多いです。出題されそうなところは,Jマガも目次ページに赤字で表示しておき ましたので,その号を中心に学習されることをお勧めします。  目次 http://www.yscon.co.jp/j/java/jmaga/index.htm  私のお薦めは,第38号から第42号を印刷して,マーカーを持ちながら,プ ログラムソースのところで,説明の対象となっているところを色を塗りながら読 むです。  これが難しかった場合は,第9号から第14号,第18号,第19号を先に読んで 下さい。  第38号から第42号が読み終わったら,第6号から第8号を読まれるといい と思います。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開している,プログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,原則,商用を含めて,再利用, 改変,発表を制限しません。どんどんご利用下さい。  質問コーナのプログラムソースは,著作権に問題がある場合があるかもしれま せん。原則を適用しません。再利用の許可をしません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。 この号の内容 1 良かった 2 普通 3 良くなかった コメント,リクエスト,質問もお待ちしています。