Jaki jest domyślny modyfikator dostępu w Javie? [duplikat]

To pytanie ma już odpowiedź tutaj:

Jaki jest domyślny modyfikator dostępu dla metody lub zmiennej instancji, jeśli nie podam jej jawnie?

Na przykład:

package flight.booking;

public class FlightLog
{
    private SpecificFlight flight;

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

Czy modyfikator dostępu tego konstruktora jest chroniony czy pakiet? Czy inne klasy w ten sam pakiet, którym jest flight.booking, nazywa ten konstruktor?

Author: Peter Mortensen, 2013-04-23

13 answers

From Java documentation

Jeśli klasa nie ma modyfikatora (domyślnego, znanego również jako package-private), jest widoczna tylko w jej własnym pakiecie (pakiety są nazwane grupami powiązanych klas - dowiesz się o nich w dalszej lekcji.)

W member level, Możesz również użyć modyfikatora publicznego lub no modifier (pakiet-prywatny), tak jak w przypadku klas najwyższego poziomu i o tym samym znaczeniu.

Pełny artykuł można przeczytać tutaj (który napisałem ostatnio):

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

 94
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:53:42

Z dokumentacji:

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
 67
Author: Pradeep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 11:02:34

To zależy od kontekstu.

Gdy jest w obrębie klasy:

class example1 {

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

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

Gdy jest w interfejsie:

interface example2 {

    int b = 10; // This is public and static.
    void method2(); // This is public and abstract
}
 28
Author: SKG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:58:05

Domyślnym modyfikatorem dostępu jest package-private-widoczny tylko z tego samego pakietu

 20
Author: Evgeniy Dorofeev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-23 08:50:55

Oto przykład kodu, który powinien to podsumować dla Ciebie... Oprócz poniższego, pokazującego, jak nie można uzyskać dostępu do domyślnego w innym pakiecie, jest jeszcze jedna rzecz.

Domyślnie nie jest dostępna w podklasie, jeśli klasa, która ją podklasuje, znajduje się w innym pakiecie, ale jest dostępna, jeśli podklasa jest w tym samym pakiecie.

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
    }
}
 8
Author: JTHouseCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 11:00:06

Domyślnym modyfikatorem jest package. Tylko kod w tym samym pakiecie będzie mógł wywołać ten konstruktor.

 5
Author: cahen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:54:23

Tak, jest widoczny w tym samym opakowaniu. Nic poza tym pakietem nie będzie miało do niego dostępu.

 4
Author: Maninder Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 11:05:19

Modyfikatorem dostępu twojego konstruktora będzie package-private(domyślnie) . Jak zadeklarowałeś klasę public, będzie ona widoczna wszędzie, ale konstruktor tego nie zrobi. Twój konstruktor będzie widoczny tylko w jego pakiecie.

package flight.booking;

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

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

Jeśli nie napiszesz żadnego konstruktora w swojej klasie, kompilator wygeneruje domyślny konstruktor z tym samym modyfikatorem dostępu klasy. W poniższym przykładzie kompilator wygeneruje domyślny konstruktor z public modyfikator dostępu (taki sam jak Klasa).

package flight.booking;

public class FlightLog // Public access modifier
{
    private SpecificFlight flight;
}
 2
Author: Sachin Gorade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:57:15

Domyślnym modyfikatorem dostępu jest package-private (tzn. domyślnie) i jest widoczny tylko z tego samego pakietu.

 1
Author: Piyush Bhardwaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-23 09:26:52

Czy modyfikator dostępu tego konstruktora jest chroniony czy pakiet?

Myślę, że w domyśle modyfikator dostępu dla konstruktorów byłby modyfikatorem dostępu dla twojej klasy. ponieważ twoja klasa ma publiczny dostęp, konstruktor będzie miał publiczny dostęp bezwarunkowo

 0
Author: PermGenError,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-23 08:50:23

Domyślny modyfikator dostępu - jeśli klasa nie ma modyfikatora (domyślny, znany również jako package-private), jest widoczny tylko w jej własnym pakiecie (pakiety są nazwane grupami powiązanych klas).

 0
Author: Atiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 05:38:06

Nie, Nie można wywołać domyślnego poziomu dostępu do innego pakietu. Ale masz dostęp w paczce. Kliknij ten link aby uzyskać więcej szczegółów.

 0
Author: Hariprasath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 11:00:33

Z książki OCA Java SE 7 Programmer I :

Członkowie klasy zdefiniowanej bez użycia jawnego dostępu modyfikatory są definiowane za pomocą dostępności pakietu (nazywanego również domyślnym dostępność). Członkowie z dostępem do pakietu są dostępni tylko dla klasy i interfejsy zdefiniowane w tym samym pakiecie.

 0
Author: BERGUIGA Mohamed Amine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 11:04:43