• 締切済み

静的メンバ、ネストクラス、enumのアクセス

下記のコードを試した所、(1)(4)は無事動作しますが、 (2)と(3)はコンパイルエラーになってしまいます。 初め、静的メンバの場合はnullでも動作する事にすごい驚いたんですが、 どこまでなら問題なく動作するかのラインがわからなくてこまっています。もしよろしければアドバイスをよろしくお願いします。 class Test{ static String A="A"; static class B{ static String val = "B"; } enum C{A,B,C} } enum D{A,B,C} class Sta{ public static void main(String[] args){ Test y=null; D y2 = null; (1)System.out.println(y.A); (2)System.out.println(y.B.val); (3)System.out.println(y.C.A); (4)System.out.println(y2.C); }}

  • ftrgp
  • お礼率57% (8/14)
  • Java
  • 回答数2
  • ありがとう数3

みんなの回答

回答No.2

(2)と(3)がコンパイルエラーになるのは、文法的に間違えているからで、yにnullが代入されていることは関係ありません(yがnullでなくてもエラーになる)。 AはクラスTestのクラス変数なので、y.A のように書くことができます。 しかし、BとCはTestにネストしたクラスの名前であり、クラス変数ではないですよね。なので、y.B や y.C のように書くことはできません。 クラスTestに、 static B D; static C E; のようなクラス変数を追加すれば、、 y.D.val y.E.A のような記述が可能になるはずです。

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

直接の回答でなくてすみませんが(nullのオブジェクトを参照できる意味が分かりません)、そもそも静的メンバへのアクセスであればオブジェクトを使うのではなく、クラス名で参照するのが正しいやり方ではないでしょうか。実際、 y.B.val → Test.B.val y.C.A → Test.C.A という呼び方に代えたらコンパイル、実行ともにできました。 そもそも静的メンバへのオブジェクトでの参照って、コンパイル時に警告が出るんじゃなかったかな…Eclipseなら出ますよね。javacコマンドだとオプションが必要だったかな。ちとうろ覚えです。

ftrgp
質問者

補足

ご回答ありがとうございます。 上記の静的メンバのアクセスは私も非常識だなとは思いましたが、 SJC-P対策の参考書の問題の中にenumへのアクセスが(4)が 使用されていて、それから自分で色々試してみて 例えば(2)のネストクラスの場合、AA.B o=null;を宣言し System.out.println(o.val);したらうまくいったりと どこまでの範囲を覚えればいいのかわからなくなり 質問させていただきました。

関連するQ&A

  • クラスの使い方が分からない

    文字列を返すというクラスbを作りました。 bは引数が1つあって、引数に与えられた文字の手前に"f"を挿入した文字を返します。 結果は"fh"となることを期待しました。 期待通りになるように修正していただけませんか? public class a {  public static void main (String args[]) {   String g = b("h");   System.out.println("Hello World!!");  } } public class b {  b(String c){   d(c);  }  private String d(String c) {   String e = new String("f" + c);   return e;  } }

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

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 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
  • 内部クラスのインスタンスを動的に取得したい

    class test {   public test(String str){     try{       Class c = Class.forName("test$TESTSUB" + str);       c.newInstance();  // ココでエラー     }catch(Exception e){       e.printStackTrace();     }   }   public static void main(String[] args){     new test(args[0]);   }   class TESTSUB1 {     public TESTSUB1(){       System.out.println("# " + toString());     }   }   class TESTSUB2 {     public TESTSUB2(){       System.out.println("# " + toString());     }   } } 上記のようなコードにより、内部クラスのインスタンスを 動的に得たいと思っていますが、エラーとなってしまいます。 エラー回避方法、または他にいい方法がありましたら、 ご教示のほどよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Javaのコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

  • enum列挙子に使える文字列と使えない文字列

    enum Ok{A,A,月1,月1,_,?} enum Ng{1月,1月,→,!,☆} public class Main{public static void main(String[] args){ System.out.println("あああああ"); }}//終わり このJavaプログラムはエラーになります。何故ですか? 要するに、enumに使える列挙子の法則性に興味があります。「?」は通って「!」はエラーって、コンパイルを試みた後に結果を知ると、色々とムカつきます。 「!」は通って「?」はエラーだと嘘が書物に書いてあると、騙されます。 enumで使える列挙子(要素)のタイプが載ってるサイト、enumの列挙子に使うとエラーになってしまう例が載ってるサイトなどを紹介してくれるとありがたいです。 どんな文字列でもenumに使えて、何でもOKなら親切だと思うのに・・・

    • ベストアンサー
    • Java
  • java enum

    エラー内容 int cannot be dereferenced 何が原因でエラーになっているのですか? import java.util.*; enum light{ red,yellow,blue } class m1{ public static void main(String[] args){ int light; Scanner ss = new Scanner(System.in); System.out.println("整数値を入力 : "); int i = ss.nextInt(); if(i == light.red.ordinal()){ System.out.println("信号は赤色です"); } else if(i == light.yellow.ordinal()){ System.out.println("信号は黄色です"); } else if(i == light.blue.ordinal()){ System.out.println("信号は青色です"); } } }

  • 静止的フィールドについて教えてください

    教えてください。以下のプログラムだとして、 class Box { static int a = 0 ; int b = 0 ; int c = a+4; } class sample { public static void main(String[] args) { Box n = new Box() ; n.a-- ; n.b-- ; n.c[1]-- ; System.out.println("n.a= "+n.a);//-1 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2]="+n.c[2]);//4 Box m = new Box() ; m.a++ ; m.b++ ; m.c[2]++ ; System.out.println("n.a ="+n.a);//0 System.out.println("n.b ="+n.b);//-1 System.out.println("n.c[2] ="+n.c[2]);//4 System.out.println("m.a ="+m.a);//0 System.out.println("m.b ="+m.b);//1 System.out.println("m.c[2] ="+m.c[2]);//4 } } Box nの中のn.aの値はわかります。 ですが、Box mの中のn.aは、a がstaticフィールド(?)なので元の0に戻りますが、m.aがなぜ0なのかわかりません。 そもそもstatic int = ●; のときは、静止的intと教わったのですが、どういう現象が起こるのかいまいちです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのバージョンについて

    Javaをはじめたばかりのものです。 java -versionと入力すると"1.5.0_04"と表示されます。 バージョン1.5以降はenumが使えると聞いたのですが、 コンパイルエラーになってしまいます。 Cygwinを使っていますが、enumを書いた行で、 「'class'または'interface'がありません」 とエラーが表示されます。 以下がソースです。 ----------------------------------------- enum number {one,two} public class Test1 { public static void main(String[] args) { System.out.println("test"); } } ---------------------------------------- どのようにしたらいいのでしょうか? お分かりになる方よろしくお願い致します。

    • ベストアンサー
    • Java
  • javaのenumについて

    下記の如くenumを利用しています。 Q1) 機械語コードに於いては、ONE、TWO、THREEの内容はどの様に置き換わりますか? Q2) ONE、TWO、THREEの内容は、整数に置き換えるような記述はありますか? //==================================================== class T_threadC { static int CNT=20000; volatile static int DATAX=-1; public static void main(String args[]) { abc s=abc.TWO; //sにabcで定義したTWOを代入する switch(s){ case ONE: CNT=2000; break; default: CNT=20000; break; } System.out.println("CNT="+CNT); new rcvInterrupt().start(); } } public enum abc { ONE, TWO, TREE }

    • ベストアンサー
    • Java
  • コンストラクタについて

    これも試験問題らしくて自分でやってみましたのであってるかどうか自信なくて どなたかみてみていただけたらと思います.よろしくお願いします。 下のソースファイルをコンストラクタを用いたものに修正しなさい class Sconst{ int x,y,z; void print(){ System.out.println(x); System.out.println(y); System.out.println(z); } } class ExConstTest{ public static void main (String[] args ){ Sconst sc=new Sconst(); sc.x=10; sc.y=30; sc.z=5; } } ------------------------------------------------------------- class Sconst{ int x,y,z; Sconst(){ x=10; y=30; z=5; } } class ExConstTest{ public static void main (String[] args ){ Sconst a1; Sconst a2; Sconst a3; a1=new Sconst(); a2=new Sconst(); a3=new Sconst(); System.out.println(a1.x); System.out.println(a2.x); System.out.println(a3.x); } }

    • ベストアンサー
    • Java

専門家に質問してみよう