12

通常、メソッドのデフォルトのアクセス レベルはパッケージ ローカルです。しかし、パブリック抽象クラスでは異なるようです。これらのクラスでは、デフォルトは public のようです。これは正しいです?

アップデート

@EJP

それは私のコードのバグでした。パッケージのローカル メソッドをパブリック メソッドでシャドウすることは可能ですが、これは私を混乱させます。これは、パブリック抽象が、メソッドがパブリックであるインターフェイスに似ている可能性があると私に思わせます。例を参照してください。

a/A.java:

package a;

public abstract class A
{
    String a () { return "a"; }
}

test_a.java:

class test_a
{
    static class NewA extends a.A
    {
        public String a () { return "new a"; }
    }

    public static void main (String[] args)
    {
        NewA a = new NewA();
        System.out.println(a.a());
    }
}
4

7 に答える 7

12

False、簡単な例で見てみましょう:

package apackage;

public abstract class AbstractFoo {

  //A method with default visibility
  abstract void bar();

}

簡単な実装:

public class Foo extends AbstractFoo {

  @Override
  void bar() {}
}

さて、別のパッケージで:

public static void main(String[] args) throws Exception{

  AbstractFoo something=new Foo();
  something.bar();//Compiler complains here

コンパイラは可視性について不平を言います。そのため、クラスが であっても、メソッドのデフォルトの可視性はpackage protectedpublic abstractです。

于 2013-06-21T09:58:14.847 に答える
4

Java 7のJava 言語仕様では、抽象メソッドの個別の規則について言及していません。修飾されたアクセス レベルのないこのような抽象メソッドは、通常のメソッドと同様に、デフォルト (別名パッケージ プライベート) です。

6.6.1も参照してください。アクセシビリティの決定:

  • 参照 (クラス、インターフェイス、または配列) 型のメンバー (クラス、インターフェイス、フィールド、またはメソッド) またはクラス型のコンストラクターは、型がアクセス可能であり、メンバーまたはコンストラクターがアクセスを許可するように宣言されている場合にのみアクセスできます。

    • メンバーまたはコンストラクターが public と宣言されている場合、アクセスが許可されます。
      インターフェイスのすべてのメンバーは暗黙的にパブリックです。
    • それ以外の場合、メンバーまたはコンストラクターが保護されていると宣言されている場合、次のいずれかが true の場合にのみアクセスが許可されます。
      • メンバーまたはコンストラクターへのアクセスは、保護されたメンバーまたはコンストラクターが宣言されているクラスを含むパッケージ内から発生します。
      • §6.6.2 で説明されているように、アクセスは正しいです。
    • それ以外の場合、メンバーまたはコンストラクターがプライベートと宣言されている場合、メンバーまたはコンストラクターの宣言を囲む最上位クラス (§7.6) の本体内で発生した場合にのみ、アクセスが許可されます。
    • それ以外の場合は、型が宣言されているパッケージ内からアクセスが発生した場合にのみ許可されるデフォルト アクセスがあると言います。

(私のものを強調)

また、' default access ' という用語は ' package private 'と同等であることに注意してください。これに対する唯一の '例外' は、インターフェイスのメソッド宣言publicです。

編集:

adenoyelle が彼の回答で示しているように、別のパッケージの「デフォルト」の抽象メソッドをオーバーライドできます (JLS 8.4.3.1. Methods のルールで必要とされるようabstract) 。 protectedJLSはこれを明示していないようです。

編集2:

私はちょうどそれをテストしました。別のパッケージにデフォルト アクセスを持つメソッドを持つ抽象クラスを実装することはできません。単にコンパイルされません。これは、メソッドが保護されていないデフォルト (パッケージ プライベート) アクセスを持っていることを示しています。また、8.4.3.1 では、抽象メソッドを常に実装できることを実際に要求しているのではなく、次のような無意味なオプションを除外しているだけであることも示しています。private abstract void method()

コンパイル例:

package example;

public abstract class AbstractTest {
    abstract void testMethod();
}

package example.sub;

import example.AbstractTest;

public class TestImpl extends AbstractTest {
    void testMethod() {
        //implemented
    }
}

コンパイルエラーにつながります:

example\sub\TestImpl.java:8: error: TestImpl is not abstract and does not override abstract method testMethod() in AbstractTest
public class TestImpl extends AbstractTest {
       ^
1 error
于 2013-06-21T10:01:19.837 に答える
2

デフォルトの可視性は「パッケージ」と呼ばれます (ただし、このキーワードは使用できません)。これは、クラスが属する同じパッケージ内からフィールドにアクセスできることを意味します。

あなたが公開として宣言した場合、その要約が何であるかに関係なく、すべての人に公開されます

于 2013-06-21T09:54:11.857 に答える
1

デフォルトのアクセス修飾子とは、クラス、フィールド、メソッドなどのアクセス修飾子を明示的に宣言しないことを意味します。

アクセス制御修飾子なしで宣言された変数またはメソッドは、同じパッケージ内の他のクラスで使用できます。

したがって、メソッドが抽象的であるかどうかは問題ではありません。

于 2013-06-21T09:58:08.293 に答える
0

抽象クラスがパブリック アクセス レベルであっても、メソッドのアクセス レベルはデフォルトのままです (パッケージ内でのみ表示されます)。子クラスが pulbic アクセス修飾子を使用してメソッドをオーバーライドする場合にのみ、パッケージの外部に表示されます。

于 2013-06-21T10:04:21.123 に答える
0

あなたは何かに取り組んでいますが、少しずれています:インターフェイスでは、デフォルト (そして実際には唯一の選択肢) は public です。すべてのクラスで、デフォルトは同じで、package-private です。

于 2013-06-21T10:05:46.890 に答える