1

誰かが私を助けてくれることを願っています。私はこの問題を何時間も調査してきましたが、他の誰も同じ問題を抱えていないようです (私が遭遇したものです)。私は本当に骨の折れる間違いを犯しているに違いありません。

私はJavaが初めてで、非常に単純なJavaプログラムを設計しました。

Student という抽象スーパークラスがあります。このスーパークラスには、、、および とStudent呼ばれる 3 つの拡張クラスがあります。Student クラスには、いくつかの抽象メソッドといくつかの非抽象メソッドがあります。で定義されたすべての抽象メソッドが 3 つの拡張クラスすべてに実装されていることを確認しました。GraduateUndergraduatePartTimeStudents

今、私は非常に単純であるべきことをしようとしています。これらの拡張クラスの 1 つをインスタンス化しようとしています。私がこれを行う場合:

Student student = new Student();

Netbeansは言いStudent is abstract; can't be instantiatedます。わかりました。抽象クラスをインスタンス化できない理由がわかりました。次に、これを試します:

Student.Graduate student = new Graduate();

そしてNetbeansは言いますan enclosing instance that contains studentmanager.Student.Graduate is required(studentmanager は私のパッケージ名です)。それが何を意味するのか理解できません。ただし、エラーなしで Student を次のようにインスタンス化できることがわかりました。

Student[] student = new Student[1];

ただし、次の論理的なことを実行しようとすると:

student[0] = new Graduate();

同じan enclosing instance...エラーが発生します。

要点は、インスタンス化する方法を知りたいということGraduateです。誰でも私を助けることができますか?どんな洞察も大歓迎です!

ありがとう。

4

2 に答える 2

8

GraduateUndergraduate、およびPartTimeを の内部クラスとして定義しましたStudentか? つまり、次のようになります。

public class Student {
    /* ... */
    public class Graduate extends Student { /* ... */ }
    public class Undergraduate extends Student { /* ... */ }
    public class PartTime extends Student { /* ... */ }
}

内部クラスのインスタンスは、囲んでいるインスタンスのプライベート フィールドやメソッドへのアクセスなどを実行できるように、囲んでいるクラスのインスタンスへの暗黙的な参照を持っています。いずれかのサブクラスのインスタンスをインスタンス化しようとすると、コンパイラは「ちょっと待ってください。暗黙の参照を何に設定すればよいかわかりません!」と言います。エラーが発生します。

次の 3 つの解決策が考えられます。

  • 3 つのサブクラスをクラスから移動してStudent、独自のファイルで定義された独自の最上位クラスに移動できます。
  • staticサブクラスの宣言の前にキーワードを追加できます。これは、内部クラスから外側のクラスへの暗黙的な参照を望まないことをコンパイラに伝えます。これにより、サブクラスから のプライベート フィールドやメソッドにアクセスするなどStudentのことを行うことができなくなりますが、とにかくそれを行う必要がない場合、これは意味がありません。
  • のプライベート メンバーにアクセスするためにサブクラスが必要な場合Student、 のインスタンスをStudent作成し、この特別な構文を使用して内部クラスのインスタンスを作成できます。

    Student s = new Student();
    Graduate g = s.new Graduate();

この例の は、 の新しいインスタンスがへの暗黙的な参照を持つ必要があるs.newことをコンパイラに伝えます。Graduates

この例では、これが希望どおりになる可能性はほとんどないことに注意してください。コールバックに応答して囲んでいるクラスの状態を更新するなどのことを行うために、囲んでいるインスタンスのフィールドを直接変更できる内部クラスのインスタンスがあると便利なことがよくありますが、ここでの意図はそうではないと思います。

于 2012-07-24T23:37:21.477 に答える
1

クラス定義を変更できる場合、インスタンスを囲むことなくインスタンス化をサポートするには、内部クラスを静的にする必要があります。例えば

// in file Student.java
public class Student {
    public static class Graduate {}
}

または、Graduateを独自のGraduate.javaファイルに移動すると、実行できます

Student.Graduate grad = new Student.Graduate();

それ以外の場合は、Mike D が提案したように、これらのクラスをインスタンス化する方法を変更してください。

于 2012-07-24T23:40:52.657 に答える