Diskuze: Error:(52, 22) java: non-static variable this cannot be referenced from a static context
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Skús triedu Clovek nastaviť na private a static
public class Main {
private static class Clovek{
// ...
}
public static void main(String[] args) {
Clovek Jan = new Clovek(23,"Ján","Bratislava", 40000);
System.out.println(Jan.getAge());
}
}
Hej, to by fungovalo. V podstate mi to aj IntelliJ ponúkol, len neviem prečo to tak má byť. Prečo má byť trieda static?
Skúsil som vyhľadať v Googli: "Static nested class in Java" a toto mi vypísalo:
A nested class is a member of its enclosing class. Non-static nested classes (inner classes) have access to other members of the enclosing class, even if they are declared private. Static nested classes do not have access to other members of the enclosing class.
...
Note: A static nested class interacts with the instance members of its outer class (and other classes) just like any other top-level class. In effect, a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience.
Tuto je možno lepšie vysvetlenie: http://stackoverflow.com/a/70358/3054996
Predchádzajúca odpoveď nič moc nevysvetľuje sry
Ak som to pochopil správne, tak statickú vnorenú triedu môžeš použiť aj bez inštancie objektu, ale obyčajnú vnorenú triedu iba pomocou nejakej inštancii objektu.
Ak je vnorená trieda static:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Ak je vnorená trieda obyčajná, nestatická, najprv musíš vytvoriť vonkajšiu triedu a až tak tú vnorenú:
OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
Zkus:
Main.Clovek Jan = new Main.Clovek(23,"Ján","Bratislava", 40000);
Každopádně, možná bude tím hlavním problémem to, že jsi zde
vytvářel vnořenou třídu do třídy main. Podle mě jsi ani toto dělat
nechtěl, protože vnořené třídy se normálně dávají jako podtřídy
nějakých objektů, jejich např. vlastnosti, takže zde to moc návrhovému
vzoru nesedí. Asi jsi chtěl vytvořit zkrátka novou třídu, ale nedát ji do
souboru zvlášť (což je normálně standartní postup, ale jde to i
takto).
V tom případě by jsi blok "public class Clovek{......}" musel napsat mimo
block "public class Main{....}", tzn. až na konec za poslední závorku, v tu
chvíli se z toho stává normální třída.
Pokud se mýlím, tak mě klidně zlynčujte, jen jsem zkusil trochu dedukce
Tak zkusím něco já.... Trochu jsem vymyslel několik situací, nemám to
odzkoušeno, takže možná říkám blbosti...
Představme si vnořenou třídu jako normální atribut objektu. to hned pak
začne vysvětlovat vše...
Pokud máme normální (ne-statickou) třídu A v normální třídě B, pak je
ten atribut unikátní pro každý objekt. Proto se to chová, jako by se
třída A inicializovala pro každou instanci třídy B. Co je důsledkem?
Statické proměnné budou u každého objektu různé. Proto když chceme
získávat nějaké statické atributy z třídy A, musíme je volat na INSTANCI
třídy B.
Co když je třída A statická a třída B normální? Pak je to to samé, jako
by se jednalo o statický atribut. Pro všechny instance třídy B je celá
třída A společná, tudíž všechno z ní vypadá pro všechny instance
stejně, tudíž se může volat normálně na třídě B, ne na instanci. Teď
dotaz... Jde vnořená statická třída instancovat? Pokud ano, dosti by to
vysvětlovalo (není statická vůči instancím třídy A, ale vůči třídě
a instancím třídy B).
Po tomto si říká, jestli má vůbec nějaký smysl psát "static" před
hlavní třídu, nebo spíše účinek, to doplňte sami, alespoň si tu dáme
hodinu filosofování
Zobrazeno 9 zpráv z 9.