“导入”之后的“静态”修饰语是什么意思?


438

当这样使用时:

import static com.showboy.Myclass;

public class Anotherclass{}

import static com.showboy.Myclass和之间有什么区别import com.showboy.Myclass

Answers:


390

请参阅文档

静态导入声明类似于普通导入声明。正常的导入声明从包中导入类,从而允许它们在没有包限定的情况下使用,而静态导入声明从类中导入静态成员,从而允许它们在没有类限定的情况下使用。

那么什么时候应该使用静态导入呢?非常谨慎!仅当您打算以其他方式声明常量的本地副本或滥用继承(常量接口反模式)时,才使用它。换句话说,当您需要频繁访问一两个类的静态成员时,请使用它。如果您过度使用静态导入功能,它将使您的程序无法读取和不可维护,并使用您导入的所有静态成员污染其名称空间。代码的读者(包括您,在编写代码几个月后)不会知道静态成员来自哪个类。从类中导入所有静态成员可能对可读性特别有害;如果只需要一个或两个成员,则分别导入它们。适当地使用静态导入,可以使您的程序更具可读性,


28
我完全同意@xsl的上述警告。对于junit的Assert来说,绝对非常有用的一个领域是:为所有单元测试导入static org.junit.Assert。*
BxlSofty 2014年

3
-用于粘贴很长但不是很引人注目的文档文件的控件,而不是编写简单的说明。
Błażej米哈利克

@xsl帖子的下部应该放在引号中吗?看起来就像您输入的一样。
Ferrybig '16

1
@Ferrybig:这是链接文档中的引文。
约书亚·斯尼德

就像include在Ruby中一样!
Chloe

227

您声明的这两种导入之间没有区别。但是,您可以使用静态导入来允许无条件访问其他类的静态成员。我以前必须这样做的地方:

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .

我可以做这个:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .

您可以在文档中看到更多信息


57

静态导入用于导入类的静态字段/方法,而不是:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

你可以写 :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

如果您经常在代码中使用另一个类中的常量,并且静态导入不是模棱两可的,这将很有用。

顺便说一句,在您的示例中,“ import static org.example.Myclass;” 将不起作用:import用于类,import static用于类的静态成员。


37

静态导入的基本思想是,每当您使用静态类,静态变量或枚举时,都可以导入它们并避免键入。

我将举例说明。

import java.lang.Math;

class WithoutStaticImports {

 public static void main(String [] args) {
  System.out.println("round " + Math.round(1032.897));
  System.out.println("min " + Math.min(60,102));
 }
}

相同的代码,带有静态导入:

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

class WithStaticImports {
  public static void main(String [] args) {
    out.println("round " + round(1032.897));
    out.println("min " + min(60,102));
  }
}

注意:静态导入会使您的代码难以读取。


4
import static java.lang.Math没有星号写什么意思?
克里斯·米德尔顿

1
@AmadeusDrZaius不,导入静态仅适用于类的静态成员。
哈里

1
好答案!由于许多“新手”都读了这篇文章,但是应该给一点警告:不要过度使用星号来防止命名空间污染。
goerlibe

24

“导入静态com.showboy.Myclass”和“导入com.showboy.Myclass”之间的区别?

第一个应该产生编译器错误,因为静态导入仅适用于导入字段或成员类型。(假设MyClass不是showboy的内部类或成员)

我想你是说

import static com.showboy.MyClass.*;

如上所述,这使得MyClass中的所有静态字段和成员都可以在实际的编译单元中使用,而不必限定它们的数量……如上所述


14

import允许Java程序员包的接入类,而包的资格。

static import功能允许在没有课程资格的情况下访问课程的静态成员。

所述import的类提供可访问性和接口而static import提供可访问到类的静态成员。

范例:

进口

import java.lang.System.*;    
class StaticImportExample{  
    public static void main(String args[]){  

       System.out.println("Hello");
       System.out.println("Java");  

  }   
} 

静态导入

import static java.lang.System.*;    
class StaticImportExample{  
  public static void main(String args[]){  

   out.println("Hello");//Now no need of System.out  
   out.println("Java");  

 }   
} 

另请参阅:什么是Java 5中的静态导入


2

假设您在名为MyClass的包内的类中包含静态字段和方法,myPackage并且想通过键入myStaticFieldmyStaticMethod不键入每次直接访问它们, MyClass.myStaticField或者MyClass.myStaticMethod

注意:您需要执行 import myPackage.MyClassmyPackage.* 用于访问其他资源


1

之后的static修饰符import用于检索/使用类的静态字段。我使用的一个领域import static是从类中检索常量。我们还可以应用import static静态方法。确保输入正确,import static因为输入static import错误。

什么是static importJava中- JavaRevisited -一个很好的资源更多的了解import static

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.