web-dev-qa-db-ja.com

Javaのデフォルトのアクセス修飾子は何ですか?

明示的に宣言しない場合、メソッドまたはインスタンス変数のデフォルトのアクセス修飾子は何ですか?

例えば:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight)
    {
        this.flight = flight;
    }
}

このコンストラクタのアクセス修飾子は保護されていますか、それともパッケージですか?同じパッケージ内の他のクラス(flight.booking)がこのコンストラクタを呼び出すことはできますか?

108
yrazlik

Javaから ドキュメンテーション

クラスに修飾子がない場合(デフォルト、package-privateとも呼ばれます)、それはそれ自身のパッケージ内でのみ表示されます(パッケージは関連クラスのグループと命名されます - 後のレッスンでそれらについて学ぶでしょう)。

member levelでは、トップレベルのクラスと同じ意味で、public修飾子またはno modifier(package-private)を使用することもできます。

あなたがここで読むことができる全文最近書いたもの):

http://codeinventions.blogspot.com/2014/09/default-access-modifier-in-Java-or-no.html

102
Suresh Atta

ドキュメントから:

Access Levels
Modifier        Class    Package    Subclass    World
-----------------------------------------------------
public           Y        Y          Y           Y
protected        Y        Y          Y           N
(Default)        Y        Y          N           N
private          Y        N          N           N
79
Pradeep

状況によって異なります。

それがクラスの中にあるとき:

class example1 {

    int a = 10; // This is package-private (visible within package)

    void method1() // This is package-private as well.
    {
        -----
    }
}

それがインタフェースの中にあるとき:

interface example2 {

    int b = 10; // This is public and static.
    void method2(); // This is public and abstract
}
30
SKG

デフォルトのアクセス修飾子はpackage-privateです - 同じパッケージからのみ見えます

20

これはほとんどあなたのためにこれを要約するはずであるコードサンプルです...以下に加えて、あなたが他のパッケージでデフォルトにアクセスすることができない方法を示すことがもう1つあります。

サブクラスをサブクラス化するクラスが別のパッケージ内にある場合、デフォルトはサブクラス内でアクセスできませんが、サブクラスが同じパッケージ内にある場合はアクセス可能です。

package main;

public class ClassA {
    private int privateVar;
    public int publicVar;
    int defaultVar;
}

package main;

public class ClassB {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Works
        int v3 = a.privateVar;  // Doesn't work

    }
}

package other;

public class ClassC {
    public static void main(String[] args) {
        ClassA a = new ClassA();
        int v1 = a.publicVar;   // Works
        int v2 = a.defaultVar;  // Doesn't work
        int v3 = a.privateVar;  // Doesn't work
    }
}
10
JTHouseCat

はい、同じパッケージに入っています。そのパッケージの外側にあるものは、それへのアクセスを許可されません。

5
Maninder Singh

デフォルトの修飾子はpackageです。同じパッケージ内のコードだけがこのコンストラクタを呼び出すことができます。

5
cahen

あなたのコンストラクタのアクセス修飾子はpackage-private(default)です。あなたがクラスpublicを宣言したように、それはどこにでも見えるでしょうが、コンストラクタは見えないでしょう。あなたのコンストラクタはそのパッケージの中にだけ見えるでしょう。

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;

    FlightLog(SpecificFlight flight) // Default access modifier
    {
        this.flight = flight;
    }
}

クラスにコンストラクタを記述しない場合、コンパイラはそのクラスの同じアクセス修飾子を使用してデフォルトのコンストラクタを生成します。次の例では、コンパイラはpublicアクセス修飾子を使用してデフォルトのコンストラクタを生成します(classと同じ)。

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;
}
2
Sachin Gorade

いいえ、他のパッケージへのデフォルトのアクセスレベルを呼び出すことはできません。しかし、あなたはパッケージ内でアクセスできます。詳しくは このリンク に従ってください。

1
Hariprasath

デフォルトのアクセス修飾子はpackage-private(つまりDEFAULT)で、同じパッケージから見えるonlyです。

1
Piyush Bhardwaj

デフォルトのアクセス修飾子 - クラスに修飾子がない場合(デフォルト、パッケージプライベートとも呼ばれます)、それは自身のパッケージ内でのみ表示されます(パッケージは関連クラスの名前付きグループです)。

1
Atiq

このコンストラクタのアクセス修飾子は保護されていますか、それともパッケージですか?

暗黙のうちにあなたのコンストラクタaccess modifierがあなたのクラスのaccess modifierになると思います。あなたのクラスはパブリックアクセスを持っているので、コンストラクタは暗黙のうちにパブリックアクセスを持つでしょう

0
PermGenError

OCA Java SE 7プログラマーIという本から

明示的なアクセス修飾子を使用せずに定義されたクラスのメンバーは、パッケージのアクセシビリティ(デフォルトのアクセシビリティとも呼ばれる)で定義されます。パッケージアクセス権を持つメンバーは、同じパッケージ内で定義されたクラスとインタフェースにのみアクセス可能です。