import static和import的区别

import static静态导入是JDK1.5中的新特性。一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....ClassName.*;这里的多了个static,还有就是类名ClassName后面多了个 .* ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,而不必用ClassName.方法名 的方式来调用。 

这种方法的好处就是可以简化一些操作,例如打印操作System.out.println(...);就可以将其写入一个静态方法print(...),在使用时直接print(...)就可以了。 

但是这种方法建议在有很多重复调用的时候使用,如果仅有一到两次调用,不如直接写来的方便 

 
 
example:

在Java 5中,import语句得到了增强,以便提供甚至更加强大的减少击键次数功能,虽然一些人争议说这是以可读性为代价的。这种新的特性成为静态导入。

当你想使用static成员时,可以使用静态导入(在API中的类和你自己的类上,都可以使用该特性)。下面是静态导入前后的代码实例:

在静态导入之前:

  1. public class TestStatic { 
  2.     public static void main(String[] args) { 
  3.         System.out.println(Integer.MAX_VALUE); 
  4.         System.out.println(Integer.toHexString(42)); 
  5.     } 
  6. }
在静态导入之后:
 
  1. import static java.lang.System.out; 
  2. import static java.lang.Integer.*; 
  3.  
  4. public class TestStaticImport { 
  5.     public static void main(String[] args) { 
  6.         out.println(MAX_VALUE); 
  7.         out.println(toHexString(42)); 
  8.     } 
  9. }
两个类都产生相同的输出:
  1. 2147483647 
  2. 2a
让我们看一下使用静态导入特性的代码中将发生什么:

1、虽然该特性通常称为“静态导入”,但语法必须是import static,后面跟你想导入的static成员的完全限定名称,或者通配符。在本例中,我们在System类的out对象上进行静态导入。

2、在本例中,我们可能想使用java.lang.Integer类的几个static成员。该静态导入语句使用通配符来表达“我想在此类中的所有静态成员上进行静态导入”。

3、现在我们终于看到静态导入特性的好处!我们不必在System.out.println中键入System。太好了!另外,我们不必在Integer.MAX_VALUE中键入Integer。因此,在这行代码中,我们能够将快捷方式用于静态方法和一个常量。

4、最后,我们进行更多的快捷操作,这次针对Integer类的方法。

关于该特性,我们已经有点儿讽刺意味儿了,但不仅我们是这样的。我们不认为节省少量的击键次数会让代码难于阅读一点,但许多开发人员要求将它添加到语言中。

下面是使用静态导入的几条原则:

  • 你必须说import static, 不能说static import。
  • 提防含糊不清的命名static成员。例如,如果你对Integer类和Long类执行了静态导入,引用MAX_VALUE将导致一个编译器错误,因为Integer和Long都有一个MAX_VALUE常量,并且Java不会知道你在引用哪个MAX_VALUE。
  • 你可以在static对象引用、常量(记住,它们是static 或final)和static方法上进行静态导入。

 

import 静态成员(Static import)

在 J2SE 5.0  后新增了"import static" ,它的作用与 套件(package) 中介绍的"import"类似,都是为了让您可以省一些打字功夫,让编译器多作一点事而存在的。

"import static"是使用时的语法,国外网站上的文章或原文书中介绍这个功能时,大都用static import描述这个功能,编译器讯息也这么写,这边就还是用static import来作为原文时的描述,但为了比较彰显这个功能的作用,我称之为“import 静态成员”。

使用"import static"语法,您可以import类别或介面中的静态成员,例如来看看这个Hello! World!程式:

* HelloWorld.java

import static java.lang.System.out;

public class HelloWorld {
public static void main(String[] args) {
out.println("Hello! World!");
}
}



在这边您将java.lang.System类别中的out静态成员import至程式中,编译时编译器遇到out名称,就会自动展开为System.out,所以这还是编译器给的蜜糖(Compiler suger)。

再来看一个例子, Arrays 类别 中有很多的静态方法,为了使用方便,可使用"import static"将这些静态方法import至程式中,例如:

* UseImportStatic.java

import static java.lang.System.out;
import static java.util.Arrays.sort;

public class UseImportStatic {
public static void main(String[] args) {
int[] array = {2, 5, 3, 1, 7, 6, 8};

sort(array);

for(int i : array) {
out.print(i + " ");
}
}
}


如果您想要import类别下所有的静态成员,可以使用 '*' 字元,例如:

* UseImportStatic.java

import static java.lang.System.*;
import static java.util.Arrays.*;

public class UseImportStatic {
public static void main(String[] args) {
int[] array = {2, 5, 3, 1, 7, 6, 8};

sort(array);

for(int i : array) {
out.print(i + " ");
}
}
}


与import一样,import 静态成员(static import)这个功能是为了方便,可以让您少打一些字,您把少打的字交给编译器来判断并自动为您补上,但是您要注意名称冲突问题,有些名称冲突编译器可能透过以下的几个方法来解决:

* 成员覆盖

如果类别中有同名的field或方法名称,则优先选用它们。

* 区域变数覆盖

如果方法中有同名的变数名或引数名,则选用它们。

* 重载(Overload)方法 上的比对

对于被使用import static的各个静态成员,若有同名冲突,尝试透用重载机制判断,也就是透过方法名称及引数列的比对来选择适当的方法。


如果编译器无法判断,则会回报错误,例如若您定义的sort()方法与Arrays的sort()方法冲突,且编译器也无法判别时,会出现以下的讯息:
reference to sort is ambiguous,

both method sort(float[]) in onlyfun.caterpillar.Arrays and

method sort(float[]) in java.util.Arrays match


总之,package与类别等可以用于管理一些资源,避免同名冲突发生,而"import"与"import staic"则是反其道而行,让您可以获得一些方便,如果同名冲突发生了,这种方便性的使用就有考虑的必要了。

 

 

http://blog.sina.com.cn/s/blog_625651900100kwul.html

http://hi.baidu.com/payapple/blog/item/8105941539ef380b4b90a710.html

posted on 2013-12-26 10:51  duanxz  阅读(552)  评论(0编辑  收藏  举报