"导入"后的"静态"修饰符是什么意思?

JSO*_*SON 427 java modifier static-import

当像这样使用时:

import static com.showboy.Myclass;

public class Anotherclass{}
Run Code Online (Sandbox Code Playgroud)

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

xsl*_*xsl 380

文档

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

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

  • 我完全同意@xsl上面的警告.其中一个非常有用的区域是junit的Assert:_import static org.junit.Assert.*_用于所有单元测试. (26认同)
  • - 用于控制粘贴很长时间而不是非常引人注目的文档文件,而不是编写简单的解释. (3认同)

Vic*_*tor 220

您声明的这两种进口产品没有区别.但是,您可以使用静态导入来允许对其他类的静态成员进行非限定访问.以前我必须这样做:

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 57

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

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}
Run Code Online (Sandbox Code Playgroud)

你可以写 :

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}
Run Code Online (Sandbox Code Playgroud)

如果您经常在代码中使用另一个类的常量并且静态导入不明确,那么它很有用.

顺便说一下,在你的例子中"import static org.example.Myclass;" 不起作用:import用于类,import static用于类的静态成员.


Rah*_*ena 35

静态导入的基本思想是,无论何时使用静态类,静态变量或枚举,都可以导入它们并保存自己的输入.

我将用例子阐述我的观点.

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));
 }
}
Run Code Online (Sandbox Code Playgroud)

相同的代码,使用静态导入:

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));
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在没有星号的情况下编写`import static java.lang.Math`是否意味着什么? (4认同)
  • @AmadeusDrZaius 不, import static 仅适用于类的静态成员。 (3认同)
  • 好答案!由于许多“新手”阅读了这篇文章,因此应该给出一个小小的警告:**不要过度使用星号** 以防止命名空间污染。 (2认同)

use*_*421 24

"import static com.showboy.Myclass"和"import com.showboy.Myclass"之间的区别?

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

我想你的意思

import static com.showboy.MyClass.*;
Run Code Online (Sandbox Code Playgroud)

这使得MyClass中的所有静态字段和成员都可以在实际编译单元中使用而无需限定它们......如上所述


roo*_*ler 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");  

  }   
} 
Run Code Online (Sandbox Code Playgroud)

使用静态导入

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");  

 }   
} 
Run Code Online (Sandbox Code Playgroud)

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