您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java文件和Java包結構的概念”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java文件和Java包結構的概念”吧!
Java中的包是封裝一組類,子包和接口的機制。軟件包用于:
防止命名沖突。例如,可以有兩個名稱分別為Employee的類,college.staff.cse.Employee和college.staff.ee.Employee
更輕松地搜索/定位和使用類,接口,枚舉和注釋
提供受控訪問:受保護和默認有包級別訪問控制。受保護的成員可以通過同一個包及其子類中的類訪問。默認成員(沒有任何訪問說明符)只能由同一個包中的類訪問。
包可以被視為數據封裝(或數據隱藏)。
我們所需要做的就是將相關類放入包中。之后,我們可以簡單地從現有的軟件包中編寫一個導入類,并將其用于我們的程序中。一個包是一組相關類的容器,其中一些類可以訪問,并且其他類被保存用于內部目的。
我們可以在程序中盡可能多地重用包中的現有類。
為了更好地組織類,Java 提供了包機制,用于區別類名的命名空間。
1、把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。
2、如同文件夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。
3、包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
Java 使用包(package)這種機制是為了防止命名沖突,訪問控制,提供搜索和定位類(class)、接口、枚舉(enumerations)和注釋(annotation)等。
包語句的語法格式為: package pkg1[.pkg2[.pkg3…]]; 例如,一個Something.java 文件它的內容 package net.java.util; public class Something{ ... }
那么它的路徑應該是 net/java/util/Something.java 這樣保存的。 package(包) 的作用是把不同的 java 程序分類保存,更方便的被其他 java 程序調用。
一個包(package)可以定義為一組相互聯系的類型(類、接口、枚舉和注釋),為這些類型提供訪問保護和命名空間管理的功能。
以下是一些 Java 中的包:
java.lang-打包基礎的類
java.io-包含輸入輸出功能的函數
開發者可以自己把一組類和接口等打包,并定義自己的包。而且在實際開發中這樣做是值得提倡的,當你自己完成類的實現之后,將相關的類分組,可以讓其他的編程者更容易地確定哪些類、接口、枚舉和注釋等是相關的。
由于包創建了新的命名空間(namespace),所以不會跟其他包中的任何名字產生命名沖突。使用包這種機制,更容易實現訪問控制,并且讓定位相關類更加簡單。
創建包的時候,你需要為這個包取一個合適的名字。之后,如果其他的一個源文件包含了這個包提供的類、接口、枚舉或者注釋類型的時候,都必須將這個包的聲明放在這個源文件的開頭。
包聲明應該在源文件的第一行,每個源文件只能有一個包聲明,這個文件中的每個類型都應用于它。
如果一個源文件中沒有使用包聲明,那么其中的類,函數,枚舉,注釋等將被放在一個無名的包(unnamed package)中。
讓我們來看一個例子,這個例子創建了一個叫做animals的包。通常使用小寫的字母來命名避免與類、接口名字的沖突。
在 animals 包中加入一個接口(interface):
Animal.java 文件代碼:
/* 文件名: Animal.java */ package animals; interface Animal { public void eat(); public void travel(); }
接下來,在同一個包中加入該接口的實現:
MammalInt.java 文件代碼:
package animals; /* 文件名 : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
然后,編譯這兩個文件,并把他們放在一個叫做animals的子目錄中。 用下面的命令來運行:
<pre>$ mkdir animals $ cp Animal.class MammalInt.class animals $ java animals/MammalInt Mammal eats Mammal travel</pre>
為了能夠使用某一個包的成員,我們需要在 Java 程序中明確導入該包。使用 “import” 語句可完成此功能。
在 java 源文件中 import 語句應位于 package 語句之后,所有類的定義之前,可以沒有,也可以有多條,其語法格式為:
import package1[.package2…].(classname|*);
如果在一個包中,一個類想要使用本包中的另一個類,那么該包名可以省略。
下面的 payroll 包已經包含了 Employee 類,接下來向 payroll 包中添加一個 Boss 類。Boss 類引用 Employee 類的時候可以不用使用 payroll 前綴,Boss類的實例如下。
Boss.java 文件代碼:
package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }
如果 Boss 類不在 payroll 包中又會怎樣?Boss 類必須使用下面幾種方法之一來引用其他包中的類。
使用類全名描述,例如:
payroll.Employee
用 import 關鍵字引入,使用通配符 “*”
import payroll.*;
使用 import 關鍵字引入 Employee 類:
import payroll.Employee;
注意:
類文件中可以包含任意數量的 import 聲明。import 聲明必須在包聲明之后,類聲明之前。
類放在包中會有兩種主要的結果:
包名成為類名的一部分,正如我們前面討論的一樣。
包名必須與相應的字節碼所在的目錄結構相吻合。
下面是管理你自己 java 中文件的一種簡單方式:
將類、接口等類型的源碼放在一個文本中,這個文件的名字就是這個類型的名字,并以.java作為擴展名。例如:
// 文件名 : Car.java package vehicle; public class Car { // 類實現 }
接下來,把源文件放在一個目錄中,這個目錄要對應類所在包的名字。
….\vehicle\Car.java
現在,正確的類名和路徑將會是如下樣子:
類名 -> vehicle.Car
路徑名 -> vehicle\Car.java (在 windows 系統中)
通常,一個公司使用它互聯網域名的顛倒形式來作為它的包名.例如:互聯網域名是 runoob.com,所有的包名都以 com.runoob 開頭。包名中的每一個部分對應一個子目錄。
例如:有一個 com.runoob.test 的包,這個包包含一個叫做 Runoob.java 的源文件,那么相應的,應該有如下面的一連串子目錄:
….\com\runoob\test\Runoob.java
編譯的時候,編譯器為包中定義的每個類、接口等類型各創建一個不同的輸出文件,輸出文件的名字就是這個類型的名字,并加上 .class 作為擴展后綴。 例如:
// 文件名: Runoob.java package com.runoob.test; public class Runoob { } class Google { }
現在,我們用-d選項來編譯這個文件,如下:
$javac -d . Runoob.java
這樣會像下面這樣放置編譯了的文件:
.\com\runoob\test\Runoob.class .\com\runoob\test\Google.class
你可以像下面這樣來導入所有 \com\runoob\test\ 中定義的類、接口等:
import com.runoob.test.*;
編譯之后的 .class 文件應該和 .java 源文件一樣,它們放置的目錄應該跟包的名字對應起來。但是,并不要求 .class 文件的路徑跟相應的 .java 的路徑一樣。你可以分開來安排源碼和類的目錄。
\sources\com\runoob\test\Runoob.java \classes\com\runoob\test\Google.class 這樣,你可以將你的類目錄分享給其他的編程人員,而不用透露自己的源碼。用這種方法管理源碼和類文件可以讓編譯器和java 虛擬機(JVM)可以找到你程序中使用的所有類型。
類目錄的絕對路徑叫做 class path。設置在系統變量 CLASSPATH 中。編譯器和 java 虛擬機通過將 package 名字加到 class path 后來構造 .class 文件的路徑。
\classes 是 class path,package 名字是 com.runoob.test,而編譯器和 JVM 會在 \classes\com\runoob\test 中找 .class 文件。 一個 class path 可能會包含好幾個路徑,多路徑應該用分隔符分開。默認情況下,編譯器和 JVM 查找當前目錄。JAR 文件按包含 Java 平臺相關的類,所以他們的目錄默認放在了 class path 中。
設置 CLASSPATH 系統變量
用下面的命令顯示當前的CLASSPATH變量:
Windows 平臺(DOS 命令行下):C:> set CLASSPATH
UNIX 平臺(Bourne shell 下):# echo $CLASSPATH
刪除當前CLASSPATH變量內容:
Windows 平臺(DOS 命令行下):C:> set CLASSPATH=
UNIX 平臺(Bourne shell 下):# unset CLASSPATH; export CLASSPATH
設置CLASSPATH變量:
Windows 平臺(DOS 命令行下): C:> set CLASSPATH=C:\users\jack\java\classes
UNIX 平臺(Bourne shell 下):# CLASSPATH=/home/jack/java/classes; export CLASSPATH
Java包(package)詳解
java包的作用是為了區別類名的命名空間1、把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。、
2、如同文件夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,
當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。
3、包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
創建包
創建包的時候,你需要為這個包取一個合適的名字。之后,如果其他的一個源文件包含了這個包提供的類、接口、枚舉或者注釋類型的時候,都必須將這個包的聲明放在這個源文件的開頭。包聲明應該在源文件的第一行,每個源文件只能有一個包聲明,這個文件中的每個類型都應用于它。
如果一個源文件中沒有使用包聲明,那么其中的類,函數,枚舉,注釋等將被放在一個無名的包(unnamed package)中。
例子
讓我們來看一個例子,這個例子創建了一個叫做animals的包。通常使用小寫的字母來命名避免與類、接口名字的沖突。在 animals 包中加入一個接口(interface):
package animals; interface Animal { public void eat(); public void travel(); }接下來,在同一個包中加入該接口的實現:
package animals; /* 文件名 : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }import 關鍵字
為了能夠使用某一個包的成員,我們需要在 Java 程序中明確導入該包。使用 “import” 語句可完成此功能。在 java 源文件中 import 語句應位于 package 語句之后,所有類的定義之前,可以沒有,也可以有多條,其語法格式為:
1
import package1[.package2…].(classname|*);
如果在一個包中,一個類想要使用本包中的另一個類,那么該包名可以省略。通常,一個公司使用它互聯網域名的顛倒形式來作為它的包名.例如:互聯網域名是 runoob.com,所有的包名都以 com.runoob 開頭。包名中的每一個部分對應一個子目錄。
例如:有一個 com.runoob.test 的包,這個包包含一個叫做 Runoob.java 的源文件,那么相應的,應該有如下面的一連串子目錄:
1
….\com\runoob\test\Runoob.java常用jar包
java軟件包的類型
軟件包的類型有內置的軟件包和用戶定義的軟件包內置軟件包
這些軟件包由大量的類組成,這些類是Java API的一部分。一些常用的內置軟件包有:1)java.lang:包含語言支持類(例如分類,用于定義基本數據類型,數學運算)。該軟件包會自動導入。
2) java.io:包含分類以支持輸入/輸出操作。
3) java.util:包含實現像鏈接列表,字典和支持等數據結構的實用類; 用于日期/時間操作。
4) java.applet:包含用于創建Applets的類。
5) java.awt:包含用于實現圖形用戶界面組件的類(如按鈕,菜單等)。
6) java.net:包含支持網絡操作的類。
dt.jar
SUN對于dt.jar的定義:Also includes dt.jar, the DesignTime archive of BeanInfo files that tell interactive development environments (IDE’s) how to display the Java components and how to let the developer customize them for the application。
中文翻譯過來就是:dt.jar是BeanInfo文件的DesignTime歸檔,BeanInfo文件用來告訴集成開發環境(IDE)如何顯示Java組件還有如何讓開發人員根據應用程序自定義它們。這段文字中提到了幾個關鍵字:DesignTime,BeanInfo,IDE,Java components。其實dt.jar就是DesignTime Archive的縮寫。那么何為DesignTime。
何為DesignTime?翻譯過來就是設計時。其實了解JavaBean的人都知道design time和runtime(運行時)這兩個術語的含義。設計時(DesignTIme)是指在開發環境中通過添加控件,設置控件或窗體屬性等方法,建立應用程序的時間。 與此相對應的運行時(RunTIme)是指可以象用戶那樣與應用程序交互作用的時間。那么現在再理解一下上面的翻譯,其實dt.jar包含了swing控件中的BeanInfo,而IDE的GUI Designer需要這些信息。那讓我們看一下dt.jar中到底有什么?下面是一張dt.jar下面的內容截圖:從上面的截圖可以看出,dt.jar中全部是Swing組件的BeanInfo。那么到底什么是BeanInfo呢? 何為BeanInfo?JavaBean和BeanInfo有很大的關系。Sun所制定的JavaBean規范,很大程度上是為IDE準備的——它讓IDE能夠以可視化的方式設置JavaBean的屬性。如果在IDE中開發一個可視化應用程序,我們需要通過屬性設置的方式對組成應用的各種組件進行定制,IDE通過屬性編輯器讓開發人員使用可視化的方式設置組件的屬性。 一般的IDE都支持JavaBean規范所定義的屬性編輯器,當組件開發商發布一個組件時,它往往將組件對應的屬性編輯器捆綁發行,這樣開發者就可以在IDE環境下方便地利用屬性編輯器對組件進行定制工作。JavaBean規范通過java.beans.PropertyEditor定義了設置JavaBean屬性的方法,通過BeanInfo描述了JavaBean哪些屬性是可定制的,此外還描述了可定制屬性與PropertyEditor的對應關系。 BeanInfo與JavaBean之間的對應關系,通過兩者之間規范的命名確立:對應JavaBean的BeanInfo采用如下的命名規范:<Bean>BeanInfo。當JavaBean連同其屬性編輯器相同的組件注冊到IDE中后,當在開發界面中對JavaBean進行定制時,IDE就會根據JavaBean規范找到對應的BeanInfo,再根據BeanInfo中的描述信息找到JavaBean屬性描述(是否開放、使用哪個屬性編輯器),進而為JavaBean生成特定開發編輯界面。 dt.jar里面主要是swing組件的BeanInfo。IDE根據這些BeanInfo顯示這些組件以及開發人員如何定制他們。rt.jar
rt.jar是runtime的歸檔。Java基礎類庫,也就是Java doc里面看到的所有的類的class文件。
rt.jar 默認就在Root Classloader的加載路徑里面的,而在Claspath配置該變量是不需要的;同時jre/lib目錄下的其他jar:jce.jar、jsse.jar、charsets.jar、resources.jar都在Root Classloader中。
*.java文件的奧秘
*.Java文件簡介
.java文件你可以認為只是一個文本文件, 這個文件即是用java語言寫成的程序,或者說任務的代碼塊。
.class文件本質上是一種二進制文件, 它一般是由.java文件通過 javac這個命令(jdk本身提供的工具)生成的一個文件, 而這個文件可以由jvm(java虛擬機)裝載(類裝載),然后進java解釋執行, 這也就是運行你的程序。
你也可以這樣比較一下:
.java與 .c , .cpp, .asm等等文件,本質 上一樣的, 只是用一種 語言來描述你要怎么去完成一件事(一個任務), 而這種語言 計算機本身 是沒有辦法知道是什么含義的, 它面向的只是程序員本身, 程序員可以通過 語言本身(語法) 來描述或組織這個任務,這也就 是所謂的編程。最后你當然是需要計算機按照你的意圖來運行你的程序, 這時候就先得有一個翻譯(編譯, 匯編, 鏈接等等復雜的過程)把它變成機器可理解的指令(這就是大家說的機器語言,機器語言本身也是一種編程語言,只是程序很難寫,很難讀懂,基本上沒有辦法維護)。
這里的.class文件在計算的體系結構中本質上對應的是一種機器語言(而這里的機器叫作JVM),所以JVM本身是可以直接運行這里的.class文件。所以 你可以進一步地認為,.java與.class與其它的編程語法一樣,它們都是程序員用來描述自己的任務的一種語言,只是它們面向的對象不一樣,而計算機本身只能識別它自已定義的那些指令什么的(再次強調,這里的計算機本身沒有那么嚴格的定義)
In short:
.java是Java的源文件后綴,里面存放程序員編寫的功能代碼。
.class文件是字節碼文件,由.java源文件通過javac命令編譯后生成的文件。是可以運行在任何支持Java虛擬機的硬件平臺和操作系統上的二進制文件。
.class文件并不本地的可執行程序。Java虛擬機就是去運行.class文件從而實現程序的運行。
為什么一個java源文件中只能有一個public類?
在java編程思想(第四版)一書中有這樣3段話(6.4 類的訪問權限):
1.每個編譯單元(文件)都只能有一個public類,這表示,每個編譯單元都有單一的公共接口,用public類來表現。該接口可以按要求包含眾多的支持包訪問權限的類。如果在某個編譯單元內有一個以上的public類,編譯器就會給出錯誤信息。
2.public類的名稱必須完全與含有該編譯單元的文件名相同,包含大小寫。如果不匹配,同樣將得到編譯錯誤。
3.雖然不是很常用,但編譯單元內完全不帶public類也是可能的。在這種情況下,可以隨意對文件命名。
總結相關的幾個問題:
1、一個”.java”源文件中是否可以包括多個類(不是內部類)?有什么限制?
??答:可以有多個類,但只能有一個public的類,并且public的類名必須與文件名相一致。
2、為什么一個文件中只能有一個public的類
??答:編譯器在編譯時,針對一個java源代碼文件(也稱為“編譯單元”)只會接受一個public類。否則報錯。
3、在java文件中是否可以沒有public類
??答:public類不是必須的,java文件中可以沒有public類。
4、為什么這個public的類的類名必須和文件名相同
??答: 是為了方便虛擬機在相應的路徑中找到相應的類所對應的字節碼文件。
Main方法
主函數:是一個特殊的函數,作為程序的入口,可以被JVM調用
主函數的定義:
public:代表著該函數訪問權限是最大的
static:代表主函數隨著類的加載就已經存在了
void:主函數沒有具體的返回值
main:不是關鍵字,但是一個特殊的單詞,能夠被JVM識別
(String[] args):函數的參數,參數類型是一個數組,該數組中的元素師字符串,字符串數組。main(String[] args) 字符串數組的 此時空數組的長度是0,但也可以在 運行的時候向其中傳入參數。
主函數時固定格式的,JVM識別
主函數可以被重載,但是JVM只識別main(String[] args),其他都是作為一般函數。這里面的args知識數組變量可以更改,其他都不能更改。
一個java文件中可以包含很多個類,每個類中有且僅有一個主函數,但是每個java文件中可以包含多個主函數,在運行時,需要指定JVM入口是哪個。例如一個類的主函數可以調用另一個類的主函數。不一定會使用public類的主函數。
外部類的訪問權限
外部類只能用public和default修飾。
為什么要對外部類或類做修飾呢?
1.存在包概念:public 和 default 能區分這個外部類能對不同包作一個劃分 (default修飾的類,其他包中引入不了這個類,public修飾的類才能被import)
2.protected是包內可見并且子類可見,但是當一個外部類想要繼承一個protected修飾的非同包類時,壓根找不到這個類,更別提幾層了
3.private修飾的外部類,其他任何外部類都無法導入它。
//Java中的文件名要和public修飾的類名相同,否則會報錯 //如果沒有public修飾的類,則文件可以隨意命名 public class Java中的類文件 { } //非公共開類的訪問權限默認是包訪問權限,不能用private和protected //一個外部類的訪問權限只有兩種,一種是包內可見,一種是包外可見。 //如果用private修飾,其他類根本無法看到這個類,也就沒有意義了。 //如果用protected,雖然也是包內可見,但是如果有子類想要繼承該類但是不同包時, //壓根找不到這個類,也不可能繼承它了,所以干脆用default代替。 class A{ }Java包的命名規則
以 java.* 開頭的是Java的核心包,所有程序都會使用這些包中的類;
以 javax. 開頭的是擴展包,x 是 extension 的意思,也就是擴展。雖然 javax. 是對 java. 的優化和擴展,但是由于 javax. 使用的越來越多,很多程序都依賴于 javax.,所以 javax. 也是核心的一部分了,也隨JDK一起發布。
以 org.* 開頭的是各個機構或組織發布的包,因為這些組織很有影響力,它們的代碼質量很高,所以也將它們開發的部分常用的類隨JDK一起發布。
在包的命名方面,為了防止重名,有一個慣例:大家都以自己域名的倒寫形式作為開頭來為自己開發的包命名,例如百度發布的包會以 com.baidu. 開頭,w3c組織發布的包會以 org.w3c. 開頭,微學苑發布的包會以 net.weixueyuan.* 開頭……
組織機構的域名后綴一般為 org,公司的域名后綴一般為 com,可以認為 org. 開頭的包為非盈利組織機構發布的包,它們一般是開源的,可以免費使用在自己的產品中,不用考慮侵權問題,而以 com. 開頭的包往往由盈利性的公司發布,可能會有版權問題,使用時要注意。
感謝各位的閱讀,以上就是“Java文件和Java包結構的概念”的內容了,經過本文的學習后,相信大家對Java文件和Java包結構的概念這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。