1. 程式人生 > >Java基礎7:關於Java類和包的那些事

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

mod 重名 引入 java源代碼 第一個 lan 函數 org object

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

*.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 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會到指定目錄進行類的加載

下面是一個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中的類.一個包.全局訪問;//可以導入。

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