• ベストアンサー

メソッドが同じオブジェクトのフィールドを参照しません

<test1.javaファイル> import java.awt.*; public class test1 { //フィールドの定義 public int x = 10; //メソッドの定義 public void drawMoji(Graphics g) { g.drawString("xの値は、" + x, 20, 20); } } <test2.javaファイル> public class test2 extends test1 { //フィールドの定義 public int x = 20; } <mt.javaファイル> import java.awt.*; import java.applet.*; /* <applet code = "mt" width = 300 height = 200> </applet> */ public class mt extends Applet { public void paint(Graphics g) { //インスタンスの作成 test2 t2 = new test2(); //xの値を表すメソッドの実行 t2.drawMoji(g); } } 上記の3つのファイルをコンパイルして、mt.javaファイルをアプレットビュアーで実行したら、"xの値は、20"と表示したいのに、"xの値は、10"と表示されます。t2オブジェクトのフィールドのxの値が20だから、t2.drawMoji(g)で"xの値は、20"と表示されると思うのですが、どうしてこうなるのでしょうか?教えてください。

  • ab5
  • お礼率15% (10/63)
  • Java
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • covachan
  • ベストアンサー率38% (46/120)
回答No.2

このケースはJAVA言語仕様でいうところの、変数の隠蔽と呼ばれるものです。 スーパークラスの変数へアクセスする際には「super」を使用します。このケースでは「super.x」となります。 隠蔽とは継承されたクラスでスーパーなクラスの持つ変数、メソッドと同じシグネチャを持つものを持たせ、スーパーなクラスへのアクセスを制限すると言うものです。 継承関係にあるクラスはスーパーなクラスのメソッド、変数をそれぞれ独立して持ちます。 継承したクラスに宣言せずともスーパーなクラスのメソッドを呼べるのは決まりとしてスーパーのメソッドを呼び出すという仕様になっているからです。 しかし、同じシグネチャのメソッドを継承クラスで宣言すると別々の動きを行う同じシグネチャのメソッドが複数存在することが可能になります。 変数も同様です。ですので、superを使用することにより複数の空間を使い分けることが可能な仕様となっています。 オーバーライドという手法はインターフェイスとしてこのうちの継承クラスの機能のみを公開するという方法です。

ab5
質問者

お礼

丁寧な解説をありがとうございました。

その他の回答 (1)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

これだと、test1 と test2 で《それぞれ一つずつ》 x というフィールドを定義したことになります。 サブクラスで同じ名前のフィールドを宣言しても「上書き」したことにはなりません。 g.drawString("xの値は、" + x, 20, 20); の「x」は (メソッドと同じクラスである) test1 の x なので、表示されるのは「10」になります。 私の過去の回答を参考にしてください。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1201607&rev=1

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1201607&rev=1
ab5
質問者

お礼

ありがとうございました。

関連するQ&A

  • javaアプレットでのy=x^2のグラフ

    javaアプレットでy=x^2のグラフを描写したいのですが、現在の状態ではグラフの右側しか画面に現れません。軸の移動をすればよいと思うのですが、どのように修正すればよいのでしょうか? import java.applet.Applet; import java.awt.Graphics; import java.awt.Color; public class test1 extends Applet{ public void paint(Graphics g){ g.setColor(Color.red); int x,yp=100,xp=0; for(x=0;x<200;x++){ int y=(int)(x*x)*(-1)+100; g.drawLine(xp,yp,x,y); xp = x; yp = y; } } }

  • main()メソッドが無いコード

    最近、Javaアプレット等を勉強してるのですが 今まではmain()メソッドの中に処理を書いて来たのですが、 下記の様なコードにはmain()メソッドが有りません。 import java.applet.Applet; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample6 extends Applet implements ActionListener { Button bt; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); } public void actionPerformed(ActionEvent ae) { bt.setLabel("中止"); } } これはどう言う事なんでしょうか?

    • ベストアンサー
    • Java
  • アクションリスナー(初心者です)

    JAVAでボタンが押されたらすでに描かれている線に さらに線が加わって描かれるというプログラムを作ろうとしているのですが、アクションリスナーを受け取ったメソッドの中身をどうしたらいいのか行き詰まりました・・・作りかけのプログラムを載せてみますので アドバイスいただければと思います よろしくお願いします import java.applet.Applet; import java.awt.Graphics.*; import java.awt.event.*; import java.awt.*; public class file928 extends Applet implements ActionListener { Button botan; public void init() { botan=new Button("選択"); add(botan); botan.addActionListener(this); } public void paint(Graphics g) { g.drawString("L.A.Airport",100,300);           ~中略~ g.drawLine(405,420,655,240); } public void actionPerformed(ActionEvent x) { ーここをどうしたらいいかわかりません・・・ー } }

    • ベストアンサー
    • Java
  • JAVAの文法について教えてください。

    JAVAを学習しはじめたばかりの初心者です。 下記のプログラムに関してわからないので教えてください。 下記はtest.gif画像を表示するプログラムなのですが、 イメージを表示するために import java.awt.Graphicsをインポートして、 Image im でオブジェクトを宣言するのはわかるのですが、 通常はこの後に im = new Image() のようにインスタンス化する必要があると思うのですが、 このプログラムにはありません。 なぜ不要なのでしょうか? ********************** import java.applet.Applet; import java.awt.Graphics; import java.awt.Image; public class MyImage extends Applet{ Image im; public void init(){ im = getImage( getDocumentBase(), "test/test.gif" ); } public void paint(Graphics g){ g.drawImage( im ,10,10, this); } }

    • ベストアンサー
    • Java
  • テキストフィールドに入力した数だけ円を表示する

    お世話になります。 表題の件ですが、どうしてもうまくいかなくて困っています。 Javaアプレットを使って、テキストフィールドに入力した数だけ円を描くというプログラムを作成しているのですが、下記を実行してもエラーになってしまい、 テキストフィールドに数字を入力しても何も出てこない状態です。 import java.awt.*; import java.applet.*; import java.awt.event.*; public class drawCircle extends Applet implements ActionListener{ TextField Circle; public void init(){ Circle = new TextField("", 2); add(Circle); Circle.addActionListener(this); } public void actionPerformed(ActionEvent e){ int CircNum = Integer.parseInt(Circle.getText()); repaint(); } public void paint (Graphics g){ int x=20; for(int i=0; i<=CircNum; i++){   ←※ここが悪いらしい g.drawString("◎", x, 20); x +=20; } } } ※の部分では、"CircNumを解決できません"と表示されてしまいます。 テキストフィールドを作成して、テキストフィールドに入力された数字を CircNumに代入して、その数だけ◎を描くというつもりで 上記を作成したのですが、なぜ※のようなエラーがでてきてしまうのでしょうか。 メソッドを超えてCircNumを使用しているからかな、と思うのですが、 解決方法がわかりません。 どなたかご教授いただけませんでしょうか。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • appletの画像が表示されない

     画像を表示するappletを作ったんです。  コマンドのappletviewerでは確認出来るんですが、IEでは何故か表示されません。何故なんでしょう?  WINXP/IE6.0.2600です。  以下にコードを記述します。 import java.awt.*; import java.applet.*; public class test extends Applet {  Image img;  public void init() {   img = getImage(getDocumentBase(), "test.PNG");  }  public void paint(Graphics g) {   g.drawImage(img, 10, 10, this);  } }

    • ベストアンサー
    • Java
  • コンパイル時のエラーの件

    html上にJavaを表示させようとして、いちばん簡単なプログラム以下を作りました import java.applet.Applet; import java.awt.Graphics; public class hello extends Applet { public void paint (Graphics g ) { g.drawsString ("Hello Java Applet !",20,20); } } その後コンパイルしようとしたのですが、次のようなエラーメッセージが現れました。(特に.awtというのが全くわからないのです。) hello.java:1: シンボルを解釈処理できません。 シンボル: クラス applet 位置 : java の クラス import java.applet.applet; ^ hello.java:2: シンボルを解釈処理できません。 シンボル: クラス awt 位置 : java の クラス import java.awt.graphics; ^ hello.java:4: シンボルを解釈処理できません。 シンボル: クラス applet 位置 : hello の クラス public class hello extends applet { ^ hello.java:5: シンボルを解釈処理できません。 シンボル: クラス graphics 位置 : hello の クラス public void paint (graphics g ) { ^ なにか設定などがおかしいのでしょうか?教えてください。

    • ベストアンサー
    • Java
  • add( )メソッドについて

    import java.applet.Applet; import java.awt.*; /* <applet code="Sample" width=400 height=250> </applet> */ public class Sample extends Applet { public void init() { // ラベルを作成する。 Label lb = new Label("こんにちは。", Label.LEFT); add(lb); } } 上記のプログラムのadd(lb)について質問です。上記のadd()メソッドは、lbはLabelクラスなので、LabelクラスかComponentクラスのパラメーターを一つ持つvoid型のadd()メソッドとなると思うのですが、調べてもそのようなメソッドが存在しませんどうしてでしょうか?上述のことが間違っているのでしょうか?教えてください。

    • ベストアンサー
    • Java
  • アプレットのコード変更後の反映ができない

    JAVAの初心者です。困っております、お助けくださいm(__)m JAVAアプレットを作成しております。 IE上で”Hello!”と表示するだけです。 一回目は正常なのですが、 二回目は”Good Morning!”と表示するように 変更して、再度IEで表示してみると ”Hello!”のままなのです。 classファイルは更新されています。 メモリに残っているんでしょうか・・ IEの履歴や一時ファイルも削除してみましたが だめでした。 環境はWinXPSP2、NetBeans IDE 4.1、 JAVA 1.5.0_04 です。 コードは以下の通りです。 <Lesson1.java> import java.applet.Applet; import java.awt.*; public class Lesson1 extends Applet{ public void paint(Graphics g){ g.drawString("Hello!", 10,10); } } <Lesson1.html> <HTML> <BODY> これはテスト <applet code="Lesson1.class"></applet> </BODY> </HTML> よろしくお願いします。

    • ベストアンサー
    • Java
  • javaで画像出力

    javaでプログラムを書いて画像をGIF、JPG、BMPなどの形式で表示させたいのです。 appletでは下記のプログラムで円を表示することができたので、これを他の形式で表示する方法を教えて下さい。 import java.applet.*; import java.awt.*; public class Sample1 extends Applet { public void paint(Graphics g) { g.fillOval(120,40,70,50); } }