JDK 1.5新特性之静态导入

JDK 1.5新特性之静态导入

      • JDK 15新特性之静态导入
        • 概述
        • 使用
        • 静态导入需要注意的地方
        • 结论

概述

Java JDK 1.5之后增加了静态导入新特性,其中静态导入的作用是为了简化书写,静态导入的格式import static 报名.类名.静态成员,静态导入可以作用一个类的所有静态成员。

使用

静态导入有两种使用方式,见下面的代码示例:

  • 以前的导入方式:
import java.util.Collections;
class Demo{
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(13);
        list.add(9);
        list.add(10);
        list.add(17);
        Collections.sort(list);
        System.out.println("排序后的集合元素为"+list);
        System.out.println("扎到元素的索引值为:"+Collections.binarySearch(list,13));
        System.out.println("找最大值"+Collections.max(list));
    }
}

这种使用方式的缺陷是:每次在使用sort方法时必须要使用Collections.sort,这样写真的很烦,那么采用以下两种静态导入的方法,可以将所有的静态成员全部导入。

  • 改进后的导入方式
//静态导包语句
import static java.util.Collections.sort;
import static java.util.Collections.binarySearch;
import static java.util.Collections.max;
class Demo{
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(13);
        list.add(9);
        list.add(10);
        list.add(17);
        sort(list);
        System.out.println("排序后的集合元素为"+list);
        System.out.println("扎到元素的索引值为:"+binarySearch(list,13));
        System.out.println("找最大值"+max(list));
    }
}

上面的过程很繁琐,本身静态导入时为了简化书写,但是上面的写法又使整个过程变的很复杂,每次在调用静态方法时,都需要静态导入语句导入相应的近该方法,是不是一定要这么做呢?答案是否定的,可以采用下面的方式进一步简化书写。

//简化书写后的静态导包语句
import static java.util.Collections.*;
class Demo{
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(13);
        list.add(9);
        list.add(10);
        list.add(17);
        sort(list);
        System.out.println("排序后的集合元素为"+list);
        System.out.println("扎到元素的索引值为:"+binarySearch(list,13));
        ystem.out.println("找最大值"+max(list));
    }
}

静态导入需要注意的地方

在静态导入之后,可能会问一个问题,当在我自定义的类中也出现了同名的方法,此时会出现什么样的调用过程呢?是调用静态导入的方法还是调用本类中的方法呢?看下面的例子:

import static java.util.Collections.*;
class Demo{
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(13);
        list.add(9);
        list.add(10);
        list.add(17);
        sort(list); //在本类中也出现了一个同名的方法,那么究竟会怎样去调用呢?答案是调用本类的方法
        System.out.println("排序后的集合元素为"+list);
        System.out.println("扎到元素的索引值为:"+binarySearch(list,13));
        ystem.out.println("找最大值"+max(list));
    }
    public static void sort(ArrayList<Integer> list){
        System.out.println("调用本类的同名方法");
    }
}

在上面的过程中,我们分析:会调用本类的方法是因为:形式参数和调用实际参数是一致的,所以优先调用本类的方法,这样的猜测正确吗?看下面的代码:

import static java.util.Collections.*;
class Demo{
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(13);
        list.add(9);
        list.add(10);
        list.add(17);
        sort(list); //在本类中也出现了一个同名的方法,那么究竟会怎样去调用呢?答案是调用本类的方法
        System.out.println("排序后的集合元素为"+list);
        System.out.println("扎到元素的索引值为:"+binarySearch(list,13));
        ystem.out.println("找最大值"+max(list));
    }
    //本类的同名方法,但是没有参数
    public static void sort(){
        System.out.println("调用本类的同名方法");
    }
}

上面这段代码在编译时会报错,也就是说不管参数是否匹配,只要在本类中定义了同名方法,也不管是否有静态导入了同名方法,一律视而不见。

结论

静态导入新特性是在JDK 1.5之后引入的,当我们要使用在JDK中的静态成员时,我们希望能够简化书写,所以会使用静态导入的特性,但是在使用的过程中请注意:当我们自定义的类中也有一个同名的方法时,不管怎样都只会调用本类的方法,如果实参和形参不匹配,则在编译时报错

你可能感兴趣的:(java,jdk,Class)