电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

詳解java中import的作用

瀏覽:7日期:2022-08-14 09:05:22
一、package

C/C++ 的 #include會把所包含的內(nèi)容在編譯時添加到程序文件中,而java的import則不同。

這里我們先了解一下Java 的 package 到底有何用處。

package名稱就像是我們的姓,而class名稱就像是我們的名字 。package和package的附屬關(guān)系用'.'來連接,這就像是復(fù)姓。比如說 java.lang.String就是復(fù)姓 java.lang,名字? String 的類別;java.io.InputStream 則是復(fù)姓 java.io,名字? InputStream的類別。

Java 會使用 package 這種機制的原因也非常明顯,就像我們?nèi)⌒彰粯?,光是一間學校的同一屆同學中,就有可能會出現(xiàn)不少同名的同學,如果不取姓的話,那學校在處理學生資料,或是同學彼此之間的稱呼,就會發(fā)生很大的困擾。相同的,全世界的 Java 類數(shù)量,恐怕比日本人還多,如果類別不使用package名稱,那在用到相同名稱的不同類時, 就會產(chǎn)生極大的困擾。所以package這種方式讓極大降低了類之間的命名沖突。

Java 的package名稱我們可以自己取,不像人的姓沒有太大的選擇 ( 所以出現(xiàn)很多同名同姓的情況 ),如果依照 Sun 的規(guī)范來取套件名稱,那理論上不同人所取的套件名稱不會相同 ( 需要的話請參閱 “命名慣例” 的相關(guān)文章 ),也就不會發(fā)生名稱沖突的情況。

可是現(xiàn)在問題來了,因?楹芏?ackage的名稱非常的長,在編程時,要使用一個類要將多個包名.類名完全寫出,會讓代碼變得冗長,減低了簡潔度。例如

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

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就讓我們可以使用

import java.lang.*;import java.io.*;

表示文件里面說到的類不是java.lang包的就是java.io包的。編譯器會幫我們選擇與類名對應(yīng)的包。

那我們可不可以再懶一點直接寫成下面聲明呢?

import java.*;

歷史告訴我們,這樣是不行的。因?檳切├啾鶚切 java.io 而不是姓 java。就像姓『諸葛』的人應(yīng)該不會喜歡你稱他?欏褐睢 先生吧。這樣寫的話只會將java包下的類聲明,而不不會聲明子包的任何類。

這里注意,java.lang包里面的類實在是太常太常太常用到了,幾乎沒有類不用它的, 所以不管你有沒有寫 import java.lang,編譯器都會自動幫你補上,也就是說編譯器只要看到?jīng)]有姓的類別,它就會自動去lang包里面查找。所以我們就不用特別去 import java.lang了。

一開始說 import 跟 #include 不同,是因為import 的功能到此?櫓梗??幌?include 一樣,會將其他java文件的內(nèi)容載入進來。import 只是讓編譯器編譯這個java文件時把沒有姓的類別加上姓,并不會把別的文件程序?qū)戇M來。你開心的話可以不使用import,只要在用到類別的時候,用它的全部姓名來稱呼它就行了(就像例子一開始那樣),這樣跟使用import功能完全一樣。

三、import的兩種導入聲明 單類型導入(single-type-import)(例:import java.util.ArrayList; ) 按需類型導入(type-import-on-demand)(例:import java.util.*;)

有如下屬性:

java以這樣兩種方式導入包中的任何一個public的類和接口(只有public類和接口才能被導入) 上面說到導入聲明僅導入聲明目錄下面的類而不導入子包,這也是為什么稱它們?yōu)轭愋蛯肼暶鞯脑颉? 導入的類或接口的簡名(simple name)具有編譯單元作用域。這表示該類型簡名可以在導入語句所在的編譯單元的任何地方使用.這并不意味著你可以使用該類型所有成員的簡名,而只能使用類型自身的簡名。例如: java.lang包中的public類都是自動導入的,包括Math和System類.但是,你不能使用它們的成員的簡名PI()和gc(),而必須使用Math.PI()和System.gc().你不需要鍵入的是java.lang.Math.PI()和java.lang.System.gc()。 程序員有時會導入當前包或java.lang包,這是不需要的,因為當前包的成員本身就在作用域內(nèi),而java.lang包是自動導入的。java編譯器會忽略這些冗余導入聲明(redundant import declarations)。即使像這樣import java.util.ArrayList;import java.util.*;多次導入,也可編譯通過。編譯器會將冗余導入聲明忽略.四、static import靜態(tài)導入

在Java程序中,是不允許定義獨立的函數(shù)和常量的。即什么屬性或者方法的使用必須依附于什么東西,例如使用類或接口作為掛靠單位才行(在類里可以掛靠各種成員,而接口里則只能掛靠常量)。

如果想要直接在程序里面不寫出其他類或接口的成員的掛靠單元,有一種變通的做法 :將所有的常量都定義到一個接口里面,然后讓需要這些常量的類實現(xiàn)這個接口(這樣的接口有一個專門的名稱,叫(“Constant Interface”)。這個方法可以工作。但是,因為這樣一來,就可以從“一個類實現(xiàn)了哪個接口”推斷出“這個類需要使用哪些常量”,有“會暴露實現(xiàn)細節(jié)”的問題。

于是J2SE 1.5里引入了“Static Import”機制,借助這一機制,可以用略掉所在的類或接口名的方式,來使用靜態(tài)成員。static import和import其中一個不一致的地方就是static import導入的是靜態(tài)成員,而import導入的是類或接口類型

如下是一個有靜態(tài)變量和靜態(tài)方法的類

package com.assignment.test;public class staticFieldsClass {static int staticNoPublicField = 0; public static int staticField = 1; public static void staticFunction(){}}

平時我們使用這些靜態(tài)成員是用類名.靜態(tài)成員的形式使用,即staticFieldsClass.staticField或者staticFieldsClass.staticFunction()。

現(xiàn)在用static import的方式:

//**精準導入**//直接導入具體的靜態(tài)變量、常量、方法方法,注意導入方法直接寫方法名不需要括號。import static com.assignment.test.StaticFieldsClass.staticField;import static com.assignment.test.StaticFieldsClass.staticFunction;//或者使用如下形式://**按需導入**不必逐一指出靜態(tài)成員名稱的導入方式//import static com.assignment.test.StaticFieldsClass.*;public class StaticTest { public static void main(String[] args) { //這里直接寫靜態(tài)成員而不需要通過類名調(diào)用System.out.println(staticField);staticFunction(); }}

這里有幾個問題需要弄清楚:

Static Import無權(quán)改變無法使用本來就不能使用的靜態(tài)成員的約束,上面例子的StaticTest和staticFieldsClass不是在同一個包下,所以StaticTest只能訪問到staticFieldsClass中public的變量。使用了Static Import也同樣如此。 導入的靜態(tài)成員和本地的靜態(tài)成員名字相同起了沖突,這種情況下的處理規(guī)則,是“本地優(yōu)先。 不同的類(接口)可以包括名稱相同的靜態(tài)成員。例如在進行Static Import的時候,出現(xiàn)了“兩個導入語句導入同名的靜態(tài)成員”的情況。在這種時候,J2SE 1.5會這樣來加以處理: 如果兩個語句都是精確導入的形式,或者都是按需導入的形式,那么會造成編譯錯誤。 如果一個語句采用精確導入的形式,一個采用按需導入的形式,那么采用精確導入的形式的一個有效。

大家都這么聰明上面的幾個特性我就不寫例子了。

static import這么叼那它有什么負面影響嗎?

答案是肯定的,去掉靜態(tài)成員前面的類型名,固然有助于在頻繁調(diào)用時顯得簡潔,但是同時也失去了關(guān)于“這個東西在哪里定義”的提示信息,理解或維護代碼就呵呵了。但是如果導入的來源很著名(比如java.lang.Math),這個問題就不那么嚴重了。

五、按需導入機制

使用按需導入聲明是否會降低Java代碼的執(zhí)行效率?

**絕對不會! **

1.import的按需導入

import 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(); }}2.static import的按需導入

import static com.assignment.test.StaticFieldsClass.*;public class StaticNeedImportTest { public static void main(String[] args) {System.out.println(staticField);staticFunction(); }}

上面StaticNeedImportTest 類編譯之后 :

//可以看出 : //1、static import的精準導入以及按需導入編譯之后都會變成import的單類型導入import com.assignment.test.StaticFieldsClass;public class StaticNeedImportTest { public static void main(String[] args) { //2、編譯之后“打回原形”,使用原來的方法調(diào)用靜態(tài)成員System.out.println(StaticFieldsClass.staticField);StaticFieldsClass.staticFunction(); }}六、附加

這是否意味著你總是可以使用按需導入聲明?**是,也不是! **

在類似Demo的非正式開發(fā)中使用按需導入聲明顯得很有用。

然而,有這四個理由讓你可以放棄這種聲明:

編譯速度:在一個很大的項目中,它們會極大的影響編譯速度.但在小型項目中使用在編譯時間上可以忽略不計。 命名沖突:解決避免命名沖突問題的答案就是使用全名。而按需導入恰恰就是使用導入聲明初衷的否定。 說明問題:畢竟高級語言的代碼是給人看的,按需導入看不出使用到的具體類型。 無名包問題:如果在編譯單元的頂部沒有包聲明,Java編譯器首選會從無名包中搜索一個類型,然后才是按需類型聲明。如果有命名沖突就會產(chǎn)生問題。

Sun的工程師一般不使用按需類型導入聲明.這你可以在他們的代碼中找到:在java.util.Properties類中的導入聲明:

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作用的詳細內(nèi)容,更多關(guān)于java中import的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 宿舍管理系统_智慧园区系统_房屋/房产管理系统_公寓管理系统 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 科研ELISA试剂盒,酶联免疫检测试剂盒,昆虫_植物ELISA酶免试剂盒-上海仁捷生物科技有限公司 | 包装机_厂家_价格-山东包装机有限公司| 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 开云(中国)Kaiyun·官方网站 - 登录入口 | 单螺旋速冻机-双螺旋-流态化-隧道式-食品速冻机厂家-广州冰泉制冷 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 骨龄仪_骨龄检测仪_儿童骨龄测试仪_品牌生产厂家【品源医疗】 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 温州中研白癜风专科_温州治疗白癜风_温州治疗白癜风医院哪家好_温州哪里治疗白癜风 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 三轴曲线机-端子插拔力试验机|华杰仪器 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 一体化污水处理设备_生活污水处理设备_全自动加药装置厂家-明基环保 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | 行星齿轮减速机,减速机厂家,山东减速机-淄博兴江机械制造 | 碳钢法兰厂家,非标法兰,定制异型,法兰生产厂家-河北九瑞管道 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | 扬尘在线监测系统_工地噪声扬尘检测仪_扬尘监测系统_贝塔射线扬尘监测设备「风途物联网科技」 | 消泡剂-水处理消泡剂-涂料消泡剂-切削液消泡剂价格-东莞德丰消泡剂厂家 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 三防漆–水性三防漆–水性浸渍漆–贝塔三防漆厂家 | 耐腐蚀泵,耐腐蚀真空泵,玻璃钢真空泵-淄博华舜耐腐蚀真空泵有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 筛分机|振动筛分机|气流筛分机|筛分机厂家-新乡市大汉振动机械有限公司 | 冷却塔厂家_冷却塔维修_冷却塔改造_凉水塔配件填料公司- 广东康明节能空调有限公司 | 电脑知识|软件|系统|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 全国国际学校排名_国际学校招生入学及学费-学校大全网 |