0

aa.bbなどのパッケージに2つのクラスを作成したという非常に奇妙な動作に直面しました

クラス aa のコード

         package aa.bb;
         public abstract class aa {
        abstract void deep();
          }

クラスbbのコード

       public class bb extends aa{
            @Override
        void deep() {
        }
            }

ここで、bbc.cc という別のパッケージを作成し、このパッケージ内に 1 つのクラスを作成しました。

クラスccのコード

          package bbc.cc;
           import aa.bb.bb;
           public class cc extends bb {
            }

現在、cc クラスはエラーを表示しています。このクラスは、継承された抽象メソッド aa.deep() を実装する必要がありますが、cc からは見えないためオーバーライドできません。型を抽象化するか、継承されたメソッドを可視化します

ここで、パッケージ aa.bb の jar ファイルを作成し、ソース コードから aa.bb パッケージを削除しました。そしてビルドパスにjarファイルを追加しました。この後、以前と同じようにエラーが発生します。今、aa.bb パッケージに bb クラスのソース コードを追加し、エラーを解決しました。この背後で何が起こっているのかわかりません。

これはプロジェクトの最終的なディレクトリ構造ですここに画像の説明を入力

コンセプトを明確にするのを手伝ってください

4

2 に答える 2

5

これはdefault、メソッドまたはクラスへのアクセスがpackage level.

したがって、メソッドvoid deep()は実際には同じパッケージ内にあるクラスに表示されますaa.bb

deep()メソッドを公開することをお勧めします。

package aa.bb;
public abstract class aa {
   public abstract void deep();
}

public class bb extends aa{
    @Override
    public void deep() {
    }
}

これはうまくいくはずです。

于 2012-07-05T05:31:19.473 に答える
2

デフォルトで指定されているアクセスを指定しない場合、可視性は ですdefault 。これは、クラスが属する同じパッケージ内からフィールドにアクセスできることを意味します。

deep()fromの実装bbは、別のパッケージからのものであるため、cc では表示されません。

ccの実装を受信せず、deep()間接的に拡張aaするため、抽象メソッドの実装を提供する必要があります

于 2012-07-05T05:32:00.940 に答える