发发同学的博客

import static 的使用

基本介绍

Java编程思想的第三章,使用了

1
2
3
4
5
6
7
import static net.mindview.util.Print.*;
public class Assignment {
public static void main(String[] args) {
print("hello,world");
}
}

我们接着看代码的具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package net.mindview.util;
import java.io.*;
public class Print {
//为了演示,我自己加的
public static int number = 100;
// Print with a newline:
public static void print(Object obj) {
System.out.println(obj);
}
// Print a newline by itself:
public static void print() {
System.out.println();
}
// Print with no line break:
public static void printnb(Object obj) {
System.out.print(obj);
}
// The new Java SE5 printf() (from C):
public static PrintStream
printf(String format, Object... args) {
return System.out.printf(format, args);
}
}

import 这个语法大家都知道是导入包的,import static第一次见会觉得很奇怪,因为import static 是Java SE5新增加的,称之为静态导入,通过static关键字我们可以知道这是导入静态相关的功能,可以导入静态修饰的变量、常量、方法和内部类都可以导入。

使用方式

导入整个类

使用import static xxx.xxx.类名.*;这样我们在Assignment的类中可以访问Print的能够访问到的静态方法和静态成员

1
2
3
4
5
6
7
8
9
import static net.mindview.util.Print.*;
public class Assignment {
public static void main(String[] args) {
print();
print("hello,world");
print(number);
}
}

导入静态方法

使用import static xxx.xxx.类名.方法名;这样我们在Assignment的类中可以访问Print的某个静态方法,这里使用import static xxx.xxx.类名.print;来举例。值得注意的是,Print类中的print方法有重载,所以print的重载方法都可以访问

1
2
3
4
5
6
7
8
import static net.mindview.util.Print.print;
public class Assignment {
public static void main(String[] args) {
print();
print("hello,world");
}
}

导入静态成员

使用import static xxx.xxx.类名.成员;这样我们在Assignment的类中可以访问Print的某个成员,这里使用 import static xxx.xxx.类名.number;来举例。

1
2
3
4
5
6
7
import static net.mindview.util.Print.number;
public class Assignment {
public static void main(String[] args) {
number = 100;
}
}

导入静态内部类

使用import static xxx.xxx.类名.内部类;

导入系统的类

除了使用自己定义的类之外,我们一样可以使用系统的类,如下

1
2
3
4
5
6
7
8
9
10
11
12
import static java.lang.System.*;
import static java.lang.Long.*;
public class Assignment {
public static void main(String[] args) {
//System.out.println("hello");
out.println("hello");
//System.out.println(Long.MAX_VALUE);
out.println(MAX_VALUE);
}
}

注意事项

成员重名的情况

假如成员重名,会对导入的成员进行覆盖,使用当前类中的成员

方法重名的情况

假如方法重名,一样参数的方法会进行覆盖,使用当前类的方法;参数不一样的进行重载。

对于多个导入的类,有重名的会进行报错。

我们知道在Integer类和Long类中都有MAX_VALUE,当我们都一起使用静态导入的时候会报错,The field MAX_VALUE is ambiguous,意思是编译器分不清到底是谁的MAX_VALUE。

1
2
3
4
5
6
7
8
import static java.lang.Integer.*;
import static java.lang.Long.*;
public class Assignment {
public static void main(String[] args) {
System.out.println(MAX_VALUE);//error:The field MAX_VALUE is ambiguous
}
}

总结

import static这个新的语法给我们带来便利,我们可以更简短来编写代码,但是也应该多注意重名的情况。

参考链接