2013-07-11 2 views
2

Ниже класса вызывает ошибку компиляции в строке println("Hello World!");: The method println(String) is undefined for the type StaticImport:Почему этот статический импорт не компилировать

import static java.lang.Math.*; 
import static java.lang.System.*; 

public class StaticImport { 
    public static void main(String[] args) { 
     println("Hello World!"); 
     out.println("Considering a circle with a diameter of 5 cm, it has:"); 
     out.println("A circumference of " + (PI * 5) + " cm"); 
     out.println("And an area of " + (PI * pow(2.5,2)) + " sq. cm"); 
    } 
} 

Почему метод пау доступен в java.lang.Math без явного импортирующей мощн, в отличие от Println метод, в котором необходимо использовать метод name 'out'?

+4

'out' является статическим членом' System', содержащим ссылку PrintWriter. 'println' не является статическим методом, а скорее экземпляром экземпляра PrintWriter. –

ответ

6

Со статическим импортом вы можете получить доступ к прямым членам класса без полной квалификации. Ваш статический импорт позволяет вам напрямую получить доступ к out, так как он является членом System и pow напрямую, потому что он входит в состав Math. Но ни Math, ни System не имеет способа println; PrintWriter делает (тип out).

Ваш статический импорт ...

import static java.lang.System.*; 
//... 
println("Hello World!"); 

... эквивалентен следующий код, который мы можем видеть не компилируется:

System.println("Hello World!"); 
5

println является методом, принадлежащим к out член класса System. Без этого квалификатора Java не знает, что такое println.

Когда вы выполняете статический импорт, вы можете получить доступ к членам класса, не предоставляя полное имя. Таким образом, ваш статический импорт java.lang.System позволяет получить доступ ко всему, что есть у System. Это означает, что вы можете получить доступ к out (экземпляр PrintWriter) который принадлежит System. Но это не означает, что вы можете получить доступ к println непосредственно, так как он принадлежит out. Поэтому вы должны сказать Java, как добраться до println, пройдя через out.

Посмотрите на это так. Предположим, у вас есть следующая структура:

MyClass 
    | 
    +---Something 
    |  | 
    |  +---- methodOne 
    |  | 
    |  +---- methodTwo 
    |  | 
    |  +---- OtherThing 
    |    | 
    |    +---- otherMethodOne 
    |    | 
    |    +---- otherMethodTwo 
    +---method 

Если вы сделали статический импорт с MyClass.*:

  • Вы имеете доступ к method() (Java переводит это MyClass.method())
  • Вы имеете доступ к Something. (Java переводит это значение в MyClass.Something)
  • не не имеет доступа к другим материалам под Something. Например, вы не можете просто вызвать methodOne(), потому что Java переведет это на MyClass.methodOne(), и нет метода под названием methodOne() под номером MyClass. Этот метод принадлежит Something, поэтому вы можете сделать Something.methodOne(), или Something.OtherThing.otherMethodOne().

Если вы сделали статический импорт с MyClass.Something.*:

  • Вы имеете доступ к methodOne. (Java переводит это значение в MyClass.Something.methodOne)
  • У вас есть доступ к methodTwo. (Java переводит это значение в MyClass.Something.methodTwo)
  • У вас есть доступ к OtherThing. (Java переводит это значение в MyClass.Something.OtherThing)
  • У вас нет имеют необработанный доступ к otherMethodOne или otherMethodTwo; вам нужно будет сделать OtherThing.otherMethodOne() или OtherThing.otherMethodTwo().
  • У вас нет нет имеют доступ к method, потому что Java переводит это значение в MyClass.Something.method, и такого метода нет в классе Something.
0

pow является статическим методом класса Math, поэтому вы можете получить к нему доступ, не создавая объект класса Math, если вы написали импорт java.lang.Math-инструкции сверху, а с другой стороны - член класса System типа PrintStream и println() - это метод класса PrintStream, который не является статическим, поэтому вы не можете получить доступ к нему статическим способом, так как нестатические функции не могут быть вызваны без создания объектов. Вы также можете обратиться по этой ссылке для получения дополнительной информации о PrintStream http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html

Смежные вопросы