• 締切済み

インスタンス変数の特殊な参照

次のようなクラスを考えたときに(特に意味があるものではないですが) class A{ int a; A(){ a = 10; B b = new B(); } } class B{ int b; B(){ b = 20; C c = new C(); } } class C{ int c; C(){ c = 20; } } Cのコンストラクタの中から、Aのインスタンス変数aやBでのbの値を 参照することって出来ないのでしょうか? 変数をクラス変数にする、引数として渡す以外の方法を探しています。

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • momozange
  • ベストアンサー率67% (21/31)
回答No.2

クラスBとクラスCが単独のクラスである必要がないのであれば インナークラスにしてしてまえばとり回しが楽になるのでは? もう少し、目指している形を詳しく説明していただけませんか。

003br005eed
質問者

お礼

どうもありがとうございました。 少し抽象的な問題で使う考え方でなんとも説明できなくてすいません。 インナークラスのこと、すっかり忘れていました。 試してみます。

noname#49428
noname#49428
回答No.1

無理です。

003br005eed
質問者

お礼

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

関連するQ&A

  • C++でクラスのインスタンス化が参照

    他の人のC++ プログラムを見ているのですが、 クラスをインスタンス化する部分で CLASS_CAR car; CLASS_TRAIN &train; のように書かれているのですが 後者の意味が分からないのですが、これは何をしているのでしょう? 引数なら 元の変数のエイリアスを宣言するところなのでしょうが、  これだと 何に対するエイリアスだか分からず 困っています。

  • C#のインスタンスを参照渡ししたい

    メインのクラスAにウェブブラウザAがあります。 クラス A { メソッドA(){  ウェブブラウザA.Navigate(URL); } メソッドC(){  MessageBox.Show("これは成功"); } } クラス B {  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功  } A a = new A(); a.メソッドA();//失敗 a.メソッドC();//成功 } このようなプログラムを作っています。 クラスBをインスタンスして実行すると クラスBのメソッドBは成功しますが、クラスAの方で宣言しているa.メソッドAは失敗します しかし、a.メソッドC();は成功します。 これは、a.メソッドAは、その上のA a = new A();でつくられた新しいインスタンスのなかで処理がされていて起動時につくられたクラスAのインスタンスとは別のものになっているからだと思うのですが、まちがいないでしょうか? この処理を成功させたい場合、起動時に作られたクラスAのインスタンスをメソッドBの引数に参照渡しですれば、  メソッドB(ウェブブラウザA){   ウェブブラウザA.Navigate(URL);//成功   メソッドA();  } も可能なのではないかと考えているのですが、可能でしょうか?またそのインスタンスを引数にする方法はどのようなものでしょうか? ちなみに、クラスBはDLLに置いてあり、メソッドAは複数のDLLで使うので毎度書くのは面倒なのでクラスAの中で呼び出して使いたいと考えています。

  • 動的に変数をセット後他クラスから参照する場合

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{  static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。

    • ベストアンサー
    • Java
  • 計算してからコンストラクタに渡すか

    メインクラスAからクラスBをインスタンス化します。 Bクラスが持つ変数Cには1~100までの数値がランダムで入ります。 ここで、AクラスであらかじめCを計算しておいてBクラスのコンストラクタに引数として渡すのか それともAクラスではBクラスを生成するだけで、 Bクラスのコンストラクタ内で変数Cの値を計算するのか どちらが良いでしょうか? お教えください。

    • ベストアンサー
    • Java
  • 引数を含む変数を参照するには

    下記のような変数があります cd_01="a"; cd_02="b"; cd_03="c"; … で、引数で受け取った値を含む変数を参照したい場合、 例えば、引数で01を受け取った場合は、 cd_01の"a"を 02を受け取った場合は"b"を参照したいのです。 変数名「cd_xx」は可変です。 よろしくお願いします。

  • インスタンス変数とクラス変数の違い

    1つのクラスオブジェクト内のインスタンス全てで共有できる クラス変数 @@a と、 同じインスタンス内であればメソッドの定義を越えてその値を 参照したり、変更したりできるインスタンス変数 @a のスコープの違いをお手すきでしたらご指導願えませんか? あとクラス変数にはセッターやゲッター等のアクセスメソッドを 設定できるんですか? いろいろ知りたいです。

    • ベストアンサー
    • Ruby
  • インスタンス変数について

    JAVA勉強中のものです。 インスタンス変数についてわからないのですが、 class Data{int d;} classSample{ public static void main(String[] args){ Data data1 =new Data(); Data data2 =new Data(); data1.d = 100; data2 = data1; data2.d = 200; System.out.println(data1.d); } } 実行すると200が表示されますが、new演算子によってできたオブジェクトの実体を参照する ID がdata1およびdata2に入るのは理解できるのですが、 インスタンス変数のdはメモリ上でどう設定されているかイメージがわきません。 わかる方どうぞ教えて下さい。

    • ベストアンサー
    • Java
  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • インスタンス化されているかの情報を 知るメソッド

    VisualStudioC#で Aというクラスがあり、それを B,Cというクラスでインスタンスで使用したとします。 A: { ?????? } B: { A a = new A(); } C: { A a = new A(); } Aクラスの中の処理でB,Cのどちらでインスタンス化されているのかという情報を 知るメソッドはあるのでしょうか? ちなみにインスタンス化するときにAに引数などを送り込まないこととします。

  • 【C#】クラスのコンストラクタ引数参照渡しでエラー

    C#の.NETでWindowsアプリを作成しております。 C++/CLI経験はありますが、C#は全くの素人です。 AクラスからBクラスに、Cクラスを参照渡しで渡し、 BクラスにてCクラスのメンバ変数の値を書き換えた後、 Aクラスでその値を使用するといったプログラムを作成しようと思っています。 Bクラスを生成する際に、コンストラクタの引数渡しにて、 Cクラスを渡す書き方をしたのですが、下記エラー エラー CS0051: アクセシビリティに一貫性がありません。 パラメータの型 'ref Test.C' のアクセシビリティは メソッド 'Test.B.B(ref Test.C)' よりも低く設定されています。 が発生してしまい、解決法が分かりません。 何か根本的なことが間違っているのでしょうか。。 解決策をご存知の方おられましたら、ご教示お願い致します。 下記にサンプルコードを記載します。 【Aクラス】 B b = new B( C c ); 【Bクラス】 namespace Test { public partial class B : Form { public B(ref C c) // コンストラクタ { InitializeComponent(); } } } 【Cクラス】 namespace Test { class C { public int hoge; } }

専門家に質問してみよう