2003
-0326 ver 1.00 発行版
-0405 ver 1.01 サンプルプログラムの番号のミスを修正
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃.&&&& **** %%%%. JavaScript&Javaで目指そう!基本情報技術者試験 ┃
┃&&&&&&******%%%%%% http://www.yscon.co.jp/j/java/jmaga/ ┃
┃'&┃&''*┃*''%┃%' (C)2003 斎藤末広 jmaga@yscon.co.jp ┃
┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
前回の発行部数 7950部(まぐまぐ:6610 melma!:753 Pubzine:478
ティアラオンライン:19 めろんぱん:90)
★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html
★バックナンバー :http://www.yscon.co.jp/j/java/jmaga/
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
第41号 2003/03/26
変数の有効範囲
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
プログラムを作成する上での注意事項:
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マガのために,パズル
作成してくれました。ぜひ,挑戦して下さい。
応募先は,jmaga@yscon.co.jp
問題は,この号の最後にあります。
問題作成者 平田豊 http://cgi3.tky.3web.ne.jp/~yutakakn/
平田豊氏の最近の書籍
『C言語のしくみ』
http://www.amazon.co.jp/exec/obidos/ASIN/4875934181/suehirospage-22
『ソフトウェア開発技術者独習合格ドリル 平成15年度 (2003)』
http://www.amazon.co.jp/exec/obidos/ASIN/4881663119/suehirospage-22
『これからはじめるPerl&CGI入門ゼミナール』
http://www.amazon.co.jp/exec/obidos/ASIN/4881662686/suehirospage-22
『正規表現入門―複雑な「検索」「置換」も一括処理!I』
http://www.amazon.co.jp/exec/obidos/ASIN/4875932537/suehirospage-22
========================================================================
▼ 変数名の有効範囲はどこまであるか?
今回は,一つの変数名が,どこまで有効か,順に範囲を広げながら,見ていき
ましょう。局所(ローカル)変数,広域変数(グローバル)変数,さらに,クラス,
ソースファイル,フォルダを超えるところまで,扱います。
------------------------------------------------------------------------
▼ 広域(グローバル)変数
久しぶりに JavaScript のサンプルです。以下のプログラムを見てください。
例 j41-01 j41-01.htm
http://www.yscon.co.jp/j/java/jmaga/j41/j41-01.htm
1:
2:
3: 広域(グローバル)変数の例
4:
5:
16:
17:
18:
19: 広域(グローバル)変数の例
20:
21:
31:
32:
33:
これを実行すると,
「広域(グローバル)変数の例」と表示された下に,水平線に挟まれて,
3
1 2 3 4 5 6 7 8 9 10
注目→ 11
と表示されます。
最初の 3 は,
23: i = 3;
24: document.write(i);
で表示されたものです。次の,
1 2 3 4 5 6 7 8 9 10
は,
26: xcount10();
で xcount10()が呼び出されて,
7: function xcount10(){
8: document.write("
");
9: for(i=1; i<=10; i++){
10: document.write(i+" ");
11: }
12: document.write("
");
13: }
が実行されて,そこで表示されたものです。
注目→ 11
は,
28: document.write("注目→ " + i);
で表示されたものです。このことから,
21:
i = 3 と設定してから, xcount10() を呼び出すと,xcount10()の中で,i の
値が,11 と変化したことが分かります。
この 変数 i は,21〜30行目で有効,さらに,7 〜 13行目でも有効です。この
ように広い範囲で有効な変数を広域(グローバル)変数といいます。
広域(グローバル)変数は便利なときもありますが,今回の例のようにあまり好
ましくない場合が多いです。好ましい表示は,3 ですね。これを解決するために,
局所(ローカル)変数を使います。
------------------------------------------------------------------------
▼ 局所(ローカル)変数
j41-01.htm を以下のように変え,j41-02.htm を作成しました。
例 j41-02 j41-02.htm
http://www.yscon.co.jp/j/java/jmaga/j41/j41-02.htm
1:
2:
3: 広域変数(グローバル)と局所(ローカル)変数の例
4:
5:
19:
20:
21:
22: 広域変数(グローバル)と局所(ローカル)変数の例
23:
24:
34:
35:
36:
実行すると,
3
1 2 3 4 5 6 7 8 9 10
注目→ 3
となります。xcount10()を実行しても,i の値が変化していません。
変えたところは,
7: function xcount10(){
8:
9: var i; // 局所(ローカル)変数 i を宣言
10:
11: document.write("
");
12: for(i=1; i<=10; i++){
13: document.write(i+" ");
14: }
15: document.write("
");
16: }
の,9 行目です。var i; と追加しました。これを入れることで,
26: i = 3; // 広域変数 i が自動的に設定(宣言)
の i と xcount10() で使用される i とは名前が同じ i ですが,プログラム上
は別物になります。
関数(メソッド)中で使用する変数は,出来るだけ,その関数(メソッド)内のみ
で有効でそれを利用する側とは無関係であることが望ましいです。そのため,こ
のように局所変数であると宣言して利用します。
局所変数(ローカル)変数の欠点は,もし関数内で定義されていた場合,関数(メ
ソッド)が実行されるたびに,主記憶上に用意され,その関数の実行が終了したら
破棄されることで,時間と主記憶を消費するということです。そのため,主記憶
を大量に使用する変数の場合は,あえて,局所(ローカル)変数を利用せずに,広
域(グローバル)変数として利用する場合があります。
JavaScript の特色として,var の宣言なしに,変数をいきなり使うと,広域(グ
ローバル)変数となります。var で宣言をすると,宣言した場所で,広域変数か,
局所変数が決定します。
┏ JavaScript 規則 ━━━━━━━━━━━━━━━━━━━━━━━┓
var 宣言せずに,変数を使用すると,広域(グローバル)変数となる。
var 宣言して,変数を使用すると,宣言する場所で,広域変数か,局所
変数かが決定
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
JavaScript は,小さなプログラムを早く作成することができるという考え方で
出来ていますので,このような規則になっています。
Javaの方は,大規模なプログラムを作成するための言語です。広域変数と局所
変数はさらに,複雑になっています。どのようになっているか,見ていきましょ
う。
------------------------------------------------------------------------
▼ Javaの広域(グローバル)変数と局所(ローカル)変数
次のプログラムを見てください。JavaScript の J41-01.htm とほぼ同等の Java
のプログラムです。
例 j41-03 xScope01.java
ソース http://www.yscon.co.jp/j/java/jmaga/j41/xScope01.java
1: // 可視範囲 広域変数(メソッドをまたいで共通)
2:
3: public class xScope01 {
4:
5: static int i = 0;
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:
15: public static void main(String xargs[]){
16:
17: i = 3;
18: System.out.print(i);
19:
20: xcount10();
21:
22: System.out.print("注目→ "+ i);
23:
24: }
25: }
実行すると
3
1 2 3 4 5 6 7 8 9 10
注目→ 11
となります。
このプログラムの基本的な構造は,
class 定義{
変数 i の定義
xcount10()定義{ }
main()定義{ }
}
です。このように,変数 i を定義すると,xcount10() でも main() でも共通で
利用されます。JavaScript の広域(グローバル)変数のように使うことができます。
Java の場合は,広域(グローバル)変数という呼び方はしません。有効範囲の広さ
が,局所か広域かという風に単純に2分化できないからです。このプログラムの
場合の,i は,クラス内で有効な変数になります。
次のプログラムはローカル変数の例です。j41-01.htm とほぼ同様の仕事をします。
例 j41-04 xScope02.java
ソース http://www.yscon.co.jp/j/java/jmaga/j41/xScope02.java
1: // 可視範囲 局所変数(各メソッド内のみで有効)
2:
3: public class xScope02 {
4:
5: static void xcount10(){
6:
7: int i = 0; // 局所変数 i を宣言
8:
9: System.out.println();
10: for(i=1; i<=10; i++){
11: System.out.print(i +" ");
12: }
13: System.out.println();
14: }
15:
16: public static void main(String xargs[]){
17:
18: int i = 3; // 局所変数 i を宣言
19: System.out.print(i);
20:
21: xcount10();
22:
23: System.out.print("注目→ "+ i);
24:
25: }
26: }
このプログラムの基本的な構造は,
class 定義{
xcount10()定義{
変数 i の定義
}
main定義(){
変数 i の定義
}
}
この場合は,xcount10() と main() の 変数 i は,それぞれ別のものとして扱
われます。それぞれメソッド内の局所(ローカル)変数となります。
┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓
メソッド内で,変数を宣言すると,局所(ローカル変数
メソッド外,クラス内で変数宣言すると,
クラス内で共通する変数(クラス変数,インスタンス変数)
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
------------------------------------------------------------------------
▼ 局所(ローカル)変数のローカル度
ローカル度というのは私が作った言葉です。局所(ローカル)変数がどれくらい
の局所(ローカル)を指すか,いつくか見てみましょう。
static void xcount10(){
int i = 0;
System.out.println();
for(i=1; i<=10; i++){
System.out.print(i +" ");
}
System.out.println();
}
この場合の i は,xcount10() 内全体が有効範囲です。
static void xcount10(){
System.out.println();
for(int i=1; i<=10; i++){
System.out.print(i +" ");
}
System.out.println();
}
のようにすると,この for文の中が有効範囲になります。
for(int i=1; i<=10; i++){
int xi=0;
System.out.print(i +" ");
}
のようにやると,この xi は,for の中の{ }内が有効範囲となります。
クラスに共通の変数とメソッド内の変数で,同一名がそれぞれ宣言された場合
は,どちらもその有効範囲で別々のものとして扱われます。宣言されているとこ
ろのレベルよりも内側は,一番近いレベルの宣言されている変数が使用されます。
例えば,
static void xcount10(){
System.out.println();
for(int i=1; i<=10; i++){
System.out.print(i +" ");
}
System.out.println();
}
において,もし,クラスのレベルで,int i; と宣言されていても,
System.out.print(i +" ");
で使用される i は,上の for 文のところで宣言されている i となります。
ローカル変数は,メソッド内,forの() の中,また,{ }の中で宣言することが
できまが,同じ名前で宣言することはできません。例えば,
static void xcount10(){
System.out.println();
for(int i=1; i<=10; i++){
System.out.print(i +" ");
}
System.out.println();
}
において,
static void xcount10(){
int i =0;
System.out.println();
for(int i=1; i<=10; i++){
System.out.print(i +" ");
}
System.out.println();
}
と i が二重に宣言でき,それぞれ,別の有効範囲となりそうですが,これをする
コンパイルエラーとなります。変数の宣言は,メソッド単位で別々の名称である
必要があります。
┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓
ローカル変数の名前の範囲
ローカル変数は,メソッド内で名前をユニークにする必要がある。
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓
変数の有効範囲
クラス内で,メソッド,for( ), { } の入れ子構造の,外のもの は,
内部で有効。内部で宣言されているものは,外部で無効。
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
------------------------------------------------------------------------
▼ 広域(グローバル)変数のグローバル度 同一フォルダまで
今度は,広域変数がどこまで有効かを見ていきましょう。
次のプログラムを見てください。
例 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: }
35:
同一ソースファイル内で,クラスをまたいで,変数を使用する場合の例です。
第40号で扱った,クラス変数,インスタンス変数を利用しています。このよう
にすることで,クラスを超えて変数を利用できます。
ここで,
24: int i; // private int i; とすると,外部から参照できず
25: static int xsi; // private int xsi; とすると,外部から参照できず
にコメントで書きましたが,private int i; のようにすると,クラスの外から
は参照ができません。
これは,同一のソースファイル内でクラスの壁をこえて変数を共有する例でし
た。今度はこれを,ソースファイルをこえて変数を共有させます。ただし,同一
フォルダです。
例 j41-06 xScope04.java
ソース http://www.yscon.co.jp/j/java/jmaga/j41/xScope04.java
1: // 可視範囲 広域変数(クラスをまたいで共通 ただし同一フォルダ)
2:
3: public class xScope04 {
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: }
と
例 j41-07 xCount10.java
ソース http://www.yscon.co.jp/j/java/jmaga/j41/xCount10.java
1: // 可視範囲 広域変数(クラスをまたいで共通 ただし同一フォルダ)
2: // テスト用クラス
3:
4: class xCount10{
5:
6: int i; // private int i; とすると,外部から参照できず
7: static int xsi; // private int xsi; とすると,外部から参照できず
8:
9: 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: }
に分割します。単純に分割すればいいです。これで,コンパイル&動作をします。
このように,変数の有効範囲からみると同一フォルダであれば,ソースファイル
の壁はありません。
------------------------------------------------------------------------
▼ 広域(グローバル)変数のグローバル度 フォルダを超えて
フォルダをまたいで,変数の共有をするには,特別な工夫が必要です。
xScope04.javaは,次のように変わります。
例 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: import xsubfdr.xCount10;
が追加されています。これには,サブフォルダ xsubfdr にある 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-06 の xCount10.java と違う所は,まず,保存してあるフォルダが違い
ます。それと
3: package xsubfdr; // package 宣言が必要
の一行と,その他,何カ所かに,public が必要です。
順に見てきましょう。
3: package xsubfdr; // package 宣言が必要
によって,このクラスは,別のフォルダにあるクラスより参照されると宣言し
ています。このクラスは,xsubfdrというパッケージにあるという意味です。これ
は,保存されているフォルダ名と一致します。つまり,同一フォルダに保存する
ことで,同じパッケージ(梱包)に入るということです。
5: public class xCount10{ // public が必要
public を付けることで,別フォルダのクラスからこのクラスを利用可能にする
という意味になります。
7: public int i; // public が必要
8: public static int xsi; // public が必要
インスタンス変数 i とクラス変数 xsi をフォルダを超えた別のクラスから利用
可能にさせるという意味になります。public を付けないと,同一フォルダ内から
のみ利用可能です。また,public の代わりに,private を付けると,外のクラス
からは利用できなくなります。同一フォルダ・同一ソースファイルにあっても利用
できません。
10: public void xcount10(){ // public が必要
メソッド宣言にも public を付けないと別のフォルダにあるクラスから利用で
きなくなります。変数の場合と同様,public を付けない場合は,同一フォルダ
内のクラスからは利用できます。private を付けると,同一フォルダ(同一ソー
スファイルでも)の他のクラスから利用できなくなります。
フォルダを超えて,変数を利用するには,利用する側は,そのクラスを import
し,利用される側では,package宣言,public 宣言を必要とします。
┏ Java 規則 ━━━━━━━━━━━━━━━━━━━━━━━━━━┓
クラスの相互利用は,同一フォルダであれば,特別な指定は必要ない。
フォルダを超える時は,
利用される側は,package 宣言,public 宣言
利用する側は,import 宣言
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
------------------------------------------------------------------------
▼ 広域(グローバル)と public
JavaScript では,広域(グローバル)変数とローカル変数と単純に二つしかあり
ありませんでした。しかし,Java は,ローカル変数も宣言するレベルがあり,
さらに,広域変数にもレベルがありました。
Java 言語では,広域(グローバル)変数といった場合,文法から判断すると,
クラス内のレベルで,メソッドを超えて共通な変数を指すべきです。しかし,人
によっては,Public宣言された変数を指します。
グローバルの本来の英語の意味は,地球(グローブ)規模という意味です。Java
の publicは,地球規模(インターネットに接続されているパソコン)に対して,
公開するという意味ですので,public 宣言された変数は,グローバル変数という
のは正しいしいですね。
変数の共有とメソッドの共有はほぼ同じです。メソッドの共有は,別の号でま
た扱います。また,この号では,継承をめぐる変数の取り扱いは,扱いませんで
した。次の号で扱います。
┏ Jマガローカル規則 ━━━━━━━━━━━━━━━━━━━━━━┓
Java の変数を話題にするときは,「広域(グローバル)変数」という
言葉を以後,使用しない。
ただし,JavaScript の変数の説明では使用する。
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
------------------------------------------------------------------------
▼ Q&A
注意:Jマガで登場するサンプルは再利用フリーですが,このQ&Aコーナーで
登場するプログラムは,再利用を禁止します。
次のような質問がメールで寄せられました。
質問
次のようなコンパイルエラーがでます。原因不明です。
C:\Samples>javac xEvent.java
xEvent.java:16: 式の開始が不正です。
public void mouseExited(MouseEvent e ){
ソースリスト
1: import java.applet.Applet;
2: import java.awt.Graphics;
3: import java.awt.event.MouseAdapter;
4: import java.awt.event.MouseEvent;
5:
6: public class xEvent extends Applet{
7:
8: boolean bl = true;
9:
10: MouseAdapter xia = new MouseAdapter(){
11:
12: public void mouseEnterd(MouseEvent e ){
13: bl = true;
14: repaint();
15:
16: public void mouseExited(MouseEvent e ){
17: bl = false;
18: repaint();
19: };
20: }
21: };
22: public void init(){
23:
24: addMouseListener(xia);
25: }
26:
27:
28:
29: public void paint(Graphics g){
30: if(bl == true){
31: g.drawString("こんにちは", 10,10);
32: }
33: else{
34: g.drawString("さようなら",10,10);
35: }
36: }
37: }
解説(斎藤)
コンパイルのエラーは,「式の開始が不正です」です。このコンパイルエラー
から原因が想像できればかなりのレベルですね。
それでは,まず,このプログラムのインデント(段付け」をきれいにしていましょ
う。
段付け(インデント)を4つの空白とします。行番号は,私が説明しやすいよう
に付けました。みなさんのプログラムには必要ありません。
1: import java.applet.Applet;
2: import java.awt.Graphics;
3: import java.awt.event.MouseAdapter;
4: import java.awt.event.MouseEvent;
5:
6: public class xEvent extends Applet{
7:
8: boolean bl = true;
9:
10: MouseAdapter xia = new MouseAdapter(){
11: public void mouseEnterd(MouseEvent e ){
12: bl = true;
13: repaint();
14:
15: public void mouseExited(MouseEvent e ){
16: bl = false;
17: repaint();
18: };
19: }
20: };
21: public void init(){
22: addMouseListener(xia);
23: }
24:
25: public void paint(Graphics g){
26: if(bl == true){
27: g.drawString("こんにちは", 10,10);
28: }else{
29: g.drawString("さようなら",10,10);
30: }
31: }
32: }
この段階で,おかしいところは,11行目の後の { が 本来なら閉じるべき位置(
14 行目)にありません。
また,18行目の } は,15行目に対応する } ですので,後に ; は必要があり
ません。} の後に ; が必要となるのは,10 行目から始まっている { を閉じる }
のところです。10 行目の式は,本来
MouseAdapter xia = new MouseAdapter() { ○○ };
という式だからです。
14行目に } を補って,さらに,18〜20行のところを正しくすると
1: import java.applet.Applet;
2: import java.awt.Graphics;
3: import java.awt.event.MouseAdapter;
4: import java.awt.event.MouseEvent;
5:
6: public class xEvent extends Applet{
7:
8: boolean bl = true;
9:
10: MouseAdapter xia = new MouseAdapter(){
11: public void mouseEnterd(MouseEvent e ){
12: bl = true;
13: repaint();
14: }
15: public void mouseExited(MouseEvent e ){
16: bl = false;
17: repaint();
18: }
19: };
20:
21: public void init(){
22: addMouseListener(xia);
23: }
24:
25: public void paint(Graphics g){
26: if(bl == true){
27: g.drawString("こんにちは", 10,10);
28: }else{
29: g.drawString("さようなら",10,10);
30: }
31: }
32: }
これでコンパイルが通ります。
このプログラムは,アプレットの上にマウスを置くと,「こんにちは」,
アプレットの外にマススを出すと,「さようなら」と表示するものでしょう。し
かし,これを実行(htmlも必要)すると,「さようなら」は表示されますが,「こ
んにちは」が表示されません。
原因を究明します。
25: public void paint(Graphics g){
26: if(bl == true){
27: g.drawString("こんにちは", 10,10);
28: }else{
29: g.drawString("さようなら",10,10);
30: }
31: }
をみると,「こんにちは」は,bl が true のときに表示されます。今は,「さ
ようなら」は,表示されるので,25 〜 31 行は正しいと仮定できます。ここで,
bi が true になるところをチェックしましょう。
11: public void mouseEnterd(MouseEvent e ){
12: bl = true;
13: repaint();
14: }
マウスがEnter(入ったら) bl = ture にしています。ここが動作していないこ
とになります。11 〜 14 行目は,MouseAdapter クラスの,メソッドを上書きを
しています。熟練者なら,もう気づくと思いますが,上書きをするときのミスは
綴りミスです。上書きをしたいときに,綴りミスをすると,自分は上書きしたつ
もりですが,コンパイラーは,新しいメソッドを定義したと認識してしまいます。
enter に d を付けて過去形にしていますので,entered です。e が抜けた綴り
間違いと分かりますが,念のために,MouseAdapter クラスの定義を確認しましょ
う。
Java の APIドキュメントを見てみましょう。
末広ページ内の
http://www.yscon.co.jp/j/java/index.htm
の「学習資料」のところの「j2sdk 1.4ドキュメント」をクリックします。
そうすると,
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html
が表示されます。
上の方の細長い長方形の中に,「API と言語仕様」があります。これれをクリック
します。そうすると,
http://java.sun.com/j2se/1.4/ja/docs/ja/index.html#api
が表示されます。そこのページの
「Java 2 プラットフォーム API 仕様」をクリックします。そうすると
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.html
が表示されます。常時接続の場合はこのページをお気に入りにいれておくといい
でしょう。左の覧の「すべてのクラス」から,MouseAdapterを探してクリックし
て下さい。MouseAdapter の右側に表示されます。メソッドの概要という表があり
ます。そこの中に,mouseEntered(MouseEvent e) があります。メソッドの綴り
は,mouseEntered であることがこれで確認できました。
補足
「Java 2 プラットフォーム API 仕様」は,ダウンロードもできます。
http://java.sun.com/Download5
の下の方に表示される「ACCEPT」ボタンを押すと,ダンロードサイトに行けます。
解凍すると,doc というフォルダができます。そのフォルダごと,SDKをインストー
ルしたフォルダに入れておかれることをお薦めします。ただし,ダウンロード用
のファイルは,35Mバイト,解凍すると,約180Mバイトになりますので,注意して
下さい。雑誌や書籍の付録でこのドキュメントを入手することもできますが,
SDKは,付属していても,このドキュメントは付属していない場合は多いです。
付録のために書籍を購入されるときは注意して下さい。
質問をお待ちしています。質問は,著作権を放棄していると見なしますので,
ご了承下さい。
------------------------------------------------------------------------
▼ パズル
今回から始まった,プログラムパズルコーナです。締め切りは,4/25日です。
どんどん応募して下さい。JavaScript もしくは,Java のプログラム作成して,
解いて下さい。作成されたプログラムソースと解答を jmaga@yscon.co.jp までお
送り下さい。
出題は,平田豊さんです。
出題者HP http://cgi3.tky.3web.ne.jp/~yutakakn/
[問題]
次の数式を満たすように空欄を数字で埋めよ。ただし、数字は 1 から 9 まで
が使用でき、かつ各数字が使用できるのは一回のみとする。つまり、空欄には 1
から 9 までの数字が格納されることになる。また、解は何通りあるだろうか。
□□+□□□+□□□□=3717
[解答例]
97 + 158 + 3462 = 3717
------------------------------------------------------------------------
▼ 著作権について
このメールマガジンで公開している,プログラムソースは,著作権を当方スタッ
フが所有しますが,プログラムソースの利用は,原則,商用を含めて,再利用,
改変,発表を制限しません。どんどんご利用下さい。
質問コーナのプログラムソースは,著作権に問題がある場合があるかもしれま
せん。原則を適用しません。再利用の許可をしません。
画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利
用はできません。
本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を
必要とします。
------------------------------------------------------------------------
▼アンケート(以下を返信してください)
この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。
この号の内容
1 良かった
2 普通
3 良くなかった
コメント,リクエスト,質問もお待ちしています。