导入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
类的整个包?
答案 0 :(得分:11)
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
答案 1 :(得分:2)
我经常在单元测试中使用静态导入,如下所示:
import static org.junit.Assert.*;
这允许我编写这段代码:
assertEquals(2, list.size());
而不是这段代码:
Assert.assertEquals(2, list.size());
答案 2 :(得分: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");
答案 3 :(得分:1)
<强>问题:强>
1)当我以这种方式导入时它会起作用:
set
但是当我尝试这样做时,它不起作用:
a. import static java.lang.System.out;
b. import static java.lang.System.*
2)在这种特殊情况下,static关键字的含义是什么?
3)为什么导入java.lang。*;不导入包含System类的整个包吗?
<强>数目:强>
1)&amp; 2)静态导入例如(import static java.lang.System.out)用于导入在其他类中声明为 static 的方法或字段在这个特殊情况下来自System类。
c. import java.lang.System.out;
d. import java.lang.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");
3)导入java.lang。*是多余的! Java会自动并隐式地为您导入此包! :),是的,它用它导入System类,但除非你把它作为静态导入导入,否则不要混淆,你仍然需要写出很长的路要走:
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");