- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解java中import的作用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C/C++ 的 #include会把所包含的内容在编译时添加到程序文件中,而java的import则不同.
这里我们先了解一下Java 的 package 到底有何用处.
package名称就像是我们的姓,而class名称就像是我们的名字 。package和package的附属关系用"."来连接,这就像是复姓。比如说 java.lang.String就是复姓 java.lang,名字為 String 的类别;java.io.InputStream 则是复姓 java.io,名字為 InputStream的类别.
Java 会使用 package 这种机制的原因也非常明显,就像我们取姓名一样 ,光是一间学校的同一届同学中,就有可能会出现不少同名的同学,如果不取姓的话,那学校在处理学生资料,或是同学彼此之间的称呼,就会发生很大的困扰。相同的,全世界的 Java 类数量,恐怕比日本人还多,如果类别不使用package名称,那在用到相同名称的不同类时, 就会产生极大的困扰。所以package这种方式让极大降低了类之间的命名冲突.
Java 的package名称我们可以自己取,不像人的姓没有太大的选择 ( 所以出现很多同名同姓的情况 ),如果依照 Sun 的规范来取套件名称,那理论上不同人所取的套件名称不会相同 ( 需要的话请参阅 “命名惯例” 的相关文章 ),也就不会发生名称冲突的情况.
可是现在问题来了,因為很多package的名称非常的长,在编程时,要使用一个类要将多个包名.类名完全写出,会让代码变得冗长,减低了简洁度。例如 。
1
2
3
|
java.io.InputStream is = java.lang.System.in;
java.io.InputStreamReader isr=
new
java.io.InputStreamReader(is);
java.io.BufferedReader br =
new
java.io.BufferedReader(isr);
|
显得非常麻烦,于是Sun公司就引入了import.
import就是在java文件开头的地方,先说明会用到那些类别。 接着我们就能在代码中只用类名指定某个类,也就是只称呼名字,不称呼他的姓.
首先,在程序开头写:
1
2
3
4
|
import
java.lang.System;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.BufferedReader;
|
于是我们就可以在程序中这样写到:
1
2
3
|
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
2
|
import
java.lang.*;
import
java.io.*;
|
表示文件里面说到的类不是java.lang包的就是java.io包的。编译器会帮我们选择与类名对应的包.
那我们可不可以再懒一点直接写成下面声明呢?
1
|
import
java.*;
|
历史告诉我们,这样是不行的。因為那些类别是姓 java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 先生吧。这样写的话只会将java包下的类声明,而不不会声明子包的任何类.
这里注意,java.lang包里面的类实在是太常太常太常用到了,几乎没有类不用它的, 所以不管你有没有写 import java.lang,编译器都会自动帮你补上,也就是说编译器只要看到没有姓的类别,它就会自动去lang包里面查找。所以我们就不用特别去 import java.lang了.
一开始说 import 跟 #include 不同,是因为import 的功能到此為止,它不像#include 一样,会将其他java文件的内容载入进来。import 只是让编译器编译这个java文件时把没有姓的类别加上姓,并不会把别的文件程序写进来。你开心的话可以不使用import,只要在用到类别的时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),这样跟使用import功能完全一样.
有如下属性:
在Java程序中,是不允许定义独立的函数和常量的。即什么属性或者方法的使用必须依附于什么东西,例如使用类或接口作为挂靠单位才行(在类里可以挂靠各种成员,而接口里则只能挂靠常量).
如果想要直接在程序里面不写出其他类或接口的成员的挂靠单元,有一种变通的做法 : 将所有的常量都定义到一个接口里面,然后让需要这些常量的类实现这个接口(这样的接口有一个专门的名称,叫(“Constant Interface”)。这个方法可以工作。但是,因为这样一来,就可以从“一个类实现了哪个接口”推断出“这个类需要使用哪些常量”,有“会暴露实现细节”的问题.
于是J2SE 1.5里引入了“Static Import”机制,借助这一机制,可以用略掉所在的类或接口名的方式,来使用静态成员。static import和import其中一个不一致的地方就是static import导入的是静态成员,而import导入的是类或接口类型.
如下是一个有静态变量和静态方法的类 。
1
2
3
4
5
6
|
package
com.assignment.test;
public
class
staticFieldsClass {
static
int
staticNoPublicField =
0
;
public
static
int
staticField =
1
;
public
static
void
staticFunction(){}
}
|
平时我们使用这些静态成员是用类名.静态成员的形式使用,即staticFieldsClass.staticField或者staticFieldsClass.staticFunction().
现在用static import的方式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//**精准导入**
//直接导入具体的静态变量、常量、方法方法,注意导入方法直接写方法名不需要括号。
import
static
com.assignment.test.StaticFieldsClass.staticField;
import
static
com.assignment.test.StaticFieldsClass.staticFunction;
//或者使用如下形式:
//**按需导入**不必逐一指出静态成员名称的导入方式
//import static com.assignment.test.StaticFieldsClass.*;
public
class
StaticTest {
public
static
void
main(String[] args) {
//这里直接写静态成员而不需要通过类名调用
System.out.println(staticField);
staticFunction();
}
}
|
这里有几个问题需要弄清楚:
大家都这么聪明上面的几个特性我就不写例子了.
static import这么叼那它有什么负面影响吗?
答案是肯定的,去掉静态成员前面的类型名,固然有助于在频繁调用时显得简洁,但是同时也失去了关于“这个东西在哪里定义”的提示信息,理解或维护代码就呵呵了。 但是如果导入的来源很著名(比如java.lang.Math),这个问题就不那么严重了.
使用按需导入声明是否会降低Java代码的执行效率?
**绝对不会! ** 。
1
2
3
4
5
6
|
import
java.util.*;
public
class
NeedImportTest {
public
static
void
main(String[] args) {
ArrayList tList =
new
ArrayList();
}
}
|
编译之后的class文件
1
2
3
4
5
6
7
8
9
|
//import java.util.*被替换成import java.util.ArrayList
//即按需导入编译过程会替换成单类型导入。
import
java.util.ArrayList;
public
class
NeedImportTest {
public
static
void
main(String[] args) {
new
ArrayList();
}
}
|
1
2
3
4
5
6
7
|
import
static
com.assignment.test.StaticFieldsClass.*;
public
class
StaticNeedImportTest {
public
static
void
main(String[] args) {
System.out.println(staticField);
staticFunction();
}
}
|
上面StaticNeedImportTest 类编译之后
1
2
3
4
5
6
7
8
9
10
11
|
//可以看出 :
//1、static import的精准导入以及按需导入编译之后都会变成import的单类型导入
import
com.assignment.test.StaticFieldsClass;
public
class
StaticNeedImportTest {
public
static
void
main(String[] args) {
//2、编译之后“打回原形”,使用原来的方法调用静态成员
System.out.println(StaticFieldsClass.staticField);
StaticFieldsClass.staticFunction();
}
}
|
这是否意味着你总是可以使用按需导入声明? **是,也不是! ** 。
在类似Demo的非正式开发中使用按需导入声明显得很有用.
然而,有这四个理由让你可以放弃这种声明
Sun的工程师一般不使用按需类型导入声明.这你可以在他们的代码中找到: 在java.util.Properties类中的导入声明
1
2
3
4
5
6
7
8
9
10
11
|
import
java.io.IOException;
import
java.io.PrintStream;
import
java.io.PrintWriter;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.io.Reader;
import
java.io.Writer;
import
java.io.OutputStreamWriter;
import
java.io.BufferedWriter;
import
java.security.AccessController;
import
java.security.PrivilegedAction;
|
可以看到他们用单类型导入详细的列出了需要的java.io包中的具体类型.
以上就是java中import作用的详细内容,更多关于java中import的资料请关注我其它相关文章! 。
原文链接:https://blog.csdn.net/qq_25665807/article/details/74747868 。
最后此篇关于详解java中import的作用的文章就讲到这里了,如果你想了解更多关于详解java中import的作用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!