Który jest domyślnym określnikiem dostępu w Javie?

Więc po prostu zacząłem czytać książkę Java i zastanawiałem się; który specyfikator dostępu jest domyślny, jeśli żaden nie jest określony?

Author: bennedich, 2010-08-20

12 answers

Domyślna widoczność jest znana jako "private package" (choć nie możesz tego użyć jawnie), co oznacza, że pole będzie dostępne z wnętrza tego samego pakietu, do którego należy Klasa.

Jak zauważyła mdma, nie jest to prawdą dla członków interfejsu, dla których domyślnym ustawieniem jest "public".

Zobacz Specyfikatory dostępu Javy

 100
Author: KeatsPeeks,
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-02-28 06:15:44

Domyślny specyfikator zależy od kontekstu.

Dla klas i deklaracji interfejsu domyślnym jest pakiet prywatny. Dzieli się to na protected I private, umożliwiając dostęp tylko klasom z tego samego pakietu. (protected jest tak, ale pozwala również na dostęp do podklas poza pakietem.)

class MyClass   // package private
{
   int field;    // package private field

   void calc() {  // package private method

   }
}

Dla członków interfejsu (pól i metod), domyślny dostęp jest publiczny. Ale zauważ, że sama deklaracja interfejsu jest domyślna dla pakietu szeregowy.

interface MyInterface  // package private
{
   int field1;         // static final public

   void method1();     // public abstract
}

Jeśli mamy wtedy deklarację

public interface MyInterface2 extends MyInterface
{

}

Klasy używające MyInterface2 mogą wtedy zobaczyć field1 i method1 z super interfejsu, ponieważ są publiczne, mimo że nie mogą zobaczyć samej deklaracji MyInterface.

 72
Author: mdma,
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
2010-08-20 10:50:22

Jeśli nie podano żadnego identyfikatora dostępu, jest to dostęp na poziomie pakietu (nie ma dla tego jawnego identyfikatora) dla klas i członków klas. Metody interfejsu są jawnie publiczne.

 13
Author: Michael Borgwardt,
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
2010-08-20 10:39:55

Domyślną widocznością (bez słowa kluczowego) jest package , co oznacza, że będzie ona dostępna dla każdej klasy znajdującej się w tym samym pakiecie.

Ciekawostką jest to, że protected nie ogranicza widoczności do podklas, ale także do innych klas w tym samym pakiecie

 8
Author: Johannes Wachter,
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
2010-08-20 10:41:28

To zależy, co to jest.

  • Typy najwyższego poziomu (to znaczy klasy, liczby, interfejsy i typy adnotacji nie zadeklarowane wewnątrz innego typu) to package-private domyślnie. (JLS §6.6.1)

  • W klasach wszystkie elementy składowe (tzn. pola, metody i zagnieżdżone deklaracje typu) i konstruktory są domyślnie package-private. (JLS §6.6.1)

    • gdy klasa nie ma jawnie zadeklarowanej konstruktor, kompilator wstawia domyślny konstruktor zerowo-argumentowy, który ma ten sam specyfikator dostępu co Klasa . (JLS §8.8.9) konstruktor domyślny jest często błędnie interpretowany jako publiczny, ale w rzadkich przypadkach nie jest to równoważne.
  • W enumach konstruktory są domyślnie prywatne. W rzeczywistości enum contructors muszą być prywatne i błędem jest określanie ich jako publicznych lub chronionych. Stałe Enum są zawsze publiczne i nie zezwalają na żadne szczegóły dostępu. Innymi członkami enum są domyślnie package-private. (JLS §8.9)

  • W interfejsach i typach adnotacji wszystkie elementy składowe (znowu, to znaczy pola, metody i deklaracje zagnieżdżonego typu) są domyślnie public. W rzeczywistości elementy interfejsów i typów adnotacji muszą być publiczne i błędem jest określanie ich jako prywatnych lub chronionych. (JLS §9.3 to 9.5)

  • Klasy lokalne są nazwanymi klasami zadeklarowanymi wewnątrz metody, konstruktora lub bloku inicjalizacji. Są ograniczone do {..} blok, w którym są zadeklarowane i nie zezwalają na dostęp. (JLS §14.3) używając reflection, możesz tworzyć instancje lokalnych klas z innego miejsca i są to package-private , chociaż nie jestem pewien, czy ten szczegół jest w JLS.

  • Klasy anonimowe są klasami niestandardowymi utworzone za pomocą new, które określają ciało klasy bezpośrednio w wyrażeniu. ( JLS §15.9.5) ich składnia nie zezwala na dostęp. Używając reflection, możesz tworzyć anonimowe klasy z innego miejsca i zarówno one, jak i ich generowane konstruktory są package-private , chociaż nie jestem pewien, czy ten szczegół jest w JLS.

  • Instancja i statyczne bloki inicjalizacji nie mają specyfików dostępu na poziomie języka (JLS §8.6 & 8.7), ale statyczne bloki inicjujące są implementowane jako metoda o nazwie <clinit> (JVMS §2.9), więc metoda musi wewnętrznie mieć jakiś specyfik dostępu. Zbadałem klasy skompilowane przez javaca i kompilator Eclipse używając edytora hex i stwierdziłem, że obie metody generują jako package-private. Jednak nie można wywołać <clinit>() wewnątrz języka, ponieważ znaki < i > są nieprawidłowe W nazwie metody, a metody refleksyjne są podłączone do komputera, aby zaprzeczyć jej istnienie, więc efektywnie jego specyfikatorem dostępu jest no access. Metoda może być wywołana tylko przez maszynę wirtualną podczas inicjalizacji klasy. instancje bloki inicjalizacji nie są kompilowane jako oddzielne metody; ich kod jest kopiowany do każdego konstruktora, więc nie można uzyskać do nich dostępu indywidualnie, nawet przez odbicie.

 6
Author: Boann,
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
2016-10-18 00:30:48

Zobacz tutaj aby uzyskać więcej szczegółów. Domyślną wartością jest none z private/public/protected, ale zupełnie inna specyfikacja dostępu. Nie jest szeroko stosowany i wolę być bardziej szczegółowy w moich definicjach dostępu.

 3
Author: Brian Agnew,
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
2010-08-20 10:40:33

Domyślnym określnikiem dostępu jest package.Klasy mogą uzyskać dostęp do członków innych klas w tym samym pakiecie.ale poza pakietem pojawia się jako private

 2
Author: lil_pgmr,
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
2012-07-19 10:37:28

Oto cytat o widoczności na poziomie pakietów z wywiadu z Jamesem Goslingiem, twórcą Javy:

Bill Venners : Java ma cztery poziomy dostępu. Domyślną wartością jest pakiet. I zawsze zastanawiałem się, czy ustawienie domyślnego dostępu do pakietu jest wygodne ponieważ trzy słowa kluczowe, o których znali już ludzie z C++ były prywatne, chronione i publiczne. Lub jeśli masz jakieś szczególne powód, dla którego uznałeś, że dostęp do pakietu powinien być domyślny.

James Gosling : Pakiet to generalnie zestaw rzeczy, które są napisane razem. Tak ogólnie mogłem zrobić jedną z dwóch rzeczy. Jednym z nich było zmuszanie Cię zawsze do wpisywania słowa kluczowego, które daje Ci domena. Albo mogłem mieć domyślną wartość. I pytanie brzmi:, co sprawia, że rozsądne domyślne? A ja wybieram to, co najmniej niebezpieczna rzecz.

Więc publiczne byłoby naprawdę złe, aby ustawić domyślne. Szeregowy pewnie by to było złe, aby zrobić domyślne, jeśli tylko dlatego, że ludzie tak często nie piszą prywatnych metod. I to samo z ochroną. I patrząc na kilka szyfrów, które Miałem, uznałem, że najczęstszą rzeczą, która była w miarę bezpieczna był w paczce. A C++ nie miał na to słowa kluczowego, bo nie mieli pojęcia o paczkach.

Ale mi się bardziej podobał niż znajomi, bo z przyjaciółmi musisz wyliczyć, kto z Twoich przyjaciele są, a więc jeśli dodajesz nową klasę do pakietu, wtedy na ogół musisz przejdź do wszystkich klas w tym pakiecie i zaktualizuj znajomych, co zawsze uważałem za kompletny wrzód na tyłku.

Ale sama lista znajomych powoduje pewien problem z wersjonowaniem. Oraz więc było to pojęcie przyjaznej klasy. I to miłe, że Zrobiłem to domyślnym -- rozwiążę problem więc co powinno słowo kluczowe być?

Dla a chociaż faktycznie było przyjazne słowo kluczowe. Ale ponieważ wszystkie inne zaczynają się na "P", to było "phriendly" na "PH". ale to było tylko na jeden dzień.

Http://www.artima.com/intv/gosling2P.html

 2
Author: Vitalii Fedorenko,
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
2016-01-14 04:16:38

Update Java 8 użycie słowa kluczowego default: Jak wielu innych zauważyło domyślną widoczność (brak słowa kluczowego)

Pole będzie dostępne z wnętrza tego samego pakietu, do którego Klasa należy.

Nie należy mylić z nową Java 8 feature (Default Methods ), która pozwala interfejsowi dostarczyć implementację, gdy jest ona oznaczona słowem kluczowym default.

Zobacz: modyfikatory dostępu

 1
Author: Sanie,
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
2016-08-05 16:52:38

W Javie istnieje modyfikator dostępu o nazwie "default", który umożliwia bezpośrednie tworzenie instancji tej jednostki tylko w obrębie tego pakietu.

Oto przydatny link:

Modyfikatory/Specyfikatory Dostępu Java

 0
Author: kg11,
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-09-21 07:44:12

Public jest słowem kluczowym używanym jako modyfikator dostępu dla metod i zmiennych. Zmienna (pole) lub metoda zadeklarowana jako publiczna jest widoczna i może być dostępna dla wszystkich klas zdefiniowanych w różnych pakietach.

Słowo kluczowe public jest używane w wielu obiektowych językach programowania (oopl), w tym C++, Java, C# i Visual Basic.NET (VB.NET). członek publiczny jest luźno związany z klasą i mniej restrykcyjny niż członek prywatny. Zmienne lub pola, które są zadeklarowane jako publiczne nie mają żadnych ograniczeń dostępności. Członek prywatny jest jednak widoczny tylko w jego klasie.

Modyfikator dostępu publicznego Pola, metody i konstruktory zadeklarowane jako publiczne (najmniej restrykcyjne) w ramach klasy publicznej są widoczne dla dowolnej klasy w programie Java, niezależnie od tego, czy te klasy znajdują się w tym samym pakiecie, czy w innym pakiecie.

Inne modyfikatory dostępu

  1. prywatne
  2. protected
  3. default

Na prywatne (najbardziej restrykcyjne) pola lub metody nie mogą być używane dla klas i interfejsów. Nie można go również używać dla pól i metod w interfejsie. Pola, metody lub konstruktory zadeklarowane jako prywatne są ściśle kontrolowane, co oznacza, że nie mogą być dostępne nigdzie poza klasą zamykającą. Standardową strategią projektowania jest uczynienie wszystkich pól prywatnymi i zapewnienie dla nich publicznych metod getter.

Pola chronione lub metody nie mogą być używane dla klas i Interfejsy. Nie można go również używać dla pól i metod w interfejsie. Pola, metody i konstruktory zadeklarowane jako chronione w superklasie mogą być dostępne tylko dla podklas w innych pakietach. Klasy w tym samym pakiecie mogą również uzyskać dostęp do chronionych pól, metod i konstruktorów, nawet jeśli nie są podklasą klasy protected member.

Java dostarcza domyślnego specyfikatora , który jest używany, gdy nie ma modyfikatora dostępu. Dowolna Klasa, pole, metoda lub konstruktor, który nie ma zadeklarowanego modyfikatora dostępu, jest dostępny tylko dla klas w tym samym pakiecie. Domyślny modyfikator nie jest używany dla pól i metod w interfejsie. Domyślny modyfikator dostępu oznacza, że nie deklarujemy jawnie modyfikatora dostępu dla klasy, pola, metody, itd.

W Javie, co jeśli klasa nie jest modyfikatorem?

Jeśli klasa nie ma modyfikatora dostępu, będzie traktowana jako domyślny modyfikator dostępu .

W obiekcie enkapsulacja jest używana w odniesieniu do jednego z dwóch powiązanych, ale odrębnych pojęć, a czasami do ich kombinacji: {]}

Mechanizm językowy ograniczający bezpośredni dostęp do niektórych komponentów obiektu Konstrukcja języka, która ułatwia łączenie danych z metodami (lub innymi funkcjami) działającymi na tym data.

//Java program to illustrate default modifier
package p1;

//Class Geeks is having Default access modifier
class Geek
{
    void display()
       {
           System.out.println("Hello World!");
       }
}

..

//Java program to illustrate error while 
//using class from different package with
//default modifier
package p2;
import p1.*;

//This class is having default access modifier
class GeekNew
{
    public static void main(String args[])
       {  
          //accessing class Geek from package p1
          Geeks obj = new Geek();

          obj.display();
       }
}

..

 //Java program to illustrate error while 
//using class from different package with
//private modifier
package p1;

class A
{
   private void display()
    {
        System.out.println("GeeksforGeeks");
    }
}

class B
{
   public static void main(String args[])
      {
          A obj = new A();
          //trying to access private method of another class
          obj.display();
      }
}

..

 //Java program to illustrate
    //protected modifier
    package p1;

//Class A
public class A
{
   protected void display()
    {
        System.out.println("GeeksforGeeks");
    }
}


    //Java program to illustrate
    //protected modifier
    package p2;
    import p1.*; //importing all classes in package p1

    //Class B is subclass of A
    class B extends A
    {
       public static void main(String args[])
       {  
           B obj = new B();  
           obj.display();  
       }  

    }

..

//Java program to illustrate
//public modifier
package p1;
public class A
{
   public void display()
      {
          System.out.println("GeeksforGeeks");
      }
}
package p2;
import p1.*;
class B
{
    public static void main(String args[])
      {
          A obj = new A;
          obj.display();
      }
}

Https://en.wikipedia.org/wiki/Encapsulation_(computer_programming)
https://www.quora.com/In-Java-what-is-the-difference-between-public-class-and-class https://www.techopedia.com/definition/24018/public-java
https://www.geeksforgeeks.org/access-modifiers-java/

 0
Author: Amadeu Antunes,
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
2018-09-05 05:44:38

Przede wszystkim powiem jedno, że w Javie nie ma takiego określenia jak "access specifier". Wszystko powinniśmy nazywać "modyfikatorami". Jak wiemy, ostateczny, statyczny, zsynchronizowany, Lotny.... są wywoływane jako modyfikatory, nawet Public, private, protected, default, abstract powinny być również wywoływane jako modyfikatory . Domyślnym jest taki modyfikator, w którym nie ma fizycznego istnienia, ale nie ma modyfikatorów, to powinien być traktowany jako modyfikator domyślny.

Aby uzasadnić to ujęcie przykład:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

Wyjście będzie: Hello Java

Teraz zmień public na private i zobacz jaki błąd kompilatora dostaniesz: "Modyfikator prywatny nie jest tu dozwolony" Jaki wniosek jest ktoś może być w błędzie lub jakiś tutorial może być w błędzie, ale kompilator nie może być w błędzie. Możemy więc powiedzieć, że w Javie nie ma określenia dostępu do terminu wszystko jest modyfikatorami.

 -1
Author: Sagar Raut,
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-08-22 08:26:24