2012-06-16 7 views
5

Rozumiem, że statyczne elementy należą do klasy. Dlaczego więc Java pozwala mi uzyskać do nich dostęp za pomocą obiektu?Dlaczego środowisko Java zezwala na dostęp do statycznego elementu członkowskiego z instancją obiektu

Aby zrozumieć, co mam na myśli, zobacz poniższy przykład:

public class Student { 
    public static int number = 0; 
} 

Tutaj number jest statycznym polem, które należy do klasy Student, ale mogę jeszcze do niego dostęp, jak pokazano poniżej:

Student s = new Student(); 
int n = s.number; 

Jakie są przesłanki tej decyzji?

+0

Próbowałem edytować twoje pytanie dla jasności, ale nie mogłem. Nie rozumiem, o co pytasz? –

+2

Poddałem się "pierwszej krwi" –

+1

Google Translate w najlepszym wydaniu :) – buc

Odpowiedz

7

Uzasadnieniem jest to, że obiekt jest instancją klasy, dlatego powinien mieć dostęp do każdego atrybutu należącego do klasy oprócz atrybutów poziomu instancji.

To jest jak tradycyjna poczta. Jeśli otrzymasz wiadomość adresowaną do całej rodziny (statyczny członek), poczujesz, że masz licencję na jej otwarcie, ponieważ jesteś członkiem rodziny. Z drugiej strony, jeśli poczta jest skierowana do Ciebie (członek instancji), tylko Ty masz prawo go otworzyć, nikt inny w Twojej rodzinie.

Działa to samo w innych językach obiektowych, takich jak C++. Odradza się jednak używanie notacji s.number w celu uzyskania dostępu do statycznych elementów, ponieważ wprowadza to w błąd czytelników kodu. Powinieneś zawsze używać notacji Student.number, ponieważ to wyraźnie pokazuje, że number jest statycznym elementem. Współczesne języki, na przykład C#, wyda ostrzeżenie, jeśli uzyskasz dostęp do statycznych członków poprzez zmienną instancji, ale nadal jest to całkowicie zgodne z językiem.

+0

Dziękuję za odpowiedź, masz sloved my puzzle dom .Beausce Używam C#, więc mam to. – Myd

0

Uzasadnieniem tego jest ... JLS - Chapter 8.3.1.1. static Fields

+4

Nie widzę żadnych uzasadnień per se w JLS: tylko prosty fakt, że można uzyskać do niego dostęp na obiekcie. –

+0

+1 dla odniesienia. To wybór dokonany podczas projektowania języka. – dacwe

+1

Masz rację, a nie uzasadnienie per se. Pierwotne pytanie zadał pytanie, dlaczego był w stanie to zrobić. Myślę, że link może być pomocny. – Behe

4

Po pewnym czytanie najwyraźniej Kompilator java czyni konieczną Hoodoo do czynienia z instancji obiektów, które mają dostęp zmienne statyczne i wie, co chcesz oznaczało .. IDE da Ci ostrzeżenie o tym ..

Jeśli chodzi o wyjaśnienie dlaczego i przeczytać: Why isn't calling a static method by way of an instance an error for the Java compiler?

ostatecznie to spec język i po prostu trzeba się z tym pogodzić .. jego wezwanie, czy używać czy nie. Moja sugestia: DONT!

Powiązane problemy