下面的类会在第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中访问pow方法而不显式导入pow,这与需要使用方法名称'out'的println方法不同?
答案 0 :(得分:6)
使用静态导入,您可以访问类的直接成员,而无需完全限定它。您的静态导入允许您直接访问out
,因为它是System
和[{1}}的成员,因为它是pow
的成员。但Math
和Math
都没有方法System
; println
确实(PrintWriter
的类型)。
您的静态导入......
out
...等同于以下代码,我们可以看到它们无法编译:
import static java.lang.System.*;
//...
println("Hello World!");
答案 1 :(得分:5)
println
是属于out
类的System
成员的方法。没有该限定符,Java不知道println
是什么。
执行静态导入时,无需提供完全限定名称即可访问类的成员。因此,您java.lang.System
的静态导入可让您访问System
所拥有的所有内容。这意味着您可以访问属于out
的{{1}}(PrintWriter
个实例)。但不意味着您可以直接访问System
,因为它属于println
。所以你必须首先通过out
告诉Java如何到达println
。
以这种方式看待它。假设您具有以下结构:
out
如果您使用MyClass
|
+---Something
| |
| +---- methodOne
| |
| +---- methodTwo
| |
| +---- OtherThing
| |
| +---- otherMethodOne
| |
| +---- otherMethodTwo
+---method
进行静态导入:
MyClass.*
(Java将其转换为method()
)MyClass.method()
。 (Java将其转换为Something
)MyClass.Something
下其他内容的原始访问权限。例如,您不能简单地调用Something
,因为Java会将其转换为methodOne()
,而MyClass.methodOne()
下没有名为methodOne()
的方法。该方法属于MyClass
,因此您可以执行Something
或Something.methodOne()
。如果您使用Something.OtherThing.otherMethodOne()
进行静态导入:
MyClass.Something.*
。 (Java将其转换为methodOne
)MyClass.Something.methodOne
。 (Java将其转换为methodTwo
)MyClass.Something.methodTwo
。 (Java将其转换为OtherThing
)MyClass.Something.OtherThing
或otherMethodOne
的原始访问权限;您需要执行otherMethodTwo
或OtherThing.otherMethodOne()
。OtherThing.otherMethodTwo()
,因为Java会将其转换为method
,而MyClass.Something.method
类中没有此类方法。答案 2 :(得分:0)
pow是Math类的静态方法,因此如果在顶部编写了import java.lang.Math语句,则可以在不创建Math类对象的情况下访问它,另一方面是PrintStream类型的System类的成员println()是PrintStream类的一种方法,它不是静态的,因此您无法以静态方式访问它,因为在不创建对象的情况下无法调用非静态函数。您还可以参考此链接以获取有关PrintStream的更多信息 http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html