Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
deathrone
Dołączył: 17 Sie 2012 Posty: 11
|
Wysłany: Wto Kwi 11, 2017 7:27 pm OP Temat postu: Różnica między public a protected PRZYKŁAD |
|
|
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 |
|
 |
|
Sinus32
Dołączył: 20 Sty 2007 Posty: 907
|
Wysłany: Wto Kwi 11, 2017 8:51 pm Temat postu: |
|
|
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 |
|
 |
deathrone
Dołączył: 17 Sie 2012 Posty: 11
|
Wysłany: Wto Kwi 11, 2017 8:58 pm OP Temat postu: |
|
|
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 |
|
 |
Sinus32
Dołączył: 20 Sty 2007 Posty: 907
|
Wysłany: Wto Kwi 11, 2017 9:26 pm Temat postu: |
|
|
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 |
|
 |
deathrone
Dołączył: 17 Sie 2012 Posty: 11
|
Wysłany: Wto Kwi 11, 2017 9:49 pm OP Temat postu: |
|
|
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 |
|
 |
Sinus32
Dołączył: 20 Sty 2007 Posty: 907
|
Wysłany: Wto Kwi 11, 2017 10:02 pm Temat postu: |
|
|
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 |
|
 |
deathrone2 Gość
|
Wysłany: Wto Kwi 11, 2017 11:12 pm Temat postu: |
|
|
dziękuje, jutro potestuję. |
|
Powrót do góry |
|
 |
deathrone
Dołączył: 17 Sie 2012 Posty: 11
|
Wysłany: Sro Kwi 12, 2017 6:16 pm OP Temat postu: |
|
|
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 |
|
 |
Sinus32
Dołączył: 20 Sty 2007 Posty: 907
|
Wysłany: Sro Kwi 12, 2017 9:05 pm Temat postu: |
|
|
W jakich pakietach są te klasy? |
|
Powrót do góry |
|
 |
deathrone2 Gość
|
Wysłany: Sro Kwi 12, 2017 9:27 pm Temat postu: |
|
|
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 |
|
 |
|