Klasy nie widzą się w tym samym pakiecie

0

Dobry wieczór :]
Uczę się Javy z książki i aktualnie jestem przy temacie pakietów. Przy pomocy zadania podobnego do tego, które widnieje w książce, chciałem przetestować kontrolę dostępu w obrębie klas i pakietów (private, public, protected).
Problem napotkałem już przy testowaniu kontroli dostępu w obrębie tego samego pakietu. Możliwe, że jestem idiotą i nie widzę tu jakiejś oczywistej rzeczy, ewentualnie w mojej książce jest błąd.

Mam taką banalną strukturę:

Plik Dostep1:

package JakisPakiet1;

public class Dostep1 {
	int zm = 10;
	public int zm_pub = 11;
	private int zm_priv = 12;
	protected int zm_prot = 13;
	
	public Dostep1() {
		System.out.println("zm = " + zm);
		System.out.println("zm_pub = " + zm_pub);
		System.out.println("zm_priv = " + zm_priv);
		System.out.println("zm_prot = " + zm_prot);
	}
}

Plik Dostep2.java:

package JakisPakiet1;

class Dostep2 extends Dostep1 {
	Dostep2() {
		System.out.println(zm);
		System.out.println(zm_pub);
		System.out.println(m_priv);
		System.out.println(zm_prot);
	}
}

Plik Dostep3.java:

package JakisPakiet1;

class Dostep3 {
	Dostep3() {
		Dostep1 obj = new Dostep1();
		System.out.println(obj.zm);
		System.out.println(obj.zm_pub);
		System.out.println(obj.zm_priv);
		System.out.println(obj.zm_prot);
	}
}

Pliki umieszczone w katalogu o nazwie zgodnej z nazwą pakietu, czyli JakisPakiet1.
Próba kompilacji Dostep2.java zwraca błąd "cannot find symbol" dla każdej próby wyświetlenia dziedziczonej po klasie Dostep1 zmiennej składowej.
Próba kompilacji Dostep3.java zwraca błąd cannot find symbol" dla wiersza, zawierającego próbę utworzenia egzemplarza klasy Dostep1.
Innymi słowi, klasy Dostep2 i Dostep3 nie widzą klasy Dostep1.
Jak widać, klasy te są w tym samym pakiecie (no chyba, że nie ;>).
Dodam, że gdy usunę wiersz "package JakisPakiet1;" z tychże plików źródłowych, tym samym umieszczając klasy w domyślnej przestrzeni nazw, wszystko kompiluje się jak powinno (a właściwie wyświetlają się oczywiste błędy o braku dostępu do zmiennych priv klasy Dostep1).
Ktoś pomoże? Proszę.

1
  1. Nie pisz lodówką tylko za pomocą IDE jakiegoś.
  2. Kompilacja klas z pakietami musi odbywać sie z poziomu kataogu NAD pakietami z podaniem ścieżki, bo pakiet jest niejako częścią nazwy klasy.
  3. Pokaż logi z konsoli. Kompilujesz to mam nadzieje wszystko na raz? Bo rozumiesz ze inaczej to nie ma sensu?
0

Miałeś na myśli "javac JakisPakiet1\Dostep2.java" wywolane z katalogu nadrzędnego dla JakisPakiet1, prawda? Bo w ten sposób rzeczywiście działa :)

WTF, gdzie się podział post gościa, który pierwszy mi odpowiedział? :O
A co do Twojego pytania, Shalom: nie, kompiluję osobno każdy plik. Dlaczego to nie ma sensu?

2

Po pierwsze, więcej pisaniny, a wystarczy javac JakisPakiet1/*.java.
Po drugie, Ty musisz wtedy pilnować by kompilować we właściwej kolejności i by skompilować wszystkie pliki.

0

Tak, to oczywiste.
Właściwie to ciekawi mnie też to, że rzeczywiście próbowałem umieścić wszystkie te klasy w jednym pliku źródłowym z wierszem "package JakisPakiet1;" i wtedy wszystko działało... (kompilowałem z poziomu katalogu, będącego pakietem, a nie nadrzędnego). Ktoś mi to wytłumaczy?
Aha, btw: skompilowałem z poziomu katalogu nadrzędnego i zadziałało.
Czuję, że czegoś ewidentnie nie rozumiem w tym mechanizmie :|

0

Kompilować możesz z poziomu katalogu, w którym są pliki źródłowe (javac *.java), możesz z katalogu nadrzędnego (javac JakisPakiet1/*.java). Natomiast uruchamiać program musisz z katalogu nadrzędnego: java JakisPakiet1/ClassWithMethodMain.
Twoje problemy z kompilacją brały się z tego, że w klasach Dostep2 i Dostep3 odwoływałeś się do pola private z klasy Dostep1.

0
bogdans napisał(a):

Twoje problemy z kompilacją brały się z tego, że w klasach Dostep2 i Dostep3 odwoływałeś się do pola private z klasy Dostep1.

Odwoływanie się do tych zmiennych prywatnych było celowe. Treść błędu nie wskazywała na problem z tym dostępem. Dopiero po skompilowaniu z katalogu nadrzędnego program 'nie skompilował się tak jak należy', czyli wskazując na próbę dostępu do zmiennej z dostępem private :) Co wskazywało, że dopiero wtedy jest ona widoczna.
Ale to już nie ważne, dzięki wszystkim za odpowiedzi, problem ogarnąłem, można zamknąć temat.
Pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1