Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

Różnica między public a protected PRZYKŁAD



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
deathrone



Dołączył: 17 Sie 2012
Posty: 11

PostWysłany: Wto Kwi 11, 2017 7:27 pm  OP    Temat postu: Różnica między public a protected PRZYKŁAD Odpowiedz z cytatem Pisownia

Potraficie napisać mi prosty przykład, gdzie widać różnicę między public a protected? Bo nie rozumiem czemu protected n z klasy Zwierze jest widoczne w klasie Kot, który nie dziedziczy po Czlowieku:

Kod:

public class Czlowiek {
    
    protected int n=5;
}



public class Kot {

    Czlowiek z = new Czlowiek();
    
    public void jadymy(){
        System.out.println(z.n);
    }    
}



public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {

        Kot k = new Kot();

        k.jadymy();
    }
}

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



Dołączył: 20 Sty 2007
Posty: 891

PostWysłany: Wto Kwi 11, 2017 8:51 pm      Temat postu: Odpowiedz z cytatem Pisownia

Opis jest tutaj na stronie Oracla:
https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
Cytat:
The protected modifier specifies that the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package.

To znaczy, że n z człowieka jest widoczne dla wszystkich klas z pakietu, oraz dla klas z innych pakietów, dziedziczących po klasie Człowiek.

Jakkolwiek dziwne by to nie było, wszystkie klasy wewnątrz pakietu mają dostęp do wszystkiego w tym pakiecie, co nie jest prywatne.

Twój kod nie wysypał się błędem tylko dlatego że wszystkie trzy klasy masz w tym samym pakiecie, a co za tym idzie, w tym samym katalogu. Zmień pakiet dla klasy Kot a zobaczysz błąd, którego się spodziewałeś.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
deathrone



Dołączył: 17 Sie 2012
Posty: 11

PostWysłany: Wto Kwi 11, 2017 8:58 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

ok, czaję, tylko teraz powiedz mi dlaczego metoda Object.clone() jest niewidoczna dla obiektów, a przecież wszystkie obiekty dziedziczą z Object, więc powinna być widoczna.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



Dołączył: 20 Sty 2007
Posty: 891

PostWysłany: Wto Kwi 11, 2017 9:26 pm      Temat postu: Odpowiedz z cytatem Pisownia

Metoda Object.clone() jest widoczna dla obiektów, ponieważ wszystkie obiekty dziedziczą z Object.

Natomiast metoda ta jest oznaczona jako protected, więc bez zmiany modyfikatora nie można jej wywołać spoza klasy. Dozwolone jest np:
Kod:
public class Kot {

    public void zrobKopie(){
        this.clone();
    }
}

albo
Kod:
public class Kot {

    public Kot zrobKopie() {
        return clone();
    }
}

albo
Kod:
public class Kot {

    public Kot clone() {
        return super.clone();
    }
}

albo
Kod:
public class Kot {

    public Kot clone() {
        Kot kopia = new Kot();
        [...] // ręczne kopiowanie kota
        return kopia;
    }
}

choć generalnie to nie wszystko. Więcej o tym nie do końca udanym tworze przeczytasz na https://en.wikipedia.org/wiki/Clone_(Java_method)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
deathrone



Dołączył: 17 Sie 2012
Posty: 11

PostWysłany: Wto Kwi 11, 2017 9:49 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

no to włąśnie czemu nie można wywołać bezpośrednio mimo, że Kot dziedziczy po Object, a własne metody protected mogę wywołać jeśli klasa dziedziczy. (no chyba, że to kwestia tylko tego package)
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



Dołączył: 20 Sty 2007
Posty: 891

PostWysłany: Wto Kwi 11, 2017 10:02 pm      Temat postu: Odpowiedz z cytatem Pisownia

Bo metody protected może wywołać tylko ten co je odziedziczył (i ten co jest w tym samym pakiecie), a nie każdy skądkolwiek. Tak działa ten modyfikator i takie jest jego przeznaczenie.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
deathrone2
Gość





PostWysłany: Wto Kwi 11, 2017 11:12 pm      Temat postu: Odpowiedz z cytatem Pisownia

dziękuje, jutro potestuję.
Powrót do góry
deathrone



Dołączył: 17 Sie 2012
Posty: 11

PostWysłany: Sro Kwi 12, 2017 6:16 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

no i dalej mi się nie zgadza. Czemu ta metoda protected się kompiluje:

Kod:
public class Pracownik {
    public static void main(String args[]){
        Pracownik2 c = new Pracownik2();
        
        c.pp();                                                 //czemu to działa?!!!
    }

}


public class Pracownik2 {
    Czlowiek c2 = new Czlowiek(5);
    
    protected void pp(){
        System.out.println(c2.dawaj(3));                                           //czemu to dziala?
    }

}


public class Czlowiek {
    protected int m;
    
    public Czlowiek(int x){
        m = x;
    }

    protected int dawaj(int x){
        return x*3;
    }
    
}




a metoda protected clone() nie dziala:

Kod:
public class Pracownik {
    public static void main(String args[]){
        Pracownik2 c = new Pracownik2();
        Pracownik2 cc = (Pracownik2) c.clone();                                           // czemu nie dziala ?!!!
        c.pp();
    }

}


public class Pracownik2 {
    Czlowiek c2 = new Czlowiek(5);
    
    protected void pp(){
        System.out.println(c2.dawaj(3));
    }

}


public class Czlowiek {
    protected int m;
    
    public Czlowiek(int x){
        m = x;
    }

    protected int dawaj(int x){
        return x*3;
    }
    
}
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Sinus32



Dołączył: 20 Sty 2007
Posty: 891

PostWysłany: Sro Kwi 12, 2017 9:05 pm      Temat postu: Odpowiedz z cytatem Pisownia

W jakich pakietach są te klasy?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
deathrone2
Gość





PostWysłany: Sro Kwi 12, 2017 9:27 pm      Temat postu: Odpowiedz z cytatem Pisownia

ok czyli już czaję:

private: widoczne ino w klasie

protected: widoczne w tym samym pakiecie lub po dziedziczeniu.

public: widoczne wszędzie


Dziękuję.
Powrót do góry
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Java Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.10609 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |