溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java文件和Java包結(jié)構(gòu)的概念

發(fā)布時(shí)間:2021-08-31 18:43:51 來(lái)源:億速云 閱讀:149 作者:chen 欄目:編程語(yǔ)言

這篇文章主要講解了“Java文件和Java包結(jié)構(gòu)的概念”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java文件和Java包結(jié)構(gòu)的概念”吧!

Java中的包概念

Java中的包是封裝一組類(lèi),子包和接口的機(jī)制。軟件包用于:

防止命名沖突。例如,可以有兩個(gè)名稱(chēng)分別為Employee的類(lèi),college.staff.cse.Employee和college.staff.ee.Employee
更輕松地搜索/定位和使用類(lèi),接口,枚舉和注釋

提供受控訪問(wèn):受保護(hù)和默認(rèn)有包級(jí)別訪問(wèn)控制。受保護(hù)的成員可以通過(guò)同一個(gè)包及其子類(lèi)中的類(lèi)訪問(wèn)。默認(rèn)成員(沒(méi)有任何訪問(wèn)說(shuō)明符)只能由同一個(gè)包中的類(lèi)訪問(wèn)。

包可以被視為數(shù)據(jù)封裝(或數(shù)據(jù)隱藏)。

我們所需要做的就是將相關(guān)類(lèi)放入包中。之后,我們可以簡(jiǎn)單地從現(xiàn)有的軟件包中編寫(xiě)一個(gè)導(dǎo)入類(lèi),并將其用于我們的程序中。一個(gè)包是一組相關(guān)類(lèi)的容器,其中一些類(lèi)可以訪問(wèn),并且其他類(lèi)被保存用于內(nèi)部目的。
我們可以在程序中盡可能多地重用包中的現(xiàn)有類(lèi)。

為了更好地組織類(lèi),Java 提供了包機(jī)制,用于區(qū)別類(lèi)名的命名空間。

包的作用

  • 1、把功能相似或相關(guān)的類(lèi)或接口組織在同一個(gè)包中,方便類(lèi)的查找和使用。

  • 2、如同文件夾一樣,包也采用了樹(shù)形目錄的存儲(chǔ)方式。同一個(gè)包中的類(lèi)名字是不同的,不同的包中的類(lèi)的名字是可以相同的,當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類(lèi)名的類(lèi)時(shí),應(yīng)該加上包名加以區(qū)別。因此,包可以避免名字沖突。

  • 3、包也限定了訪問(wèn)權(quán)限,擁有包訪問(wèn)權(quán)限的類(lèi)才能訪問(wèn)某個(gè)包中的類(lèi)。

Java 使用包(package)這種機(jī)制是為了防止命名沖突,訪問(wèn)控制,提供搜索和定位類(lèi)(class)、接口、枚舉(enumerations)和注釋?zhuān)╝nnotation)等。

包語(yǔ)句的語(yǔ)法格式為:
package  pkg1[.pkg2[.pkg3…]];
例如,一個(gè)Something.java 文件它的內(nèi)容
package  net.java.util; public  class  Something{ ... }

那么它的路徑應(yīng)該是 net/java/util/Something.java 這樣保存的。 package(包) 的作用是把不同的 java 程序分類(lèi)保存,更方便的被其他 java 程序調(diào)用。

一個(gè)包(package)可以定義為一組相互聯(lián)系的類(lèi)型(類(lèi)、接口、枚舉和注釋?zhuān)瑸檫@些類(lèi)型提供訪問(wèn)保護(hù)和命名空間管理的功能。

以下是一些 Java 中的包:

  • java.lang-打包基礎(chǔ)的類(lèi)

  • java.io-包含輸入輸出功能的函數(shù)

開(kāi)發(fā)者可以自己把一組類(lèi)和接口等打包,并定義自己的包。而且在實(shí)際開(kāi)發(fā)中這樣做是值得提倡的,當(dāng)你自己完成類(lèi)的實(shí)現(xiàn)之后,將相關(guān)的類(lèi)分組,可以讓其他的編程者更容易地確定哪些類(lèi)、接口、枚舉和注釋等是相關(guān)的。

由于包創(chuàng)建了新的命名空間(namespace),所以不會(huì)跟其他包中的任何名字產(chǎn)生命名沖突。使用包這種機(jī)制,更容易實(shí)現(xiàn)訪問(wèn)控制,并且讓定位相關(guān)類(lèi)更加簡(jiǎn)單。


創(chuàng)建包

創(chuàng)建包的時(shí)候,你需要為這個(gè)包取一個(gè)合適的名字。之后,如果其他的一個(gè)源文件包含了這個(gè)包提供的類(lèi)、接口、枚舉或者注釋類(lèi)型的時(shí)候,都必須將這個(gè)包的聲明放在這個(gè)源文件的開(kāi)頭。

包聲明應(yīng)該在源文件的第一行,每個(gè)源文件只能有一個(gè)包聲明,這個(gè)文件中的每個(gè)類(lèi)型都應(yīng)用于它。

如果一個(gè)源文件中沒(méi)有使用包聲明,那么其中的類(lèi),函數(shù),枚舉,注釋等將被放在一個(gè)無(wú)名的包(unnamed package)中。

例子

讓我們來(lái)看一個(gè)例子,這個(gè)例子創(chuàng)建了一個(gè)叫做animals的包。通常使用小寫(xiě)的字母來(lái)命名避免與類(lèi)、接口名字的沖突。

在 animals 包中加入一個(gè)接口(interface):

Animal.java 文件代碼:

/* 文件名: Animal.java */  package  animals; interface  Animal  {  public  void  eat(); public  void  travel(); }

接下來(lái),在同一個(gè)包中加入該接口的實(shí)現(xiàn):

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(); }  }

然后,編譯這兩個(gè)文件,并把他們放在一個(gè)叫做animals的子目錄中。 用下面的命令來(lái)運(yùn)行:

<pre>$ mkdir animals
$ cp Animal.class  MammalInt.class animals
$ java animals/MammalInt  Mammal eats Mammal travel</pre>

import 關(guān)鍵字

為了能夠使用某一個(gè)包的成員,我們需要在 Java 程序中明確導(dǎo)入該包。使用 “import” 語(yǔ)句可完成此功能。

在 java 源文件中 import 語(yǔ)句應(yīng)位于 package 語(yǔ)句之后,所有類(lèi)的定義之前,可以沒(méi)有,也可以有多條,其語(yǔ)法格式為:

import  package1[.package2…].(classname|*);

如果在一個(gè)包中,一個(gè)類(lèi)想要使用本包中的另一個(gè)類(lèi),那么該包名可以省略。

例子

下面的 payroll 包已經(jīng)包含了 Employee 類(lèi),接下來(lái)向 payroll 包中添加一個(gè) Boss 類(lèi)。Boss 類(lèi)引用 Employee 類(lèi)的時(shí)候可以不用使用 payroll 前綴,Boss類(lèi)的實(shí)例如下。

Boss.java 文件代碼:

package  payroll; public  class  Boss  {  public  void  payEmployee(Employee  e)  {  e.mailCheck(); }  }

如果 Boss 類(lèi)不在 payroll 包中又會(huì)怎樣?Boss 類(lèi)必須使用下面幾種方法之一來(lái)引用其他包中的類(lèi)。

使用類(lèi)全名描述,例如:

payroll.Employee

import 關(guān)鍵字引入,使用通配符 “*”

import  payroll.*;

使用 import 關(guān)鍵字引入 Employee 類(lèi):

import  payroll.Employee;

注意:

類(lèi)文件中可以包含任意數(shù)量的 import 聲明。import 聲明必須在包聲明之后,類(lèi)聲明之前。


package 的目錄結(jié)構(gòu)

類(lèi)放在包中會(huì)有兩種主要的結(jié)果:

  • 包名成為類(lèi)名的一部分,正如我們前面討論的一樣。

  • 包名必須與相應(yīng)的字節(jié)碼所在的目錄結(jié)構(gòu)相吻合。

下面是管理你自己 java 中文件的一種簡(jiǎn)單方式:

將類(lèi)、接口等類(lèi)型的源碼放在一個(gè)文本中,這個(gè)文件的名字就是這個(gè)類(lèi)型的名字,并以.java作為擴(kuò)展名。例如:

// 文件名 : Car.java  package  vehicle; public  class  Car  {  // 類(lèi)實(shí)現(xiàn) }

接下來(lái),把源文件放在一個(gè)目錄中,這個(gè)目錄要對(duì)應(yīng)類(lèi)所在包的名字。

….\vehicle\Car.java

現(xiàn)在,正確的類(lèi)名和路徑將會(huì)是如下樣子:

  • 類(lèi)名 -> vehicle.Car

  • 路徑名 -> vehicle\Car.java (在 windows 系統(tǒng)中)

通常,一個(gè)公司使用它互聯(lián)網(wǎng)域名的顛倒形式來(lái)作為它的包名.例如:互聯(lián)網(wǎng)域名是 runoob.com,所有的包名都以 com.runoob 開(kāi)頭。包名中的每一個(gè)部分對(duì)應(yīng)一個(gè)子目錄。

例如:有一個(gè) com.runoob.test 的包,這個(gè)包包含一個(gè)叫做 Runoob.java 的源文件,那么相應(yīng)的,應(yīng)該有如下面的一連串子目錄:

….\com\runoob\test\Runoob.java

編譯的時(shí)候,編譯器為包中定義的每個(gè)類(lèi)、接口等類(lèi)型各創(chuàng)建一個(gè)不同的輸出文件,輸出文件的名字就是這個(gè)類(lèi)型的名字,并加上 .class 作為擴(kuò)展后綴。 例如:

// 文件名: Runoob.java  package  com.runoob.test; public  class  Runoob  {  }  class  Google  {  }

現(xiàn)在,我們用-d選項(xiàng)來(lái)編譯這個(gè)文件,如下:

$javac -d .  Runoob.java

這樣會(huì)像下面這樣放置編譯了的文件:

.\com\runoob\test\Runoob.class  .\com\runoob\test\Google.class

你可以像下面這樣來(lái)導(dǎo)入所有 \com\runoob\test\ 中定義的類(lèi)、接口等:

import com.runoob.test.*;

編譯之后的 .class 文件應(yīng)該和 .java 源文件一樣,它們放置的目錄應(yīng)該跟包的名字對(duì)應(yīng)起來(lái)。但是,并不要求 .class 文件的路徑跟相應(yīng)的 .java 的路徑一樣。你可以分開(kāi)來(lái)安排源碼和類(lèi)的目錄。

\sources\com\runoob\test\Runoob.java\classes\com\runoob\test\Google.class

這樣,你可以將你的類(lèi)目錄分享給其他的編程人員,而不用透露自己的源碼。用這種方法管理源碼和類(lèi)文件可以讓編譯器和java 虛擬機(jī)(JVM)可以找到你程序中使用的所有類(lèi)型。

類(lèi)目錄的絕對(duì)路徑叫做 class path。設(shè)置在系統(tǒng)變量 CLASSPATH 中。編譯器和 java 虛擬機(jī)通過(guò)將 package 名字加到 class path 后來(lái)構(gòu)造 .class 文件的路徑。

\classes 是 class path,package 名字是 com.runoob.test,而編譯器和 JVM 會(huì)在\classes\com\runoob\test 中找 .class 文件。

一個(gè) class path 可能會(huì)包含好幾個(gè)路徑,多路徑應(yīng)該用分隔符分開(kāi)。默認(rèn)情況下,編譯器和 JVM 查找當(dāng)前目錄。JAR 文件按包含 Java 平臺(tái)相關(guān)的類(lèi),所以他們的目錄默認(rèn)放在了 class path 中。


設(shè)置 CLASSPATH 系統(tǒng)變量

用下面的命令顯示當(dāng)前的CLASSPATH變量:

  • Windows 平臺(tái)(DOS 命令行下):C:> set CLASSPATH

  • UNIX 平臺(tái)(Bourne shell 下):# echo $CLASSPATH

刪除當(dāng)前CLASSPATH變量?jī)?nèi)容:

  • Windows 平臺(tái)(DOS 命令行下):C:> set CLASSPATH=

  • UNIX 平臺(tái)(Bourne shell 下):# unset CLASSPATH; export CLASSPATH

設(shè)置CLASSPATH變量:

  • Windows 平臺(tái)(DOS 命令行下): C:> set CLASSPATH=C:\users\jack\java\classes

  • UNIX 平臺(tái)(Bourne shell 下):# CLASSPATH=/home/jack/java/classes; export CLASSPATH

Java包(package)詳解
java包的作用是為了區(qū)別類(lèi)名的命名空間  

1、把功能相似或相關(guān)的類(lèi)或接口組織在同一個(gè)包中,方便類(lèi)的查找和使用。、

2、如同文件夾一樣,包也采用了樹(shù)形目錄的存儲(chǔ)方式。同一個(gè)包中的類(lèi)名字是不同的,不同的包中的類(lèi)的名字是可以相同的,

當(dāng)同時(shí)調(diào)用兩個(gè)不同包中相同類(lèi)名的類(lèi)時(shí),應(yīng)該加上包名加以區(qū)別。因此,包可以避免名字沖突。

3、包也限定了訪問(wèn)權(quán)限,擁有包訪問(wèn)權(quán)限的類(lèi)才能訪問(wèn)某個(gè)包中的類(lèi)。

創(chuàng)建包
創(chuàng)建包的時(shí)候,你需要為這個(gè)包取一個(gè)合適的名字。之后,如果其他的一個(gè)源文件包含了這個(gè)包提供的類(lèi)、接口、枚舉或者注釋類(lèi)型的時(shí)候,都必須將這個(gè)包的聲明放在這個(gè)源文件的開(kāi)頭。

包聲明應(yīng)該在源文件的第一行,每個(gè)源文件只能有一個(gè)包聲明,這個(gè)文件中的每個(gè)類(lèi)型都應(yīng)用于它。

如果一個(gè)源文件中沒(méi)有使用包聲明,那么其中的類(lèi),函數(shù),枚舉,注釋等將被放在一個(gè)無(wú)名的包(unnamed package)中。

例子
讓我們來(lái)看一個(gè)例子,這個(gè)例子創(chuàng)建了一個(gè)叫做animals的包。通常使用小寫(xiě)的字母來(lái)命名避免與類(lèi)、接口名字的沖突。

在 animals 包中加入一個(gè)接口(interface):

package animals;
interface Animal {
   public void eat();
   public void travel();
}

  接下來(lái),在同一個(gè)包中加入該接口的實(shí)現(xiàn):

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 關(guān)鍵字
為了能夠使用某一個(gè)包的成員,我們需要在 Java 程序中明確導(dǎo)入該包。使用 “import” 語(yǔ)句可完成此功能。

在 java 源文件中 import 語(yǔ)句應(yīng)位于 package 語(yǔ)句之后,所有類(lèi)的定義之前,可以沒(méi)有,也可以有多條,其語(yǔ)法格式為:

1
import package1[.package2…].(classname|*);
  如果在一個(gè)包中,一個(gè)類(lèi)想要使用本包中的另一個(gè)類(lèi),那么該包名可以省略。

通常,一個(gè)公司使用它互聯(lián)網(wǎng)域名的顛倒形式來(lái)作為它的包名.例如:互聯(lián)網(wǎng)域名是 runoob.com,所有的包名都以 com.runoob 開(kāi)頭。包名中的每一個(gè)部分對(duì)應(yīng)一個(gè)子目錄。

例如:有一個(gè) com.runoob.test 的包,這個(gè)包包含一個(gè)叫做 Runoob.java 的源文件,那么相應(yīng)的,應(yīng)該有如下面的一連串子目錄:

1
….\com\runoob\test\Runoob.java

常用jar包

java軟件包的類(lèi)型


軟件包的類(lèi)型有內(nèi)置的軟件包和用戶(hù)定義的軟件包內(nèi)置軟件包
這些軟件包由大量的類(lèi)組成,這些類(lèi)是Java API的一部分。一些常用的內(nèi)置軟件包有:

1)java.lang:包含語(yǔ)言支持類(lèi)(例如分類(lèi),用于定義基本數(shù)據(jù)類(lèi)型,數(shù)學(xué)運(yùn)算)。該軟件包會(huì)自動(dòng)導(dǎo)入。

2) java.io:包含分類(lèi)以支持輸入/輸出操作。

3) java.util:包含實(shí)現(xiàn)像鏈接列表,字典和支持等數(shù)據(jù)結(jié)構(gòu)的實(shí)用類(lèi); 用于日期/時(shí)間操作。

4) java.applet:包含用于創(chuàng)建Applets的類(lèi)。

5) java.awt:包含用于實(shí)現(xiàn)圖形用戶(hù)界面組件的類(lèi)(如按鈕,菜單等)。

6) java.net:包含支持網(wǎng)絡(luò)操作的類(lèi)。

dt.jar

SUN對(duì)于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。

中文翻譯過(guò)來(lái)就是:dt.jar是BeanInfo文件的DesignTime歸檔,BeanInfo文件用來(lái)告訴集成開(kāi)發(fā)環(huán)境(IDE)如何顯示Java組件還有如何讓開(kāi)發(fā)人員根據(jù)應(yīng)用程序自定義它們。這段文字中提到了幾個(gè)關(guān)鍵字:DesignTime,BeanInfo,IDE,Java components。其實(shí)dt.jar就是DesignTime Archive的縮寫(xiě)。那么何為DesignTime。

何為DesignTime?翻譯過(guò)來(lái)就是設(shè)計(jì)時(shí)。其實(shí)了解JavaBean的人都知道design time和runtime(運(yùn)行時(shí))這兩個(gè)術(shù)語(yǔ)的含義。設(shè)計(jì)時(shí)(DesignTIme)是指在開(kāi)發(fā)環(huán)境中通過(guò)添加控件,設(shè)置控件或窗體屬性等方法,建立應(yīng)用程序的時(shí)間。
與此相對(duì)應(yīng)的運(yùn)行時(shí)(RunTIme)是指可以象用戶(hù)那樣與應(yīng)用程序交互作用的時(shí)間。那么現(xiàn)在再理解一下上面的翻譯,其實(shí)dt.jar包含了swing控件中的BeanInfo,而IDE的GUI Designer需要這些信息。那讓我們看一下dt.jar中到底有什么?下面是一張dt.jar下面的內(nèi)容截圖:

Java文件和Java包結(jié)構(gòu)的概念

從上面的截圖可以看出,dt.jar中全部是Swing組件的BeanInfo。那么到底什么是BeanInfo呢?
何為BeanInfo?JavaBean和BeanInfo有很大的關(guān)系。Sun所制定的JavaBean規(guī)范,很大程度上是為IDE準(zhǔn)備的——它讓IDE能夠以可視化的方式設(shè)置JavaBean的屬性。如果在IDE中開(kāi)發(fā)一個(gè)可視化應(yīng)用程序,我們需要通過(guò)屬性設(shè)置的方式對(duì)組成應(yīng)用的各種組件進(jìn)行定制,IDE通過(guò)屬性編輯器讓開(kāi)發(fā)人員使用可視化的方式設(shè)置組件的屬性。
一般的IDE都支持JavaBean規(guī)范所定義的屬性編輯器,當(dāng)組件開(kāi)發(fā)商發(fā)布一個(gè)組件時(shí),它往往將組件對(duì)應(yīng)的屬性編輯器捆綁發(fā)行,這樣開(kāi)發(fā)者就可以在IDE環(huán)境下方便地利用屬性編輯器對(duì)組件進(jìn)行定制工作。JavaBean規(guī)范通過(guò)java.beans.PropertyEditor定義了設(shè)置JavaBean屬性的方法,通過(guò)BeanInfo描述了JavaBean哪些屬性是可定制的,此外還描述了可定制屬性與PropertyEditor的對(duì)應(yīng)關(guān)系。
BeanInfo與JavaBean之間的對(duì)應(yīng)關(guān)系,通過(guò)兩者之間規(guī)范的命名確立:對(duì)應(yīng)JavaBean的BeanInfo采用如下的命名規(guī)范:<Bean>BeanInfo。當(dāng)JavaBean連同其屬性編輯器相同的組件注冊(cè)到IDE中后,當(dāng)在開(kāi)發(fā)界面中對(duì)JavaBean進(jìn)行定制時(shí),IDE就會(huì)根據(jù)JavaBean規(guī)范找到對(duì)應(yīng)的BeanInfo,再根據(jù)BeanInfo中的描述信息找到JavaBean屬性描述(是否開(kāi)放、使用哪個(gè)屬性編輯器),進(jìn)而為JavaBean生成特定開(kāi)發(fā)編輯界面。
dt.jar里面主要是swing組件的BeanInfo。IDE根據(jù)這些BeanInfo顯示這些組件以及開(kāi)發(fā)人員如何定制他們。

rt.jar


rt.jar是runtime的歸檔。Java基礎(chǔ)類(lèi)庫(kù),也就是Java doc里面看到的所有的類(lèi)的class文件。

Java文件和Java包結(jié)構(gòu)的概念

rt.jar 默認(rèn)就在Root Classloader的加載路徑里面的,而在Claspath配置該變量是不需要的;同時(shí)jre/lib目錄下的其他jar:jce.jar、jsse.jar、charsets.jar、resources.jar都在Root Classloader中。

*.java文件的奧秘

*.Java文件簡(jiǎn)介

.java文件你可以認(rèn)為只是一個(gè)文本文件, 這個(gè)文件即是用java語(yǔ)言寫(xiě)成的程序,或者說(shuō)任務(wù)的代碼塊。

.class文件本質(zhì)上是一種二進(jìn)制文件, 它一般是由.java文件通過(guò) javac這個(gè)命令(jdk本身提供的工具)生成的一個(gè)文件, 而這個(gè)文件可以由jvm(java虛擬機(jī))裝載(類(lèi)裝載),然后進(jìn)java解釋執(zhí)行, 這也就是運(yùn)行你的程序。

你也可以這樣比較一下:
.java與 .c , .cpp, .asm等等文件,本質(zhì) 上一樣的, 只是用一種 語(yǔ)言來(lái)描述你要怎么去完成一件事(一個(gè)任務(wù)), 而這種語(yǔ)言 計(jì)算機(jī)本身 是沒(méi)有辦法知道是什么含義的, 它面向的只是程序員本身, 程序員可以通過(guò) 語(yǔ)言本身(語(yǔ)法) 來(lái)描述或組織這個(gè)任務(wù),這也就 是所謂的編程。

最后你當(dāng)然是需要計(jì)算機(jī)按照你的意圖來(lái)運(yùn)行你的程序, 這時(shí)候就先得有一個(gè)翻譯(編譯, 匯編, 鏈接等等復(fù)雜的過(guò)程)把它變成機(jī)器可理解的指令(這就是大家說(shuō)的機(jī)器語(yǔ)言,機(jī)器語(yǔ)言本身也是一種編程語(yǔ)言,只是程序很難寫(xiě),很難讀懂,基本上沒(méi)有辦法維護(hù))。

這里的.class文件在計(jì)算的體系結(jié)構(gòu)中本質(zhì)上對(duì)應(yīng)的是一種機(jī)器語(yǔ)言(而這里的機(jī)器叫作JVM),所以JVM本身是可以直接運(yùn)行這里的.class文件。所以 你可以進(jìn)一步地認(rèn)為,.java與.class與其它的編程語(yǔ)法一樣,它們都是程序員用來(lái)描述自己的任務(wù)的一種語(yǔ)言,只是它們面向的對(duì)象不一樣,而計(jì)算機(jī)本身只能識(shí)別它自已定義的那些指令什么的(再次強(qiáng)調(diào),這里的計(jì)算機(jī)本身沒(méi)有那么嚴(yán)格的定義)

In short:

.java是Java的源文件后綴,里面存放程序員編寫(xiě)的功能代碼。

.class文件是字節(jié)碼文件,由.java源文件通過(guò)javac命令編譯后生成的文件。是可以運(yùn)行在任何支持Java虛擬機(jī)的硬件平臺(tái)和操作系統(tǒng)上的二進(jìn)制文件。

.class文件并不本地的可執(zhí)行程序。Java虛擬機(jī)就是去運(yùn)行.class文件從而實(shí)現(xiàn)程序的運(yùn)行。

為什么一個(gè)java源文件中只能有一個(gè)public類(lèi)?

  在java編程思想(第四版)一書(shū)中有這樣3段話(6.4 類(lèi)的訪問(wèn)權(quán)限):

  1.每個(gè)編譯單元(文件)都只能有一個(gè)public類(lèi),這表示,每個(gè)編譯單元都有單一的公共接口,用public類(lèi)來(lái)表現(xiàn)。該接口可以按要求包含眾多的支持包訪問(wèn)權(quán)限的類(lèi)。如果在某個(gè)編譯單元內(nèi)有一個(gè)以上的public類(lèi),編譯器就會(huì)給出錯(cuò)誤信息。

  2.public類(lèi)的名稱(chēng)必須完全與含有該編譯單元的文件名相同,包含大小寫(xiě)。如果不匹配,同樣將得到編譯錯(cuò)誤。

  3.雖然不是很常用,但編譯單元內(nèi)完全不帶public類(lèi)也是可能的。在這種情況下,可以隨意對(duì)文件命名。

總結(jié)相關(guān)的幾個(gè)問(wèn)題:

1、一個(gè)”.java”源文件中是否可以包括多個(gè)類(lèi)(不是內(nèi)部類(lèi))?有什么限制?

??答:可以有多個(gè)類(lèi),但只能有一個(gè)public的類(lèi),并且public的類(lèi)名必須與文件名相一致。

2、為什么一個(gè)文件中只能有一個(gè)public的類(lèi)

??答:編譯器在編譯時(shí),針對(duì)一個(gè)java源代碼文件(也稱(chēng)為“編譯單元”)只會(huì)接受一個(gè)public類(lèi)。否則報(bào)錯(cuò)。

3、在java文件中是否可以沒(méi)有public類(lèi)

??答:public類(lèi)不是必須的,java文件中可以沒(méi)有public類(lèi)。

4、為什么這個(gè)public的類(lèi)的類(lèi)名必須和文件名相同

??答: 是為了方便虛擬機(jī)在相應(yīng)的路徑中找到相應(yīng)的類(lèi)所對(duì)應(yīng)的字節(jié)碼文件。

Main方法

主函數(shù):是一個(gè)特殊的函數(shù),作為程序的入口,可以被JVM調(diào)用

主函數(shù)的定義:

public:代表著該函數(shù)訪問(wèn)權(quán)限是最大的

static:代表主函數(shù)隨著類(lèi)的加載就已經(jīng)存在了

void:主函數(shù)沒(méi)有具體的返回值

main:不是關(guān)鍵字,但是一個(gè)特殊的單詞,能夠被JVM識(shí)別

(String[] args):函數(shù)的參數(shù),參數(shù)類(lèi)型是一個(gè)數(shù)組,該數(shù)組中的元素師字符串,字符串?dāng)?shù)組。main(String[] args) 字符串?dāng)?shù)組的 此時(shí)空數(shù)組的長(zhǎng)度是0,但也可以在 運(yùn)行的時(shí)候向其中傳入?yún)?shù)。

主函數(shù)時(shí)固定格式的,JVM識(shí)別

主函數(shù)可以被重載,但是JVM只識(shí)別main(String[] args),其他都是作為一般函數(shù)。這里面的args知識(shí)數(shù)組變量可以更改,其他都不能更改。

一個(gè)java文件中可以包含很多個(gè)類(lèi),每個(gè)類(lèi)中有且僅有一個(gè)主函數(shù),但是每個(gè)java文件中可以包含多個(gè)主函數(shù),在運(yùn)行時(shí),需要指定JVM入口是哪個(gè)。例如一個(gè)類(lèi)的主函數(shù)可以調(diào)用另一個(gè)類(lèi)的主函數(shù)。不一定會(huì)使用public類(lèi)的主函數(shù)。

外部類(lèi)的訪問(wèn)權(quán)限

外部類(lèi)只能用public和default修飾。

為什么要對(duì)外部類(lèi)或類(lèi)做修飾呢?

1.存在包概念:public 和 default 能區(qū)分這個(gè)外部類(lèi)能對(duì)不同包作一個(gè)劃分                       (default修飾的類(lèi),其他包中引入不了這個(gè)類(lèi),public修飾的類(lèi)才能被import)

2.protected是包內(nèi)可見(jiàn)并且子類(lèi)可見(jiàn),但是當(dāng)一個(gè)外部類(lèi)想要繼承一個(gè)protected修飾的非同包類(lèi)時(shí),壓根找不到這個(gè)類(lèi),更別提幾層了

3.private修飾的外部類(lèi),其他任何外部類(lèi)都無(wú)法導(dǎo)入它。

//Java中的文件名要和public修飾的類(lèi)名相同,否則會(huì)報(bào)錯(cuò)
//如果沒(méi)有public修飾的類(lèi),則文件可以隨意命名
public class Java中的類(lèi)文件 {
}
//非公共開(kāi)類(lèi)的訪問(wèn)權(quán)限默認(rèn)是包訪問(wèn)權(quán)限,不能用private和protected
//一個(gè)外部類(lèi)的訪問(wèn)權(quán)限只有兩種,一種是包內(nèi)可見(jiàn),一種是包外可見(jiàn)。
//如果用private修飾,其他類(lèi)根本無(wú)法看到這個(gè)類(lèi),也就沒(méi)有意義了。
//如果用protected,雖然也是包內(nèi)可見(jiàn),但是如果有子類(lèi)想要繼承該類(lèi)但是不同包時(shí),
//壓根找不到這個(gè)類(lèi),也不可能繼承它了,所以干脆用default代替。
class A{
}

Java包的命名規(guī)則

以 java.* 開(kāi)頭的是Java的核心包,所有程序都會(huì)使用這些包中的類(lèi);

以 javax. 開(kāi)頭的是擴(kuò)展包,x 是 extension 的意思,也就是擴(kuò)展。雖然 javax. 是對(duì) java. 的優(yōu)化和擴(kuò)展,但是由于 javax. 使用的越來(lái)越多,很多程序都依賴(lài)于 javax.,所以 javax. 也是核心的一部分了,也隨JDK一起發(fā)布。

以 org.* 開(kāi)頭的是各個(gè)機(jī)構(gòu)或組織發(fā)布的包,因?yàn)檫@些組織很有影響力,它們的代碼質(zhì)量很高,所以也將它們開(kāi)發(fā)的部分常用的類(lèi)隨JDK一起發(fā)布。

在包的命名方面,為了防止重名,有一個(gè)慣例:大家都以自己域名的倒寫(xiě)形式作為開(kāi)頭來(lái)為自己開(kāi)發(fā)的包命名,例如百度發(fā)布的包會(huì)以 com.baidu. 開(kāi)頭,w3c組織發(fā)布的包會(huì)以 org.w3c. 開(kāi)頭,微學(xué)苑發(fā)布的包會(huì)以 net.weixueyuan.* 開(kāi)頭……

組織機(jī)構(gòu)的域名后綴一般為 org,公司的域名后綴一般為 com,可以認(rèn)為 org. 開(kāi)頭的包為非盈利組織機(jī)構(gòu)發(fā)布的包,它們一般是開(kāi)源的,可以免費(fèi)使用在自己的產(chǎn)品中,不用考慮侵權(quán)問(wèn)題,而以 com. 開(kāi)頭的包往往由盈利性的公司發(fā)布,可能會(huì)有版權(quán)問(wèn)題,使用時(shí)要注意。

感謝各位的閱讀,以上就是“Java文件和Java包結(jié)構(gòu)的概念”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java文件和Java包結(jié)構(gòu)的概念這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI