Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Java] Modyfikator package/default/internal

kadu 31 Maj 2010 19:44 1892 3
  • #1 31 Maj 2010 19:44
    kadu
    Poziom 10  

    Jest to taki modyfikator określany takimi nazwami, który jest dla metod i pól danych domyślny i się go nie pisze. Problem jaki mam to taki, że we wszystkich tutorialach piszą, że:
    package - jest to modyfikator domyślny, wszystkie metody i pola danych bez modyfikatora dostępu traktowane są jako typu package. Metody (lub pola danych) typu package mogą być używane przez inne klasy danego pakietu.
    Po czym jest w tych tutorialach taka tabelka:

    Code:
    Modyfikator klasa podklasa pakiet wszędzie
    
    public        x      x        x         x
    private       x
    protected     x      x        x
    package       x               x


    Moim zdaniem krzyżyk powinien również być przy podklasie dla modyfikatora package!... ponieważ poniższy kod się kompiluje (używam Eclipse):
    Code:
       class Owad{
    
           String nazwa;
       }
       class Owad2 extends Owad{
          void funkcja(){
             this.nazwa="cośtam";
          }
       }

    A zgodnie z tą tabelką powinien być błąd kompilacji, bo przecież w klasie Owad pole danych 'nazwa' jest jako package, więc w podklasie Owad2 zgodnie z tabelką nie powinniśmy mieć do niego dostępu, bo nie ma krzyżyka przy podklasie. Z góry dziękuję jak pojawi się osoba, która umiałaby to wytłumaczyć (np. poprzez podanie przykładu) o co autorom tutoriali chodzi że nie ma krzyżyka tam gdzie wydaje mi się że powinien być.
    Teoretycznie to powyżej jest mało ważne, ale przy staraniu się o prace w firmach o takie bzdury, których się nie używa pytają, i trzeba wiedzieć.

    0 3
  • #2 31 Maj 2010 20:26
    McMonster
    Poziom 32  

    Zapewniam, że wszystko gra, tylko trzeba czytać uważnie:

    Code:
    package one;
    

    public class Owad
    {
       String name;
    }


    Code:
    package two;
    

    import one.Owad;

    public class OwadSub extends Owad
    {   
       public void assign()
       {
          this.name = "test";
       }
    }


    To już zdecydowanie nie zadziała, zgodnie z tutorialami pole nadklasy jest niewidoczne poza jej pakietem. Jeszcze nigdy nie natrafiłem na błąd na stronach Suna, więc śmiało polecam weryfikowanie wszelkich wątpliwości właśnie tam, bo jest to pewne źródło i wszystko dobrze wytłumaczone.

    0
  • #3 31 Maj 2010 21:28
    pallid
    Poziom 20  

    Tabelk powinna byc raczej przedstawiana w ten sposob:

    Code:
    Modyfikator klasa pakiet podklasa wszędzie
    
    public        x      x        x         x
    protected     x      x        x
    package       x      x
    private       x


    Mozna wtedy ocenic zakres na zasadzie wykluczen, np:
    package - dostep w klasie definiujacej oraz dostep w dowolnej (pod)klasie w tym samym pakiecie. Brak dostepu w dowolnej (pod)klasie innego pakietu i gdziekolwiek indziej.

    Ciekawszym zjawiskiem jest modyfikator:
    protected - dostep w klasie definiujacej oraz dostep w dowolnej (pod)klasie w tym samym pakiecie, oraz dostep tylko w podklasie w dowolnym innym pakiecie. Brak dostepu gdziekolwiek indziej.

    0
  • #4 01 Cze 2010 11:36
    kadu
    Poziom 10  

    Czyli dla modyfikatora package pole danych/metoda dostępne jest w tej samej klasie i całym pakiecie (czyli pliku) a dla protected dodatkowo w innym pakiecie (pliku), ale tylko w tych podklasach, które dziedziczą po klasie, w której mamy definicję pola/metody.
    Czyli tłumacząc dla topornych:

    Code:
    package A;
    

    public class Owad{
       String bbb;
       protected String ccc;
    }

    Code:
    package B;
    
    import A.Owad;
    public class Owad2 extends Owad{
        public void funkcja(){
           //dostępne ccc
       }
    }
    class Owad3 extends Owad2{
       public void funkcja2(){
         //tutaj też dostępne ccc mimo dziedziczenia wielopoziomowego
      }
    }
    class Owad4{
       public void funkcja3(){
       //tutaj nic nie dostępne
      }
    }
    class Owad5 extends Owad4{
       public void funkcja4(){
       //tutaj mimo że to jest podklasa to też nic nie dostępne (nawet ccc), bo w tabelce słówko podklasa oznacza podklasę klasy, w której pole/metoda została zdefiniowana
      }
    }

    Szkoda, że na przykładach w taki powyższy sposób w tutorialach nie tłumaczą, bo wtedy każdy tłumok nawet taki jak ja by zaczaił:) Ale podejrzewam, że to dlatego bo wtedy na szkolenia nikt by nie chodził, a więc firmy szkolące by nie zarabiały jakby wszystkiego szybko można było się dowiedzieć z netu.

    0