2014-01-28 1 views
3

Я только начал с Java снова смотрел в Nested Classes тему, и опробовать некоторые вещи, когда вдруг это случилось:Java - Instance в состоянии получить доступ к статическому методу

class Encloser 
{ 
    static int i; 

    static void m1() 
    { 
    System.out.println(i); 
    } 

    static void m2() 
    { 
    Enclosee.accessEncloser(); 
    } 

    static class Enclosee 
    { 
    static void accessEncloser() 
    { 
     i = 1; 
     m1(); 
    } 

    static void accessEncloserNew() 
    { 
     m2(); 
    } 
    } 
} 

class EncloserTest 
{ 

    public static void main(String[] args) 
    { 
    Encloser ee = new Encloser(); 
    Encloser.Enclosee e = new Encloser.Enclosee(); 
    ee.m1(); 
    ee.m2(); 
    e.accessEncloser(); 
    e.accessEncloserNew();Encloser.m1(); 
    Encloser.m2(); 
    Encloser.m1(); 
    Encloser.Enclosee.accessEncloserNew(); 
    Encloser.Enclosee.accessEncloser(); 
    } 

} 

Запуск выше код Безразлично 't дать любую ошибку/исключение. Он просто бежит. Здесь возникает путаница, как здесь можно назвать здесь Static Methods? Не Static Methods как Class Methods в Ruby?

Любое объяснений будут оценены :)

ответ

6

Это то, что язык позволяет:

ee.m1(); 

но вы скорее должны написать:

Encloser.m1(); 

You компилятор должен выдавать предупреждение, как показано ниже, чтобы сообщить вам о том, что:

source_file.java:37: предупреждение: статический метод должен быть квалифицированным именем типа, Encloser, а не expres sion ee.m1();

+0

Спасибо за подсказку repliy @marcin_j :) Но просто FYI, я не получил никаких предупреждений: | –

+0

Возможно, это зависит от компилятора ide/java/используемых параметров, я вставил ваш код в http://rextester.com/runcode. – marcinj

2

В компиляции временных переменных экземпляра заменяются именами классов, если они называют статические методы.

ee.m1(); интерпретируется как Enclosee.m1();

3

Статические методы могут быть доступны (но не должно быть, как хорошая практика программирования) объектами тоже, потому что во время компиляции, эти типы переменных разрешены в именах классов.

+0

@MarkoTopolnik отредактировал:) – Batty

+0

Немного лучше, но ОП смущается о «доступе к объектам», что совсем не происходит, однако ваш ответ читается иначе. Здесь не задействованы никакие объекты, и даже переменные являются необязательными. '((Encloser) null) .m1()' вызывает это наиболее остро. –