微信公衆號【程序員江湖】java
做者黃小斜,斜槓青年,某985碩士,阿里研發工程師,於2018 年秋招拿到 BAT 頭條、網易、滴滴等 8 個大廠 offer程序員
我的擅長領域 :自學編程、技術校園招聘、軟件工程考研(關注公衆號後回覆」資料「便可領取 3T 免費技術學習資源)編程
問題:一個".java"源文件中是否能夠包括多個類(不是內部類)?有什麼限制?數組
答案:能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。一個文件中能夠只有非public類,若是隻有一個非public類,此類能夠跟文件名不一樣。
爲何一個java源文件中只能有一個public類?微信
在java編程思想(第四版)一書中有這樣3段話(6.4 類的訪問權限):app
1.每一個編譯單元(文件)都只能有一個public類,這表示,每一個編譯單元都有單一的公共接口,用public類來表現。該接口能夠按要求包含衆多的支持包訪問權限的類。若是在某個編譯單元內有一個以上的public類,編譯器就會給出錯誤信息。2.public類的名稱必須徹底與含有該編譯單元的文件名相同,包含大小寫。若是不匹配,一樣將獲得編譯錯誤。函數
3.雖然不是很經常使用,但編譯單元內徹底不帶public類也是可能的。在這種狀況下,能夠隨意對文件命名。學習
總結相關的幾個問題:優化
一、一個」.java」源文件中是否能夠包括多個類(不是內部類)?有什麼限制?spa
答:能夠有多個類,但只能有一個public的類,而且public的類名必須與文件名相一致。
二、爲何一個文件中只能有一個public的類
答:編譯器在編譯時,針對一個java源代碼文件(也稱爲「編譯單元」)只會接受一個public類。不然報錯。
三、在java文件中是否能夠沒有public類
答:public類不是必須的,java文件中能夠沒有public類。
四、爲何這個public的類的類名必須和文件名相同
答: 是爲了方便虛擬機在相應的路徑中找到相應的類所對應的字節碼文件。
主函數:是一個特殊的函數,做爲程序的入口,能夠被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的核心包,全部程序都會使用這些包中的類;以 javax. 開頭的是擴展包,x 是 extension 的意思,也就是擴展。雖然 javax. 是對 java. 的優化和擴展,可是因爲 javax. 使用的愈來愈多,不少程序都依賴於 javax.,因此 javax. 也是核心的一部分了,也隨JDK一塊兒發佈。
以 org.* 開頭的是各個機構或組織發佈的包,由於這些組織頗有影響力,它們的代碼質量很高,因此也將它們開發的部分經常使用的類隨JDK一塊兒發佈。
在包的命名方面,爲了防止重名,有一個慣例:你們都以本身域名的倒寫形式做爲開頭來爲本身開發的包命名,例如百度發佈的包會以 com.baidu. 開頭,w3c組織發佈的包會以 org.w3c. 開頭,微學苑發佈的包會以 net.weixueyuan.* 開頭……
組織機構的域名後綴通常爲 org,公司的域名後綴通常爲 com,能夠認爲 org. 開頭的包爲非盈利組織機構發佈的包,它們通常是開源的,能夠無償使用在本身的產品中,不用考慮侵權問題,而以 com. 開頭的包每每由盈利性的公司發佈,可能會有版權問題,使用時要注意。
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 包下的全部類,* 表示全部類
</pre>
注意:
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 來指明類庫的路徑,它的值爲 .;%JAVAHOME%lib,而 JAVAHOME 又爲 D:Program Filesjdk1.7.071,因此 CLASSPATH 等價於 .;D:Program Filesjdk1.7.071lib。若是在第一個路徑下找到了所需的類文件,則中止搜索,不然繼續搜索後面的路徑,若是在全部的路徑下都未能找到所需的類文件,則編譯或運行出錯。
你能夠在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中的類.一個包.全局訪問;//能夠導入。