2016-11-29 5 views
-5

なぜ参照型オブジェクトoは変数aにアクセスできないのですか?解決できないエラーaを示しているか、フィールドではありません。Objectクラスは、デフォルトでJavaのすべてのクラスの親クラスです

public class test2 { 
int a; 

public static void main(String args[]) { 
    Object o = new test2(); 
    test2 t = new test2(); 
    t.a = 0; 
    o.a = 10; 


} 
} 
+1

は、このコードは、単に意味をなさない:

また、上記の概念を理解するために継承するために、以下の人気のクラスを見てください。存在しないフィールドやメソッドを使用しています。 'a'とは何ですか? 'f()'とは何ですか? –

+0

オブジェクトクラスにはフィールドがありません** a **、thats why –

+0

[他のオブジェクトタイプとして使用する場合、なぜ型オブジェクトの参照変数をキャストしなければならないのか?](http://stackoverflow.com/questions/9842378/why-他のオブジェクトタイプとして使用する場合には型オブジェクト参照型変数である必要があります)、まだ不完全です。 –

答えて

0

Javaでは、割り当てを行うだけでフィールドを作成することはできません。また、あなたのコードでそれらを宣言する必要があります:あなたがオブジェクトとして変数を宣言した場合、それは、あなたはまだフィールドにアクセスすることはできません本当に「TEST2」のインスタンスである、その後も

public class test2 { 
    int a; 
    ... 
} 

「」最初にキャスティングせずに。

Object o = new test2(); 
o.a = 5 // compile error 
test2 t = (test2)o; 
t.a = 5 // ok. Will compile fine 

Javaコンパイラは、それが「O」は本当にtest2のかそうでないかどうかを確認するために懸命に働くしないことを意味し、かなりシンプルなものを保持し、それだけでフィールドやメソッドにアクセスできるかを決定するために宣言されたクラスを使用しています。

0

基本的に、参照型とインスタンス(オブジェクト)型の間で混乱します。

oはタイプObjectの参照変数ですので、oObjectクラスのメソッドと変数にのみアクセスできます。 また、tはタイプtest2の参照変数ですので、ttest2のクラスメンバーにアクセスできます。詳細はhereをご覧ください。

要するに、リファレンスタイプによって、アクセスできるクラスのメンバーが決まります。

public class Animal { 
    public String foodtype; 
    //other members 
} 

public class Dog extends Animal { 
    public String name; 
    //other members 
} 

public class Test { 

    public static void main(String[] args) { 
     Animal a = new Dog();//'a' can access Anmial class members only 
     a.foodtype = "meat"; //ok 
     a.name = "puppy"; //compiler error 

     Dog d = new Dog();//'d' can access both Animal and Dog class members 
     d.foodtype = "meat"; //ok 
     d.name = "puppy";//ok 
    } 
} 
関連する問題