📜  Java中的静态导入

📅  最后修改于: 2022-05-13 01:54:40.283000             🧑  作者: Mango

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) 相比可读性较差,静态导入可以使您的程序更具可读性