8

static导入System类时不明白关键字的含义:

import static java.lang.System.*

我正在阅读有关 Java 的书,它写在那里:

任何不使用该词的导入声明static必须以包的名称开头,并且必须以以下任一结尾:

  • 该包中的类的名称
  • 一个星号(表示该包中的所有类)

例如,声明导入 java.util.Scanner;是有效的,因为java.util它是 Java API 中包的名称,并且 Scanner是包中的类的名称java.util

这是另一个例子。该声明import javax.swing.*;是有效的,因为javax.swing它是 Java API 中包的名称,而星号指的是包中的所有类javax.swing

我有以下代码:

public class Addition {

   public static void main(String[] args) {
      double num;
      num = 100.53;

      num = num + 1000;

      // So when I want to import the whole package java.lang as written in the book, it doesn't work:
      // import java.lang.*;
      // or like this:
      // import static java.lang.*;
      // NetBeans in both cases doesn't see these abbreviated names `out` and throws errors. Why?
      out.print("The result is ");
      out.print(num);
      out.println(" .");
   }
}

当我以这种方式导入时它可以工作:

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

但是当我尝试这样做时不起作用:

import java.lang.System.out;
import java.lang.System.*

static在这种特殊情况下,关键字的含义是什么?

为什么import java.lang.*;不导入带有System类的整个包?

4

4 回答 4

13

static导入允许您编写以下代码:

out.print("The result is ");

而不是这个:

System.out.print("The result is ");

参见例如http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

于 2012-05-25T14:56:46.203 回答
2

我经常在单元测试中使用静态导入,如下所示:

import static org.junit.Assert.*;

这使我可以编写以下代码:

assertEquals(2, list.size());

而不是这段代码:

Assert.assertEquals(2, list.size());
于 2012-05-25T15:00:48.497 回答
2

静态导入是 Java 编程语言中引入的一项功能,它允许在类中定义为公共静态的成员(字段和方法)在 Java 代码中使用,而无需指定定义字段的类。此功能在 5.0 版中被引入该语言。

该功能提供了一种类型安全机制,可以将常量包含在代码中,而无需引用最初定义该字段的类。它还有助于弃用创建常量接口的做法:只定义常量的接口然后编写实现该接口的类,这被认为是对接口的不恰当使用。

当您使用 static 关键字导入时,这意味着您只是以某种方式将其插入到您的类中,并且您可以像调用自己的类的方法一样使用它的方法。

例如:

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

和 :

out.println("I have a house with an area of " + (PI * pow(2.5,2)) + " sq. cm");
于 2012-05-25T15:17:05.397 回答
1

问题:

1)当我以这种方式导入时它可以工作:

a. import static java.lang.System.out;
b. import static java.lang.System.*

但是当我尝试这样做时不起作用:

c. import java.lang.System.out;
d. import java.lang.System.*;

2)在这种特殊情况下,静态关键字的含义是什么?

3)为什么要导入java.lang.*;不导入带有 System 类的整个包?

-------------------------------------------------- ------------------------------

答案:

1) & 2)静态导入,例如(import static java.lang.System.out)用于从 System 类导入在这种特殊情况下在其他类中声明为静态的方法或字段。

a. import static java.lang.System.out; //Works because "out" is a static field
b. import static java.lang.System.*; //Works because you are importing ALL static fields and methods inside the System class

c. import java.lang.System.out; //Does NOT work because you are trying to import a static field in a non-static way. (see a.)
d. import java.lang.System.*; //Actually Works because of the * wildcard which allows you to include all imports.

您希望以静态方式导入方法或字段的主要原因是您可以省略对这些方法或字段的所有调用的类规范。所以不要写:

System.out.print("Hello");
System.out.print("World");

只写

import static java.lang.System.*   //or   import static java.lang.System.out if you only plan on using the 'out' field.
out.print("Hello");
out.print("World");

3)导入 java.lang.* 是多余的!Java 会自动隐式地为您导入这个包!:)是的,它使用它导入 System 类,但不要混淆,除非你将它作为静态导入导入,否则你仍然需要写出很长的路要走:

System.out.print("hi");
于 2016-11-16T22:26:36.047 回答