zoukankan      html  css  js  c++  java
  • java中import详解

    前言

    import与package机制相关,这里先从package入手,再讲述import以及static import的作用。

    package

    package名称就像是我们的姓,而class名称就像是我们的名字 。package和package的附属关系用”.”来连接,这就像是复姓。比如说 java.lang.String就是复姓 java.lang,名字為 String 的类别;java.io.InputStream 则是复姓 java.io,名字為 InputStream的类别。

    import

    import就是在java文件开头的地方,先说明会用到那些类别。
    接着我们就能在代码中只用类名指定某个类,也就是只称呼名字,不称呼他的姓。

    首先,在程序开头写:

    import java.lang.System;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.BufferedReader;

    于是我们就可以在程序中这样写到:

    InputStream = System.in;
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    

    一个java文件就像一个大房间,我们在门口写着在房间里面的class的姓和名字,所以在房间里面提到某个class就直接用他的名字就可以。例如:

    System 就是指 java.lang.System,而 InputStream 就是指 java.io.InputStream。

    但是如果一个java文件里面有多个同个“姓”,即包名相同的类(例如上面的InputStream,InputStreamReader,BufferedReader都是java.io中的类),我们一一写出显得比较繁杂,所以Sun就让我们可以使用

    1 import java.lang.*;
    2 import java.io.*;

    表示文件里面说到的类不是java.lang包的就是java.io包的。编译器会帮我们选择与类名对应的包。

    但是我们不可以写成:

    1 import java.*;

    因為那些类别是姓 java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 先生吧。

    这样写的话只会将java包下的类声明,而不不会声明子包的任何类。

    这里注意,java.lang包里面的类实在是太常太常太常用到了,几乎没有类不用它的, 所以不管你有没有写 import java.lang,编译器都会自动帮你补上,也就是说编译器只要看到没有姓的类别,它就会自动去lang包里面查找。所以我们就不用特别去 import java.lang了。

    import的两种导入声明

    • 单类型导入(single-type-import) 
      (例:import java.util.ArrayList; )
    • 按需类型导入(type-import-on-demand) 
      (例:import java.util.*;)

    static import静态导入

    static import和import其中一个不一致的地方就是static import导入的是静态成员,而import导入的是类或接口类型

    实例:
    如下是一个有静态变量和静态方法的类

    1 package com.assignment.test;
    2 
    3 public class staticFieldsClass {
    4     static int staticNoPublicField = 0; 
    5     public static int staticField = 1;
    6     public static void staticFunction(){}
    7 }

    平时我们使用这些静态成员是用类名.静态成员的形式使用,即staticFieldsClass.staticField或者staticFieldsClass.staticFunction()。

    现在用static import的方式:

     1 //**精准导入**
     2 //直接导入具体的静态变量、常量、方法方法,注意导入方法直接写方法名不需要括号。
     3 import static com.assignment.test.StaticFieldsClass.staticField;
     4 import static com.assignment.test.StaticFieldsClass.staticFunction;
     5 
     6 //或者使用如下形式:
     7 //**按需导入**不必逐一指出静态成员名称的导入方式
     8 //import static com.assignment.test.StaticFieldsClass.*;
     9 
    10 public class StaticTest {
    11     public static void main(String[] args) {
    12         //这里直接写静态成员而不需要通过类名调用
    13         System.out.println(staticField);
    14         staticFunction();
    15     }
    16 }

    按需导入机制

    使用按需导入声明是否会降低Java代码的执行效率?

    绝对不会!

    一、import的按需导入

    mport java.util.*;
    
    public class NeedImportTest {
        public static void main(String[] args) {
            ArrayList tList = new ArrayList();
        }
    }

    编译之后的class文件 :

    
    

    //import java.util.*被替换成import java.util.ArrayList
    //即按需导入编译过程会替换成单类型导入。
    import java.util.ArrayList;

    
    

    public class NeedImportTest {
    public static void main(String[] args) {
    new ArrayList();
    }
    }

    这是否意味着你总是可以使用按需导入声明? 
    是,也不是!

    在类似Demo的非正式开发中使用按需导入声明显得很有用。

    然而,有这四个理由让你可以放弃这种声明:

    编译速度:在一个很大的项目中,它们会极大的影响编译速度.但在小型项目中使用在编译时间上可以忽略不计。
    命名冲突:解决避免命名冲突问题的答案就是使用全名。而按需导入恰恰就是使用导入声明初衷的否定。
    说明问题:毕竟高级语言的代码是给人看的,按需导入看不出使用到的具体类型。
    无名包问题:如果在编译单元的顶部没有包声明,Java编译器首选会从无名包中搜索一个类型,然后才是按需类型声明。如果有命名冲突就会产生问题。

  • 相关阅读:
    第二阶段个人冲刺总结01
    软件工程学习进度表13
    软件工程学习进度表12
    个人博客(09)
    个人博客(07)
    个人博客(08)
    poj1562 DFS入门
    poj3278 BFS入门
    数组单步运算
    十天冲刺
  • 原文地址:https://www.cnblogs.com/colintz/p/10088166.html
Copyright © 2011-2022 走看看