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 中访问 pow 方法而无需显式导入 pow ,这与 println 方法需要使用方法名称“out”不同?

4

3 回答 3

6

使用静态导入,您可以访问类的直接成员而无需完全限定它。您的静态导入允许您out直接访问,因为它是 的成员System,并且pow直接访问,因为它是Math. 但既Math没有也没有System方法printlnPrintWriter确实(的类型out)。

您的静态导入...

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

... 相当于下面的代码,我们可以看到它不会编译:

System.println("Hello World!");
于 2013-07-11T21:54:52.393 回答
5

println是属于该类out成员的方法System。没有那个限定符,Java 不知道是什么println

当您执行静态导入时,您可以访问类的成员而无需提供完全限定名称。因此,您的静态导入java.lang.System可让您访问所有内容System。这意味着您可以访问属于 的out(实例) 。但这并不意味着您可以直接访问,因为它属于. 所以你必须先通过告诉Java如何到达。PrintWriterSystemprintlnoutprintlnout

这样看。假设您具有以下结构:

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

如果您使用以下方法进行了静态导入MyClass.*

  • 您有权访问method()(Java 将其翻译为MyClass.method()
  • 您有权访问Something. (Java 将其翻译为MyClass.Something
  • 无权访问Something. 例如,您不能简单地调用methodOne(),因为 Java 会将其转换为,并且在下MyClass.methodOne()没有调用方法。那个方法属于,所以可以做,或者。methodOne()MyClassSomethingSomething.methodOne()Something.OtherThing.otherMethodOne()

如果您使用以下方法进行了静态导入MyClass.Something.*

  • 您有权访问methodOne. (Java 将其翻译为MyClass.Something.methodOne
  • 您有权访问methodTwo. (Java 将其翻译为MyClass.Something.methodTwo
  • 您有权访问OtherThing. (Java 将其翻译为MyClass.Something.OtherThing
  • 没有原始访问权限otherMethodOneotherMethodTwo;你需要做OtherThing.otherMethodOne()OtherThing.otherMethodTwo()
  • 无权访问method,因为 Java 将其转换为MyClass.Something.method,并且类中没有这样的方法Something
于 2013-07-11T21:54:57.237 回答
0

pow 是 Math 类的静态方法,因此如果您在顶部编写了 import java.lang.Math 语句,则无需创建 Math 类的对象即可访问它,另一方面 out 是 PrintStream 和 println( ) 是 PrintStream 类的一种方法,它不是静态的,因此您不能以静态方式访问它,因为如果不创建对象就无法调用非静态函数。您还可以参考此链接了解有关 PrintStream 的更多信息 http://docs.oracle.com/javase/6/docs/api/java/io/PrintStream.html

于 2013-07-11T22:03:31.037 回答