W "polskim internecie" jakoś google na wpisanie "klasa prywatna java" nie daje mi wyników, które by mi cokolwiek wyjaśniły. Dlatego pytam tutaj. Jak to jest z klasami prywatnymi w Javie? Do czego i jak je uzywać?
Np. jak użyć (jakiś dowolny przykład) klasy prywatnej + watki. Bo mi nic nie (wychodzi) przychodzi do głowy. Może bycnawet jakieś najprostsze wyswietlanie napisu. To mi nic nie wypisuje a (chyba?) powinno:
class InnaKlasa extends Thread{
private class Watek{
public void wypisz(){
System.out.println("Hello world!");
}
public Watek w = new Watek();
public void run(){
w.wypisz();
}
}
}
public class Zad {
public static void main(String[] args) {
InnaKlasa w1 = new InnaKlasa();
w1.start();
}
}
Proste jak drut, klasy prywatne nie są widziane poza danym modułem, fin.
To w takim razie jako to ugryźć? Samo:
private class a extends Thread{}
wywala błąd, że private jest tu niedozwolone.
Źle klamerki postawiłeś. Działający kod:
class InnaKlasa extends Thread{
private class Watek{
public void wypisz(){
System.out.println("Hello world!");
}
}
public Watek w = new Watek();
@Override
public void run(){
w.wypisz();
}
}
public class Main {
public static void main(String[] args) {
InnaKlasa w1 = new InnaKlasa();
w1.start();
try
{
w1.join();
} catch(Exception e)
{
}
}
}
Dziękuję:) W międzyczasie znalazłem taki oto kod:
class Tester {
private class Watek extends Thread {
public void run(){
System.out.println("Hello world!");
}
}
public void funkcja(){
Watek w = new Watek();
w.start();
}
}
Czy są one równoznaczne?
@winerfresh: to jaki jest zakres widoczności klasy prywatnej, o ile tak to można nazwać? Poza nią mogę tworzyć jej obiekty, i mam do nich dostęp - więc nie bardzo rozumiem tę prywatność.
@Michał: A spróbuj stworzyć nową klasę, np. MojaInnaKlasa i z niej odwołać się do klasy Tester.Watek :> Jako, że Ci się nie uda tego dokonać, to stwierdzam: to jest właśnie prywatność ;p
Można jednak mieć dostęp do metod obiektu klasy prywatnej i to jest często spotykana strategia. To znaczy, nasz klasa prywatna implementuje publiczne interfejsy albo dziedziczy po nieprywatnych klasach bazowych, a my zwracamy obiekt naszej klasy prywatnej zrzutowany na jakiś interfejs lub nieprywatną klasę bazową.
interface Interfejs {
void metoda1();
}
abstract class KlasaBazowa {
abstract void metoda2();
}
public class Main {
private class Klasa extends KlasaBazowa implements Interfejs {
public void metoda1() {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
void metoda2() {
throw new UnsupportedOperationException("Not supported yet.");
}
}
Interfejs zwróćNasząSuperTajnąImplementację() {
return new Klasa();
}
public static void main(String[] args) {
}
}