1. 程式人生 > >Java基礎7——深入理解Java類與包

Java基礎7——深入理解Java類與包

java類與包

(文章部分內容轉載於How 2 Play Life

*.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.default修飾外部類(該外部類相當於被封裝在包內)
包內:該外部類出現在包內的其他類中不需要加包名;
包外:該外部類無法存在於包外的其他類中,即使導包也沒用。
2.public修飾外部類
包內:該外部類出現在包內的其他類中則不需要加包名;
包外:該外部類若想被包外的其他類中所訪問,可以在類名前面加上包名,也可以通過import關鍵字進行導包

**問題一:**修飾外部類的許可權修飾符只有 public和 default,為什麼不能是 private和 protected呢?
   外部類中的成員(成員變數、成員方法、巢狀類等)的上層結構是類,而外部類的上層結構是包。

  • 如果外部類使用private修飾,表明該包下的這個類被私有,無法被其它類訪問,那就根本談不上繼承、多型這些的特徵,因此該類也失去了存在的意義,所以不能使用private來修飾類。而且編譯也通不過:Illegal modifier for the class XXX; only public, abstract & final are permitted,意思是:非法修飾符,只允許用 public, abstract,final來修飾外部類。(final表示類不可以被繼承 ,而private則是訪問限制修飾符。)
  • 如果外部類使用protected修飾,表示該類所在的包的其它類可以訪問該類;或該類所在的包的子包的類可以訪問該類,但是包沒有繼承的概念,所以後一句是不對。所以用protected來修飾外部類也是沒有意義的

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 包下的所有類,* 表示所有類
--------------------- 
作者:How 2 Play Life 
來源:CSDN 
原文:https://blog.csdn.net/a724888/article/details/80069504 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

注意點:

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

import p1.Test;
該語句表明要匯入 p1 包中的 Test 類。
  安裝JDK時,我們已經設定了環境變數 CLASSPATH 來指明類庫的路徑,它的值為 .;%JAVA_HOME%\lib,而 JAVA_HOME 又為 D:\Program Files\jdk1.7.0_71,所以 CLASSPATH 等價於 .;D:\Program Files\jdk1.7.0_71\lib。
  如果在第一個路徑下找到了所需的類檔案,則停止搜尋,否則繼續搜尋後面的路徑,如果在所有的路徑下都未能找到所需的類檔案,則編譯或執行出錯。
  你可以在CLASSPATH變數中增加搜尋路徑,例如 .;%JAVA_HOME%\lib;C:\javalib,那麼你就可以將類檔案放在 C:\javalib 目錄下,Java執行環境一樣會找到。使用者自己寫的類可以通過IDE指定編譯後的class檔案的輸出目錄,appclassloader會到指定目錄進行類的載入。