看這里(javaAPI)來自開源中國
要學會看文檔啦 我放在這里也是為了以后自己看
學習記錄 歡迎大佬
從簡單的helloworld開始
HelloWorld.java
public class HelloWorld{
public static void main(String[] args){
System.out.println("hello world");
}
}
這篇博文關于helloworld有的東西,就是以下幾個方面
- 修飾符———public
- 類是什么——class
- 為什么main不是靜態的——static main
- 返回——void
- 局部變量,命令行參數——args
- 從源代碼到執行——(.java)
- 構造方法——只是你看不到而已啦
- 讀物之 java歷史
維基百科
- 讀物之 java歷史
- 讀物之 helloworld
各種程序語言的helloworld 來自github
helloworld全集及歷史來自圖靈社區
- 讀物之 helloworld
1:類是什么
人類 特征:兩條腿 行為: 說人話
就是這樣的,java的類也并沒有很難理解啦。把數據域(人類的特征)和方法(人類的行為)封裝在一起,也就成為了類。類和對象不分家,對象你就好比你是人類中的一員,你呢,就是人類的一個具體的實例。
java是一門面向對象的編程語言,除了基本數據類型以外,Java要求每一個數據類型必須都是一個類。
面向對象的編程思想力圖使在計算機語言中對事物的描述與現實世界中該事物的本來面目盡可能地一致,類(class)和對象(object)就是面向對象方法的核心概念。
類是對某一類事物的描述,是抽象的、概念上的定義;對象是實際存在的該類事物的個體,因而也稱實例(Instance)。類和對象就如同概念和實物之間的關系一樣,類就好比是一個模板,而對象就是該模板下的一個實例。
面向對象的主要思想是:將客觀事物看作具有狀態和行為的對象,通過抽象找出同一類對象的共同狀態和行為,構成類。
在Java當中申明類都是由class開頭的。(維基教科書
2: 修飾符
- public: 公共的,像是大自然的陽光,不同包,不同類,都可以訪問。
- protected: 被保護的,同類或其子類可以訪問,可以理解為:如果你和我是同一種的,那你可以訪問我的(如果你是它的子類,那你相對于和他同一種is-a)
- private: 私人的,私有的東西不給別人看,只有同一個class類的可以用
- 默認的 : 沒有特定指示是以上三種,那就是默認的了,同一個包,同一個類,還有其子類可以訪問。
3:靜態
當你見到static時,你就得明白,這個方法或者這個變量,是靜態的,是屬于全人類的,不是你一個人的,也不是其他人一個人的,就跟c語言的全局變量這個概念差不多啦,然而java語言是沒有全局變量這個概念的,畢竟java有垃圾回收器。
java中的static修飾的東西直接通過類名訪問,非靜態的需要創建一個實例來使用。
創建實例才能訪問的變量或方法叫做實例變量,你有多少個對象,這個東西就有多少個副本,副本之間互不影響。
被static修飾的靜態變量叫做類變量,僅僅屬于類,可以通過實例來調用,不需要一個實例也能用,也不會有副本,當子類繼承了,其父類的靜態的變量或方法也會繼承,不過它仍然不會為了子類創建一個副本,可以理解為繼承了以后,這個靜態變量或方法是父類和子類共同管理的財產,子類的它改變了,父類的它也會跟著改變。#####
靜態的不能訪問實例的,不能以任何方式引用this和super
靜態獨立于實例,那么它必須被實現了
而為什么main函數非得是靜態的呢,你想啊,程序的入口是main函數,如果不是靜態的,那得先創建一個對象去調用這個main方法,不現實,下一個。
4:返回值
返回值可以是基本數據類型,也可以是引用數據類型,也可以像main函數一樣,什么都不返回,就空著回去(void)
介紹數據類型這個我就略了,請參照維基百科數據類型
5:局部變量與命令行參數
局部變量,成員變量,類變量,靜態變量,非靜態變量,實例變量,暈哦,好多名詞
java 中的變量大致分為 成員變量 和 局部變量 兩大類。
成員變量:
在類體里面定義的變量稱為成員變量;
如果該成員變量有 static 關鍵字修飾,則該成員變量稱為 靜態變量 或 類變量;
如果該成員變量沒有 static 關鍵字修飾,則該成員變量被稱為 非靜態變量 或 實例變量。
局部變量:
形參、方法內定義的變量、代碼塊中定義的變量,都屬于局部變量。
類變量 (靜態變量)
1. 可以向前引用
2. 變量屬于類本身
3. 類變量不依賴類的實例,類變量只在初始化時候在棧內存中被分配一次空間,無論類的實例被創建幾次,都不再為類變量分配空間
4. 通過類的任意一個實例來訪問類變量,底層都將將其轉為通過類本身來訪問類變量,它們的效果是一樣的
5. 一旦類變量的值被改變,通過類或類的任意一個實例來訪問類變量,得到的都將是被改變后的值
6. 將在類的初始化之前初始化
實例變量(非靜態變量)
1. 不能向前引用,如果向前引用,則稱為非法向前引用,這是不允許的
2. 變量屬于類的實例對象
3. 隨著類的實例被創建而分配內存空間
以上引用的內容來自fanlychie
而這個helloworld的args 到底是什么呢。他是一個string對象數組,用來保存java應用程序員后所帶的參數,如同dos命令后面的那些參數
百度知道
6:運行java程序
創建完源文件后,由java編譯器(javac)編譯點java文件成點class文件,點class文件不是可以直接運行的可執行程序,他就是個字節碼文件,字節碼文件呢,java虛擬機來解釋運行(java)。編譯再加上jvm的解釋運行,所以說java是半解釋語言。
- ** 編譯時。**
創建完源文件之后,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用,這個有點象make。如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant find symbol”的錯誤。
- 注釋處理,處理所有注釋
- 詞法,語義分析
把源代碼的字符轉為標記,比如說int 轉化為一個標記。(token) - 語法樹能表示一個結構正確的源程序的抽象,但無法保證源程序是符合邏輯的。而語義分析的主要任務是讀結構上正確的源程序進行上下文有關性質的審查。語義分析過程分為標注檢查和數據及控制流分析兩個步驟:
- 標注檢查步驟檢查的內容包括諸如變量使用前是否已被聲明、變量和賦值之間的數據類型是否匹配等
- 數據及控制流分析是對程序上下文邏輯更進一步的驗證,它可以檢查出諸如程序局部變量在使用前是否有賦值、方法的每條路徑是否都有返回值、是否所有的受查異常都被正確處理了等問題。
字節碼生成
-
運行時
- java虛擬機。。。。
類加載器把類裝入java虛擬機:加載,鏈接,初始化。 - 加載:定位到相應的類 裝入。然后還要把那些類名,方法名,變量名,修飾符,方法返回類型裝入常量池。并在堆上建立一個class對象。
- 鏈接:驗證,準備,解析
- 驗證,為了計算機的安全,看看這程序有沒有害處
- 準備,為類變量分配內存,給默認值
- 解析,從類型的常量池中找到該類型的符合引用的東西,把符號引用變成直接引用
- 初始化,初始化靜態變量
- 使用
- 回收
cnblogs
- java虛擬機。。。。
構造方法
每個類都會默認有的啦,即使你覺得自己根本沒有寫,