次のようなクラスで

public class ClassA
{
  public static void main(String[]args)
  {
    new ClassA(); /* 構築A */
  }
  public ClassA()
  {
    new ClassI();
  }
  public class ClassI()
  {
    ClassA.this.MethodA(); /* 命令A */
  }
  public void MethodA()
  {
    System.out.println("HELLO");
  }
}

この命令Aの部分の
(クラス名.this.メソッド)というアクセス方法がよくわかりません
とりあえす(ClassA.this)が構築Aの部分で生成された
インスタンスではないかとおもうのですがそれで正しいのでしょうか?

また
インナークラスはインナークラスの定義されているクラス以外から
インスタンスを生成できないのでしょうか?
つまり次のクラスを追加して

public class ClassB
{
  public ClassB()
  {
    new ClassA.ClassI(); /* 構築B */
  }
}

ここの構築Bのように(この場合はダメの様ですが)他のクラスから
構築することです

もし仮にできるとしたら
そのときの命令Aの(ClassA.this)は一体なんの
インスタンスを指すのでしょうか

急ぎのプログラムを作っているので
たいへん不躾ですが、なるべく早くお答えをお願いします

このQ&Aに関連する最新のQ&A

A 回答 (2件)

this というのは通常自分自身を指す参照ですが、インナークラスの場合


自分を保持している親にアクセスするときも this を使います。で、
自分自身を指すthisと親を指すthisを区別するために 親のクラス名.this
という書き方をします。インナークラスが入れ子になっているときもこの
方法で好きな親に一発でアクセスできます。

なのでClassA.thisは構築Aで生成されたインスタンスであってます。

インナークラスは親クラスを必要とします。なぜわざわざクラスの中にまた
クラスを書くなどと言うややっこしいことをするのかというとインナークラス
が親クラスを知っている必要があるからです。(親を必要としていない場合は
親の外で定義しましょう)

で、インナークラスは暗に親の参照を持っていることになります(多分)。
この辺は予想ですがその関係で親のわからないインナークラスは生成出来ない
んじゃないでしょうか。(javaは参照の初期化を強要する言語です。)つまり
他のクラスからはインナークラスのインスタンスを生成できないと思います。
本来は他のクラスからインナークラスを生成する必要性もないはずです。

以上の話はちゃんと調べたわけではないので間違っているかもしれませんが
おおむねあっていると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます

なるほど!
大変参考になりました
(クラス・this)という記述が不気味で仕方なかったのです
(私の読んでる参考書にも書いてなかったので・・・)

Javaをはじめたのが一昨年の夏でそのころはまだ
swingが出たばかりでした

最近になってまたJavaをやり始めたんですが
あちこち仕様が変わって
驚いてます

当時のプログラムはJDK1.3では動かないし・・・
Javaの仕様ってまだかたまってないんでしょうか・・・

お礼日時:2001/02/22 19:24

コピーして試してみたところ、コンパイルが通りません。



public class ClassA
{
public static void main(String[]args)
{
new ClassA(); /* 構築A */
}
public ClassA()
{
new ClassI();
}
class ClassI
{
public class ClassI()
{
ClassA.this.MethodA(); /* 命令A */
}
}
public void MethodA()
{
System.out.println("HELLO");
}
}

だと思うんですけど,そう考えて良いのでしょうか。

この回答への補足

そうです
もうしわけありません
あわてて書いたので間違えてしまいました

補足日時:2001/02/22 19:16
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q私を見下す夫

先日、「君なんかに比べると俺の方が賢い」と平然と言われました。
仕事(結婚前同僚でした)にしろ、性格にしろ、知識量にしろ、すべて私は自分より劣っていると夫が思っていることはわかっていましたが、こうもはっきり言われると驚きました。
昨夜も食事中に、「99+88は?」と聞いてきました。
私は暗算が苦手なのですが、夫が何をしたいのかわかったので私は無視しました。
すると、やはり得意満面に計算の仕方を説明しようとしたので怒りました。

こんな夫を無邪気とかアホだなとか思って流した方がよいのかとも思いますが、こう何度も繰り返すと本当に腹が立ちます。

夫は意志が弱く、根気もなく、目標を決めて努力することができない人です。
人種差別的発言も平気でします。
それなのに、根拠はわかりませんが、自分には相当自信をもっているみたいです。
だから余計に夫がレベルの低い、浅い人間に見えて仕方ない時があります。

こんな夫の性格を治すことなんてできるとは思っていませんが、こういう人を選んで結婚してしまった自分を責める他ないのでしょうか。

Aベストアンサー

どうもコンプレックスがあるようですね、この旦那さん。
会社でストレスを溜めて帰ってきても、本来癒してくれるはずの奥様に劣等感を感じてしまって、
それが裏目に出ているようにも思えます。

本当は奥さんに思い切り甘えたいのに出来ないんでしょうね。家にいて素の自分が出せないのは苦しいですよ。奥さん何でもテキパキやる方じゃないですか?甘えにくいのかもしれませんよ旦那さん。もうちょっとソフトな雰囲気を作るようにしたらいいんじゃないかな。

例えば何を決めるにしても旦那さんにちょっと相談するようにすればいいです。二人の力で何事も成し遂げたよう見せれば、かけがえのないパートナーだと再認識させることが出来るかもしれませんよ。まずそんなにカリカリしないで、奥さんの方から少し歩み寄ってみましょうよ。

それから、もし馬鹿にされても悔しそうな素振りを見せないことです。そうなれば馬鹿にした甲斐がありますからね。表情に出さずスーッと流しなさい。
間違っても『私のような馬鹿な女と結婚したあなたは何なの!』なんていっちゃダメですよ(笑)

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Qpublic class Power {

public class Power {
static long pow(int a, int b){
if (b<=0)
return 1;
else
return a*pow(a,b-1);
}
public static void main(String args[]){
System.out.println(pow(1,3));
}
}

run:
1
BUILD SUCCESSFUL (total time: 0 seconds)

簡単な問題ですが。。。
僕の予想では答えは2でした

1 * (1, 2)
1 * 1 * 2
じゃないんですか?

Aベストアンサー

いえ、

pow(1,3)
= 1 * pow(1,2)
= 1 * 1 * pow(1,1)
= 1 * 1 * 1 * pow(1,0)
= 1 * 1 * 1 * 1 = 1です。

#ちなみに…例えば
pow(3,2)
= 3 * pow(3,1)
= 3 * 3 * pow(3,0)
= 3 * 3 * 1
= 9
となります(上記が1の4乗として計算されているんじゃなくて(1の3乗) * 1だという印象をつけたかったので例を出した)

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

QA a = new A(){}; の構文の意味が分からない。

下記サイトのコードを読んでいて、

ResponseListener listener = new ResponseListener() {
//略
};

という書き方があったのですが、どういう意味になるのでしょうか?
インスタンスの作り方は単に

A a = new A();

だと思うのですが…。

http://www.snmp4j.org/doc/org/snmp4j/Snmp.html

Aベストアンサー

無名クラスと呼ばれるものよ。
私も良くやるわ。

ちなみに
A a = new A();
はできないわよ。
Aはインターフェースだからね。


上記の場合、正式に実装するなら、
ResponseListenerをimplementsした
MyResponseListener(仮名)を別途作成し、
それを
ResponseListener listener = new MyResponseListener();
とする必要があるわ。
でも、このMyResponseListenerは
今ここでしか使わない、他からまったく参照する必要のない
超ローカルなクラスなのよ。
このメソッドが終了すればGCにかけてもいいわけ。
そんな場合、わざわざクラスを1つ作る必要なくて
その場でちょちょいとやってしまうことができるのよ。
それが無名クラスっていう実装方法よ。

http://www.javaroad.jp/java_class15.htm

FileFilterやCompare、Runnableなんかで
他のクラスで再利用しないときは良くやるわ。

無名クラスと呼ばれるものよ。
私も良くやるわ。

ちなみに
A a = new A();
はできないわよ。
Aはインターフェースだからね。


上記の場合、正式に実装するなら、
ResponseListenerをimplementsした
MyResponseListener(仮名)を別途作成し、
それを
ResponseListener listener = new MyResponseListener();
とする必要があるわ。
でも、このMyResponseListenerは
今ここでしか使わない、他からまったく参照する必要のない
超ローカルなクラスなのよ。
このメソッドが終了すればGCにかけても...続きを読む

QAppletのpublic void paint(Graphics g)

は抽象クラスのGraphicsのオブジェクトを引数に持ちますが抽象クラスはオブジェクトを発生できないのに何故オブジェクトを渡せるのでしょうか?

Aベストアンサー

実際にパラメータとして渡されるのは、Graphicsのサブクラスのインスタンスだからです。

Graphics クラスは抽象クラスですが、そのサブクラスは抽象クラスとは限りません。

Qクラスインスタンスとクラス型変数の配列

C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。
最初にC++のサンプルを書かせていただきます。
----- C++ -----
class Hoge {
 /* 実装省略 */
}

int main( void )
{
 Hoge *hoge = new Hoge ;
 Hoge *hoge = new Hoge[10] ;
}

---------------

これをJAVAで実装した場合、以下のようになると思います。

----- JAVA -----
class Hoge {
 /* 実装省略 */
}

class Test {
 public static void main( String[] args )
 {
  Hoge hoge = new Hoge() ; /* 1 */
  Hoge[] hoge = new Hoge[10] ; /* 2 */
 }
}
---------------

JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。

そうすると、
int[] a = new int[10] ;
と、
Hoge[] hoge = new Hoge[10] ;
のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。

私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。

よろしくお願いします。

C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。
最初にC++のサンプルを書かせていただきます。
----- C++ -----
class Hoge {
 /* 実装省略 */
}

int main( void )
{
 Hoge *hoge = new Hoge ;
 Hoge *hoge = new Hoge[10] ;
}

---------------

これをJAVAで実装した場合、以下のようになると思います。

----- JAVA -----
class Hoge {
 /* 実装省略 */
}

class Test {
 public static void main( String[]...続きを読む

Aベストアンサー

> JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。
> C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、
> JAVAの場合は考え方が違うものだということでしょうか。
 いえ~すざっつらいと。Javaでは、new Hoge[10]という式は「要素数が10で固定されているHogeの配列型」のインスタンスが生成される。ぶっちゃけ、Arrayクラスのインスタンスと思ってもらって差し支えない。参照先がnullである10個のHoge変数という事だな。なので、10個のそれぞれについてHogeクラスのインスタンスを生成して代入してあげないといけない。
 intの場合はすぐ使えるじゃん! と思うかも知れないが、Javaの場合、これは値型の変数と参照型の変数という扱いで、CやC++で言う普通の変数とポインタ変数の違いと思って良い。なので、Javaでは「intの配列型」をインスタンス化すると、それは中身が参照でなくて値そのものなのですぐ使えるというわけだ。この辺は、

int i; // すぐ使える。値そのもの。
Hoge h; // nullなので、Hogeのインスタンスを代入してあげないと使えない。

と同じものだ。つまり、Hogeの配列型をインスタンス化する、とは、次の事と同じになる。

Hoge hoge0;
Hoge hoge1;
Hoge hoge2;
・・・
Hoge hoge9;

これは全部nullやんな。結論としては、「配列をnewすると、変数が作られる」という事になる。

> JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。
> C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、
> JAVAの場合は考え方が違うものだということでしょうか。
 いえ~すざっつらいと。Javaでは、new Hoge[10]という式は「要素数が10で固定されているHogeの配列型」のインスタンスが生成される。ぶっちゃけ、Arrayクラスのインスタンスと思ってもらって差し支えない。参照先がnullである10個のHoge変数という事だな。なので、10個の...続きを読む

Qアプレットのinitは、なせ"public void init()とかくのでしょうか

java初心者です、宜しくお願いします。
javaのコンストラクターについて質問致します、宜しくお願いします。

アプリケーションのコンストラクターは、"public *****(){}"
となりますが、

アプレットのinitは、"public void init(){}"となるのはどのような理由から
でしょうか。

参考書等を色々検索しましたが、ヒットしませんでした、宜しくお願いします。

Aベストアンサー

通常のクラスでは、初期化処理は new をした時のコンストラクタで行いますが、
画面に表示する部品のようなクラスでは、初期化処理のタイミングが異なります。

init の説明
https://docs.oracle.com/javase/jp/8/docs/api/java/applet/Applet.html#init--

説明を読むと、アプレットはブラウザとかビューアによって new されます。
恐らくその後でセキュリティー的な諸設定を行ない、
端末がスリープ状態とか画面が非表示とかでないタイミングを待ってから、
ようやくユーザーによる初期化処理を認めているのでしょう。

というわけで、コンストラクタで初期化させたくない、なにか特別な事情があるクラスの場合は、
コンストラクタとは別に init とか initialize とか configurate などのメソッドを用意することがあります。

Qスーパークラスのインスタンスをサブクラスにアップキャスト

↑したい場合はどうしたらいいでしょうか。

データ構造体(beans)なのでスーパークラスのgetterとsetterを
利用してサブクラスに再構築する方法が考えられますが
どうも腑に落ちないので質問してみました。

サブクラス側で継承をやめて集約にするにしても
getterとsetterをまた書くの?って感じでわずらわしいです。
(jsp:getPropertyを利用するかもしれませんしね)
さらにスーパークラスのメソッド全てをインタフェース化してサブクラスで実装とかしてたら具合が悪くなってきます。

この長年の疑問に終止符を打ってくれる方はいませんか?

Aベストアンサー

これ以上に的確な回答が存在するかもしれませんし、そもそも意図する回答ではないかもしれませんが。。。汗

スーパークラスの記述変更は可能なのですよね?
でしたら、子クラス(継承クラス)を通して、「親クラスで定義されているフィールド」を引数で渡される親クラスと同型(インスタンス自体は別の)のフィールド値に変更すれば何とかなりそうです。
どういった形で実装するかは自由なのですが、ソースコードを拝見した限りコンストラクタで操作をしたいようなので、今回はコンストラクタで値の変更をしてみます。。

import java.lang.reflect. * ;

class Box {
  private String name;
  public Box() {}
  public Box(Box box) {
    try {
      Class c=box.getClass();
      Field[] f=c.getDeclaredFields();
      for(int i=0; i<f.length; i++){
        f[i].set(this,f[i].get(box));
      }
    }
    catch(IllegalAccessException e){}
  }
  public String getName() {
   return name;
  }
  public void setName(String name) {
   this.name = name;
  }
}

他のクラス(ColorBox,Main)は提示された物そのままで動くと思います。

もし見当はズレな回答でしたらゴメンナサイ。
「こんなことせんでも・・・」という方が居られましたら補足・訂正・助言を下さい。私の勉強にもなりますので。

これ以上に的確な回答が存在するかもしれませんし、そもそも意図する回答ではないかもしれませんが。。。汗

スーパークラスの記述変更は可能なのですよね?
でしたら、子クラス(継承クラス)を通して、「親クラスで定義されているフィールド」を引数で渡される親クラスと同型(インスタンス自体は別の)のフィールド値に変更すれば何とかなりそうです。
どういった形で実装するかは自由なのですが、ソースコードを拝見した限りコンストラクタで操作をしたいようなので、今回はコンストラクタで値の変更をし...続きを読む

Qクラスのインスタンスからクラスを知る方法

メソッドの中で引数がテキストボックスなのかボタンなのか判別させてください。
下のc == TextBoxの部分を正しくしてください。
public static void test1(Component c){
if(c == TextBox)System.out.println("テキストボックス");
if(c == Button)System.out.println("ボタン");
}

コンポーネントは下のものです。
/com/nttdocomo/ui/Component.html

Aベストアンサー

== ⇒ instanceof


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング