2

以下のコードでエラーが発生する理由を見つけようとしています。誰か説明してください。ここにクラスがあります

package abc;

public class A {
   public class B {

   }
}

今、私はBクラスを作成しようとしています

package xyz;
import abc.*;


public class B extends A{
    public static void main(String[] args) {
        B b = new B (); // this line gives error. Can you please explain
    }
}

クラス B が A を拡張することを考慮してください。

import abc.*;


public class B extends A{
    public static void main(String[] args) {
        B b = new B (); // this line gives error. Can you please explain 
                          // I am try to create "B" class object which extends A 
                         //.. not the B inner class 
    }
}

Eclipse で表示されるエラーは次のとおりです。

4

7 に答える 7

2

BextendsAがありA、 inner class が含まれていることを考えるとB、(コンパイラとプログラマの両方にとって) 混乱の余地があるのではないかと思います。

この線:

B b = new B();

あいまいです。これはどのBですか?他の場所で指摘されているように、内部クラス B には のインスタンスが必要なので、外部クラスAを意味していると思われます。B

編集:あなたのエラー

「型 A の囲んでいるインスタンスにアクセスできません。型 A の囲んでいるインスタンスで割り当てを修飾する必要があります (x は A のインスタンスである exxnew A())。」

これを確認します。xyz.Bが必要であり、適切にスコープする必要があると思います。

于 2012-08-02T13:42:55.780 に答える
1

を作ればpublic class B static書いてある通りに動く。

それ以外の場合、クラス A のインスタンスの外側からクラス B のインスタンスを作成することはできません。これは、非静的内部クラスが外側のクラスの「this」へのポインターを必要とするためです (B 内で、 を書くことができthis.A、それは実際に囲んでいるものを参照します)。 A)。

于 2012-08-02T13:45:41.760 に答える
1

外側のスコープを指定してみてください:

B b = new A.B();

また

B b = new xyz.B();
于 2012-08-02T13:43:29.057 に答える
0

クラスはクラスB extends A を継承してA.Bおり、式new B()はその内部クラスを参照しています。したがって、それは囲んでいるインスタンスを要求します。両方の言及をBパッケージ名で明示的に修飾するか、そもそもそのような名前の混乱を避ける必要があります。

于 2012-08-02T14:07:58.707 に答える
0

Eclipseで以下を作成すると:

package com.example;

public class A {
    class B {
    }
}

package com.example;

import com.example.A.B;

public class B extends A {

    public static void main(String[] args) {
        B b = new B();
    }
}

ご覧のとおり、EclipseはクラスをインポートしA.Bます。インポートしないと、次のエラーが発生します。

タイプAの囲んでいるインスタンスにはアクセスできません。タイプAの囲んでいるインスタンス(egxnew A()、xはAのインスタンス)で割り当てを修飾する必要があります。

于 2012-08-02T13:49:04.817 に答える
0

この解決策を見つけました。リフレクションを通じて、Bクラス(BはAクラスを拡張)オブジェクトを作成できます。

import java.lang.reflect.Method;

import abc.*;

public class B extends A{
    public static void main(String[] args) {
        //B b = new B(); // this line gives error. Can you please explain 
                          // I am try to create "B" class object which extends A 
                         //.. not the B inner class
     try{
      Class c = Class.forName("B"); //class B extends A
      Method  m=c.getMethod("print", null);
      m.invoke(c.newInstance(), null);
     }catch(Exception e){
      e.printStackTrace();
     }
    }

    public void print(){
     System.out.println("Printed");
    }
}
于 2012-08-23T11:20:30.980 に答える
0

このコードをコンパイルしようとすると発生するエラー (パッケージの仕様は関係がないように見えるため除外) は、「非静的変数であり、静的コンテキストから参照することはできません」です。したがって、問題は、静的メソッド内でmain()非静的なものにアクセスしようとしていることです。これは、内部クラス B の定義であると思います。

2 番目の外部クラスの名前が異なる場合、実際には同じエラーが発生します。したがって、明らかな名前の競合はニシンです。それ自体は、両方のクラスに同じ名前を使用しない正当な理由ですが、エラーを理解しようとすると混乱を招きます。

内部クラスの宣言を静的に変更すると、エラーは解決されます。

public class A {
   public static class B {

   }
}

静的と非静的のネストされたクラスに関するいくつかの関連する議論はhereです。

しかし、これは正しい修正ではない可能性があります。コードがメソッドを含むクラスではなく、内部クラスmain()を参照していることを示しています。本当はどれが欲しかったの?明らかに、混乱を避けるために、この 2 つのクラスには異なる名前を使用することをお勧めします。そのメソッドを含むクラスのインスタンスを作成することが必要な場合は、そのクラスに一意の名前を使用すると問題が解決します。BBmain()

于 2012-08-02T13:51:41.943 に答える