• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasy wewnętrzne, Java

Object Storage Arubacloud
0 głosów
678 wizyt
pytanie zadane 23 czerwca 2020 w Java przez amtrax Dyskutant (9,630 p.)
zmienione kategorie 23 czerwca 2020 przez draghan

Cześć, 

W książce Hortsmann'a jest dla mnie niezrozumiale wytłumaczony dział dotyczący klas wewnętrznych. 

Nie mogę zrozumieć jaka jest różnica pomiędzy zadeklarowaniem klasy wewnętrznej jako public vs private ? 
 Czy tylko ten obiekt, w którym znajduje się deklaracja klasy wewnętrznej może tworzyć jej obiekty?  
Jak wygląda taka "procedura"? 

Przykładowy kod "do nauki"  poniżej. 

class def {

	
		public static void main(String[] args) {
			
			Person x = new Person("M",1337,2115);
			
			Person.Pomoc c = x.new Pomoc(1335); 
			c.getc();
			
		}

		 public static class Person
		{
			private String imie;
			private int wyplata;
			private int premia;
			Person(String i, int a, int b){imie = i; wyplata = a; premia = b;}
			int getWyplata() {return wyplata;}
			int getPremia() {return premia;}
			void show()
			{
				Pomoc a = new Pomoc();
				a.show();
			}
			private class Pomoc
			{
				int control  = 1337;
				Pomoc(int c){control = c;}
				Pomoc(){};
				void getc() {System.out.print(control);}
				void show()
				{
					System.out.println("Imie: "+imie);
					System.out.println("Wypłata: "+wyplata);
					System.out.println("Premia: "+premia);
				}
			}
					
		}	
}

Pozdrowienia 

3 odpowiedzi

0 głosów
odpowiedź 26 czerwca 2020 przez Wiciorny Ekspert (270,230 p.)
wybrane 26 czerwca 2020 przez amtrax
 
Najlepsza

No taka, że mimo iż to jest klasa wewnętrzna, to możesz odwołać się do niej  z innej paczki, innej klasy... etc poprzez obiekt np. klasy nadrzędnej lub bezpośrednio posługując się klasą nadrzędną. Coś na bazie, chciałbym pozmieniać coś w silniku Samochodu, ale z klasy Warsztat. Gdyby silnik był prywatną klasą ( a nie np. obiektem wewnętrznym ), to takiej możliwości by nie było, aby skorzystać z takich metod.

 

 public static void main(String[] args) {
             
            Person x = new Person("M",1337,2115);
             
            Person.Pomoc c = x.new Pomoc(1335); 
            c.getc();
             
        }

Robisz to w tej samej klasie, bo main jest statyczna i jest w tej samej klasie co  klasa PERSON a w klasie Person masz prywatną klasę POMOC , co powoduje że skoro POMOC dla klasy  def jest publiczna to możesz to wykonać. 

Z innej paczki, innej klasy juz tego nie zrobisz 

+2 głosów
odpowiedź 23 czerwca 2020 przez mbabane Szeryf (79,280 p.)
Zrób tego samego maina w drugiej/innej klasie (np. w innym pliku), a sam się przekonasz.
+1 głos
odpowiedź 23 czerwca 2020 przez AnalityczneMyslenie Użytkownik (680 p.)

Jeśli klasa wewnętrzna jest zadeklarowana jako private to jej instancje możesz stworzyć w niej oraz klasie zewnętrznej do niej. Natomiast jeśli klasa wewnętrzna jest public to wtedy możesz stworzyć jej instancje również w całkiem innej klasie. 

Np poniższy kod nie zadziała, dlatego że jest próba stworzenia klasy wewnętrznej w innej klasie (nie zewnętrznej do niej). Aby kod zadziałał należało by zmienić private na public w klasie wewnętrznej.

class Klasa {
    int x = 1;

    private class KlasaWewnetrzna {
        int y = 2;
    }
}

public class InnaKlasa{
    public static void main(String[] args) {
        Klasa klasa = new Klasa();
        Klasa.KlasaWewnetrzna klasaWewnetrzna = klasa.new KlasaWewnetrzna();
        System.out.println(klasaWewnetrzna.y + klasa.x);
    }
}

 

1
komentarz 23 czerwca 2020 przez mbabane Szeryf (79,280 p.)
edycja 23 czerwca 2020 przez mbabane
To co pokazujesz to jeszcze jest inna para kaloszy bo klasa wewnętrzna nie jest statyczna. Taka klasa jest ściśle związana z obiektem, w którym jest zadeklarowana tzn. nie możesz utworzyć obiektu klasy KlasaWewnetrzna bez utworzenia obiektu Klasa. A wewnętrzna klasa statyczna ma zasadniczo takie same właściwości jak zwykła klasa.

Podobne pytania

0 głosów
1 odpowiedź 392 wizyt
0 głosów
5 odpowiedzi 327 wizyt
pytanie zadane 26 marca 2019 w Java przez gorgonkowa Obywatel (1,810 p.)
0 głosów
1 odpowiedź 654 wizyt
pytanie zadane 18 grudnia 2018 w Java przez mn130496 Gaduła (3,530 p.)

92,584 zapytań

141,434 odpowiedzi

319,669 komentarzy

61,967 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...