java中import详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
java中import详解
前⾔
import与package机制相关,这⾥先从package⼊⼿,再讲述import以及static import的作⽤。
package
package名称就像是我们的姓,⽽class名称就像是我们的名字。
package和package的附属关系⽤”.”来连接,这就像是复姓。
⽐如说ng.String就是复姓 ng,名字為 String 的类别;java.io.InputStream 则是复姓 java.io,名字為 InputStream的类别。
import
import就是在java⽂件开头的地⽅,先说明会⽤到那些类别。
接着我们就能在代码中只⽤类名指定某个类,也就是只称呼名字,不称呼他的姓。
⾸先,在程序开头写:
import ng.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 就是指 ng.System,⽽ InputStream 就是指 java.io.InputStream。
但是如果⼀个java⽂件⾥⾯有多个同个“姓”,即包名相同的类(例如上⾯的InputStream,InputStreamReader,BufferedReader都是java.io 中的类),我们⼀⼀写出显得⽐较繁杂,所以Sun就让我们可以使⽤
1import ng.*;
2import java.io.*;
表⽰⽂件⾥⾯说到的类不是ng包的就是java.io包的。
编译器会帮我们选择与类名对应的包。
但是我们不可以写成:
1import java.*;
因為那些类别是姓 java.io ⽽不是姓 java。
就像姓『诸葛』的⼈应该不会喜欢你称他為『诸』先⽣吧。
这样写的话只会将java包下的类声明,⽽不不会声明⼦包的任何类。
这⾥注意,ng包⾥⾯的类实在是太常太常太常⽤到了,⼏乎没有类不⽤它的,所以不管你有没有写 import ng,编译器都会⾃动帮你补上,也就是说编译器只要看到没有姓的类别,它就会⾃动去lang包⾥⾯查找。
所以我们就不⽤特别去 import ng了。
import的两种导⼊声明
单类型导⼊(single-type-import)
(例:import java.util.ArrayList; )
按需类型导⼊(type-import-on-demand)
(例:import java.util.*;)
static import静态导⼊
static import和import其中⼀个不⼀致的地⽅就是static import导⼊的是静态成员,⽽import导⼊的是类或接⼝类型。
实例:
如下是⼀个有静态变量和静态⽅法的类
1package com.assignment.test;
2
3public class staticFieldsClass {
4static int staticNoPublicField = 0;
5public static int staticField = 1;
6public static void staticFunction(){}
7 }
平时我们使⽤这些静态成员是⽤类名.静态成员的形式使⽤,即staticFieldsClass.staticField或者staticFieldsClass.staticFunction()。
现在⽤static import的⽅式:
1//**精准导⼊**
2//直接导⼊具体的静态变量、常量、⽅法⽅法,注意导⼊⽅法直接写⽅法名不需要括号。
3import static com.assignment.test.StaticFieldsClass.staticField;
4import static com.assignment.test.StaticFieldsClass.staticFunction;
5
6//或者使⽤如下形式:
7//**按需导⼊**不必逐⼀指出静态成员名称的导⼊⽅式
8//import static com.assignment.test.StaticFieldsClass.*;
9
10public class StaticTest {
11public 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编译器⾸选会从⽆名包中搜索⼀个类型,然后才是按需类型声明。
如果有命名冲突就会产⽣问题。