Java中的静态导入
Java 1.5 版本引入了静态导入的概念。借助静态导入,我们可以直接访问类的静态成员,无需类名或任何对象。例如:我们总是使用 Math 类的 sqrt() 方法,即Math.sqrt() ,但是通过使用静态导入我们可以直接访问 sqrt() 方法。
据SUN microSystem称,它将提高代码的可读性并增强编码。但根据编程专家的说法,这会导致混乱,不利于编程。如果没有具体要求,那么我们不应该进行静态导入。
JAVA
// Java Program to illustrate
// calling of predefined methods
// without static import
class Geeks {
public static void main(String[] args)
{
System.out.println(Math.sqrt(4));
System.out.println(Math.pow(2, 2));
System.out.println(Math.abs(6.3));
}
}
JAVA
// Java Program to illustrate
// calling of predefined methods
// with static import
import static java.lang.Math.*;
class Test2 {
public static void main(String[] args)
{
System.out.println(sqrt(4));
System.out.println(pow(2, 2));
System.out.println(abs(6.3));
}
}
JAVA
// Java to illustrate calling of static member of
// System class without Class name
import static java.lang.Math.*;
import static java.lang.System.*;
class Geeks {
public static void main(String[] args)
{
// We are calling static member of System class
// directly without System class name
out.println(sqrt(4));
out.println(pow(2, 2));
out.println(abs(6.3));
}
}
JAVA
// Java program to illustrate
// ambiguity in case of
// static import
import static java.lang.Integer.*;
import static java.lang.Byte.*;
class Geeks {
public static void main(String[] args)
{
out.println(MAX_VALUE);
}
}
输出:
2.0
4.0
6.3
Java
// Java Program to illustrate
// calling of predefined methods
// with static import
import static java.lang.Math.*;
class Test2 {
public static void main(String[] args)
{
System.out.println(sqrt(4));
System.out.println(pow(2, 2));
System.out.println(abs(6.3));
}
}
输出:
2.0
4.0
6.3
Java
// Java to illustrate calling of static member of
// System class without Class name
import static java.lang.Math.*;
import static java.lang.System.*;
class Geeks {
public static void main(String[] args)
{
// We are calling static member of System class
// directly without System class name
out.println(sqrt(4));
out.println(pow(2, 2));
out.println(abs(6.3));
}
}
输出:
2.0
4.0
6.3
注意: System 是Java.lang 包中的一个类,out 是 System 类中的一个静态变量。在静态导入的帮助下,我们在没有类名的情况下调用它。
静态导入中的歧义:
如果从多个不同的类中导入两个同名的静态成员,编译器将抛出错误,因为在没有类名限定的情况下,它无法确定使用哪个成员。
Java
// Java program to illustrate
// ambiguity in case of
// static import
import static java.lang.Integer.*;
import static java.lang.Byte.*;
class Geeks {
public static void main(String[] args)
{
out.println(MAX_VALUE);
}
}
输出:
Error:Reference to MAX_VALUE is ambigious
解释:在上面的程序中,我们试图访问 MAX_VALUE 变量,但是每个原始数据类型都包含 MAX_VALUE 变量,该变量是在 Wrapper 类中预先声明的。这里我们同时导入 Integer 和 Byte 类并尝试访问静态变量 MAX_VALUE,但是这里编译器会因为看到两个导入语句而感到困惑,因为 Integer 和 Byte 类都包含一个静态变量 MAX_VALUE。因此这里编译器抛出一个错误,说Reference to MAX_VALUE is ambigious 。
注意:两个包包含两个具有相同名称的类/接口非常罕见。因此,在导入正常方式(即正常导入)时,我们很少会出现歧义。但是有可能两个类包含相同的变量,因此在静态导入中很常见的错误是引用不明确。这就是为什么如果没有这样的要求不建议使用。
导入和静态导入的区别:
- 在导入的帮助下,我们能够访问任何包中存在的类和接口。但是使用静态导入,我们可以直接访问一个类的所有静态成员(变量和方法),而无需显式调用类名。
- 主要区别在于可读性,ClassName.dataMember (System.out) 与 dataMember(out) 相比可读性较差,静态导入可以使您的程序更具可读性