为什么这个静态导入不能编译

时间:2013-07-11 21:53:32

标签: java static-import

下面的类会在第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方法不同?

3 个答案:

答案 0 :(得分:6)

使用静态导入,您可以访问类的直接成员,而无需完全限定它。您的静态导入允许您直接访问out,因为它是System和[{1}}的成员,因为它是pow的成员。但MathMath都没有方法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,因此您可以执行SomethingSomething.methodOne()

如果您使用Something.OtherThing.otherMethodOne()进行静态导入:

  • 您可以访问MyClass.Something.*。 (Java将其转换为methodOne
  • 您可以访问MyClass.Something.methodOne。 (Java将其转换为methodTwo
  • 您可以访问MyClass.Something.methodTwo。 (Java将其转换为OtherThing
  • 拥有MyClass.Something.OtherThingotherMethodOne的原始访问权限;您需要执行otherMethodTwoOtherThing.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