Java基礎7:關於Java類和包的那些事

a724888發表於2019-04-06


更多內容請關注微信公眾號【Java技術江湖】

這是一位阿里 Java 工程師的技術小站,作者黃小斜,專注 Java 相關技術:SSM、SpringBoot、MySQL、分散式、中介軟體、叢集、Linux、網路、多執行緒,偶爾講點Docker、ELK,同時也分享技術乾貨和學習經驗,致力於Java全棧開發!(關注公眾號後回覆”資料“即可領取 3T 免費技術學習資源以及我我原創的程式設計師校招指南、Java學習指南等資源)

**
本文主要介紹了Java外部類和包的一些基本知識

內部類與匿名內部類的文章將在後面釋出。

具體程式碼在我的GitHub中可以找到

文章首發於我的個人部落格:

<!-- more -->

*.Java檔案

問題:一個".java"原始檔中是否可以包括多個類(不是內部類)?有什麼限制?

  答案:可以有多個類,但只能有一個public的類,並且public的類名必須與檔名相一致。一個檔案中可以只有非public類,如果只有一個非public類,此類可以跟檔名不同。

為什麼一個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.  開頭的包往往由盈利性的公司釋出,可能會有版權問題,使用時要注意。

import的使用

Java import以及Java類的搜尋路徑
如果你希望使用Java包中的類,就必須先使用import語句匯入
語法為:

import package1[.package2…].classname;package 為包名,classname 為類名。例如:import java.util.Date; // 匯入 java.util 包下的 Date 類import java.util.Scanner; // 匯入 java.util 包下的 Scanner 類import javax.swing.*; // 匯入 javax.swing 包下的所有類,* 表示所有類

注意:

import 只能匯入包所包含的類,而不能匯入包。
為方便起見,我們一般不匯入單獨的類,而是匯入包下所有的類,例如 import java.util.*;。

Java 編譯器預設為所有的 Java 程式匯入了 JDK 的 java.lang 包中所有的類(import java.lang.*;),其中定義了一些常用類,如 System、String、Object、Math 等,因此我們可以直接使用這些類而不必顯式匯入。但是使用其他類必須先匯入。

前面講到的”Hello World“程式使用了System.out.println(); 語句,System 類位於 java.lang 包,雖然我們沒有顯式匯入這個包中的類,但是Java 編譯器預設已經為我們匯入了,否則程式會執行失敗。

java類的搜尋路徑
Java程式執行時要匯入相應的類,也就是載入 .class 檔案的過程。
假設有如下的 import 語句:

import p1.Test;

該語句表明要匯入 p1 包中的 Test 類。
安裝JDK時,我們已經設定了環境變數 CLASSPATH 來指明類庫的路徑,它的值為 .;%JAVA_HOME%lib,而 JAVA_HOME 又為 D:Program Filesjdk1.7.0_71,所以 CLASSPATH 等價於 .;D:Program Filesjdk1.7.0_71lib。

如果在第一個路徑下找到了所需的類檔案,則停止搜尋,否則繼續搜尋後面的路徑,如果在所有的路徑下都未能找到所需的類檔案,則編譯或執行出錯。

你可以在CLASSPATH變數中增加搜尋路徑,例如 .;%JAVA_HOME%lib;C:javalib,那麼你就可以將類檔案放在 C:javalib 目錄下,Java執行環境一樣會找到。

使用者自己寫的類可以透過IDE指定編譯後的class檔案的輸出目錄,appclassloader會到指定目錄進行類的載入

下面是一個import兩種訪問許可權的類的例項:

package com.javase.Java中的類.一個包;public class 全域性訪問 {}package com.javase.Java中的類.一個包;class 包訪問許可權 {}package com.javase.Java中的類;//import可以匯入基礎包以及公開的類,需要使用類名的全路徑//並且在匯入某個包.*時,是不會把子包的類給導進來的,這樣可以避免匯入錯誤。//注意//import com.javase.Java中的類.一個包.包訪問許可權;//這個匯入會報錯,因為這個類沒有用public修飾,無法用import匯入。import com.javase.Java中的類.一個包.全域性訪問;//可以匯入。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69906029/viewspace-2640520/,如需轉載,請註明出處,否則將追究法律責任。

相關文章