本章學習內(nèi)容
- Java 程序的基本組成部分
- 核心:理解 Java 中(幾乎)一切都是對象般此。
- Java 是 混合型語言
1. 引用操縱對象
Java 中通過操縱對象的 “引用” 來操縱內(nèi)存中的元素韩容∠可以理解為通過遙控器(引用)操縱電視(對象),只要握住遙控器校读,就能保持和電視的連接脖母。同時通過操控遙控器(引用)來簡介操控電視(引用)户魏。
另外澡刹,即使沒有電視呻征,遙控器也可單獨存在,也就是說我們可以建立一個空引用罢浇,而沒有任何一個對象與之關(guān)聯(lián)陆赋,比如通過 String s;
建立一個 String 引用,記住這只是一個引用嚷闭,而不是對象攒岛,此時向 s 發(fā)送一個消息,會發(fā)生錯誤胞锰,因為沒有可以操作的對象灾锯。
因此正常的用法是:創(chuàng)建引用的同時便進行初始化。如 String s = "hello world";
2. 對象的創(chuàng)建
(1) 一旦創(chuàng)建了一個引用嗅榕,就希望它能與一個新的對象相關(guān)聯(lián)。通常用 new 關(guān)鍵字實現(xiàn)誊册。比如上面的例子可以寫成 String s = new String("hello world");
(2) 存儲位置:
- 寄存器:速度最快领突,位于處理器內(nèi)部,數(shù)量有限案怯。無法直接控制君旦。
- 堆棧:速度僅次于寄存器,位于 RAM 中嘲碱。堆棧指針向下移動分配內(nèi)存金砍,向上移動釋放內(nèi)存。Java 系統(tǒng)需要知道存儲在堆棧內(nèi)所有項的生命周期麦锯。對象的引用 存于堆棧中恕稠。(注意! 基本類型也存于此)
- 堆:通用內(nèi)存池扶欣,位于 RAM鹅巍,用于存放所有的 Java 對象。編譯器不需要知道存儲的數(shù)據(jù)在堆里存活多長時間料祠,因此需要對象時骆捧,只需 new 一個對象,然后會自動在堆中進行存儲分配髓绽。
- 常量存儲:常量值通常直接存放在程序代碼內(nèi)部敛苇。
- 非 RAM 存儲:完全存活于程序之外的數(shù)據(jù)不受程序的任何控制。比如:流對象和持久化對象顺呕。
(3) 特例:基本類型
特殊之處:一般來說枫攀,通過 new 將對象存儲在 ”堆“中括饶;而對于基本類型,不用 new 來創(chuàng)建變量来涨,而是創(chuàng)建一個并非是引用的”自動“變量图焰。這個變量直接存儲”值“,并置于堆棧中蹦掐。
-
基本類型的大小楞泼、范圍以及包裝器如下:
基本類型 大小 最小值 最大值 包裝器類型 boolean —— —— —— Boolean char 16 bits Unicode 0 Unicode 2^16 - 1 Character byte 8 bits -128 +127 Byte short 16 -2^15 +2^15-1 Short int 32 -2^31 +2^31-1 Integer long 64 -2^63 +2^63-1 Long float 32 IEEE754 IEEEE754 Float double 64 IEEE754 IEEE754 Double void —— —— —— Void 所有數(shù)值類型都有正負號,即 不存在無符號類型
-
關(guān)于包裝器:可以通過包裝器類笤闯,在堆中創(chuàng)建一個非基本對象,用來表示對應(yīng)的基本類型:
char c = 'x'; Character ch = new Character(c); //或者如下 Character ch = new Character("x"); //也可以反向轉(zhuǎn)換 Character ch = 'x'; char c = ch;
至于包裝基本類型的原因此處沒解釋棍厂。
-
高精度數(shù)字:BigInteger 和 BigDecimal
- BigInteger 支持任意精度的整數(shù)
- BigDecimal 支持任意精度的定點數(shù)
(4) Java 中的數(shù)組
- Java 確保數(shù)組會被初始化颗味,并且不能再它的范圍之外被訪問。
- 創(chuàng)建數(shù)組時牺弹,實際上創(chuàng)建的是引用數(shù)組浦马,每個引用都會自動被初始化為一個特定值 null,表明這個引用還沒有指向某個對象张漂。使用 null 的引用會報錯晶默。
- 同時也可以創(chuàng)建用來存放基本數(shù)據(jù)類型的數(shù)組
3. 對象的銷毀
(1) 作用域 (基本類型)
作用域決定了在其內(nèi)定義的變量名的可見性和生命周期。
-
由花括號 {} 的位置決定航攒,如:
{ int x = 12; //only x available { int q = 96; //both x & q available } // only x available // q is out of scope }
作用域里定義的變量只能用于作用域結(jié)束之前磺陡。
(2) 對象的作用域
Java 對象 可以 存活 于作用域之外,而其 引用 會在作用于終點 消失漠畜。
-
帶來問題:如何防止這些存活的 Java 對象填滿內(nèi)存空間币他,進而阻塞程序?
- Java 的垃圾回收器:用來監(jiān)視用 new 創(chuàng)建的所有對象憔狞,并辨別那些不會再被引用的對象蝴悉。隨后釋放這些對象的內(nèi)存空間。簡單來說瘾敢,我們盡管創(chuàng)建對象拍冠,不需要的時候,它們會自行消失簇抵。
4. 創(chuàng)建新的數(shù)據(jù)類型:類
(1) 如何創(chuàng)建 庆杜?
通過 "class 關(guān)鍵字 + 類名" 來定義一個新的類型,如:
class TypeName{
/* class body goes here /*
}
之后就可以通過 new 來創(chuàng)建這個類型的對象正压,盡管此時它什么都不能做欣福,確切地說是在定義它的方法之前,都不能向它發(fā)送任何有意義的消息:
TypeName type = new TypeName();
(2) 字段和方法
Java 中我們所作的工作核心就是:定義類焦履,產(chǎn)生類的對象拓劝,以及發(fā)送消息給這些對象
-
類中可以設(shè)置兩種元素:字段和方法
- 字段(數(shù)據(jù)成員/成員變量):可以是任何類型的對象雏逾,可以通過其引用與其進行通信;也可以是基本類型
- 方法(成員函數(shù)):會在下一小節(jié)介紹
// 此處舉一個只有字段但無方法的類 class DataOnly{ int i; double d; boolean b; }
-
通過 “對象引用名稱 + ’.‘ + 內(nèi)部成員名稱“ 的方式來引用一個對象的成員郑临,如:
objectReference.member
栖博。該模式可用于對象的“嵌套”,即objectReference.menberObjectReference.menber
-
基本成員默認值
如果某個成員是基本數(shù)據(jù)類型,沒有進行初始化時耕肩,Java 會為其設(shè)置默認值(默認初始化)蜈膨,如下表所示:
基本類型 默認值 boolean false char '\uoooo'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d 注意:只有成員變量才會進行默認初始化,局部變量并不會進行默認初始化丧叽。而如果局部變量未經(jīng)人為初始化就進行使用,會在編譯時返回錯誤公你。
5. 方法踊淳、參數(shù)和返回值
(1) 方法
表示 “做某些事情的方式”,決定了一個對象能夠接收什么樣的信息
-
基本組成包括:名稱陕靠、參數(shù)迂尝、返回值和方法體。最基本的形式如下:
ReturnType methodName( /* Argument list */ ) { /* Method Body */ }
返回類型:調(diào)用方法之后從方法返回的值
-
參數(shù)列表:要傳給方法的信息類型和名稱
方法名和參數(shù)列表 唯一的標識出某個方法剪芥。針對以后的 重載 理解
-
方法只能作為類的一部分垄开,只有通過對象才能被調(diào)用
這句話是針對非靜態(tài) static 方法而言的
static 方法是針對類調(diào)用的,不依賴于對象
方法的調(diào)用形式:對象名 + '.' + 方法名 + 參數(shù)列表税肪,如:
objectName.methodName(arg1, arg2, arg3);
-
利用方法賦值時溉躲,需要保證返回值與對象的類型兼容
-
比如類 A 中有一個 int 類型的方法 f(),而 a 是 A 的一個對象寸认,那么就可以這樣寫
int x = a.f();
签财,將 f() 的返回值賦給 x
-
調(diào)用方法的行為通常被稱為 發(fā)送消息給對象。上面的例子中偏塞,消息是 f()唱蒸,對象是 a。
(2) 參數(shù)列表
-
指定要傳遞什么樣的信息灸叼,必須指定每個所傳遞對象的類型以及名字
- 傳遞對象時:實際上傳遞的是對象的引用
- 傳遞基本數(shù)據(jù)類型時神汹,傳遞的是值
-
舉例:
int storage(String s){ return s.length() * 2; }
該方法接收 String 為其參數(shù),參數(shù)類型是 String古今,參數(shù)名是 s屁魏。將 s 傳遞給此方法后,該方法就可以對 s 動手動腳了捉腥。
-
return 關(guān)鍵字
- 首先代表“已經(jīng)完成氓拼,離開此方法”
- 其次,如果此方法產(chǎn)生了一個值,這個值通過 return 回傳桃漾。
- 如果是 void 類型的方法坏匪,那么 return 就只是用來退出方法。
6. 構(gòu)建一個 Java 程序
(1) 名字可見性
- 為庫設(shè)置名字時采取反轉(zhuǎn)域名撬统,如 com.leanjava.whdalive 适滓。
(2) 使用其他類
-
通過 import 關(guān)鍵字導入包,即導入一個類庫恋追,如:
import java.util.ArrayList;
凭迹,也可以使用通配符 “*” 導入 util 下所有的類:import java.util.*;
(3) static 關(guān)鍵字
-
當聲明一個事物是 static 時,意味著這個域或方法不會與包含它的那個類的任何對象實例關(guān)聯(lián)在一起苦囱。所以嗅绸,及時從未創(chuàng)建某個類的任何對象,也可以調(diào)用其 static 方法或訪問其 static 域撕彤。
可以理解為 static 的方法或域是和類綁在一起的朽砰,直接通過 類 訪問。
非 static 的情況下:
當執(zhí)行 new 創(chuàng)建對象時喉刘,數(shù)據(jù)存儲空間才分配,方法才供外界調(diào)用漆弄。
-
static 成員占有單一存儲空間
-
舉例:
class StaticTest{ static int i = 47; } StaticTest st1 = new StaticTest(); StaticTest st2 = new StaticTest();
此時睦裳,st1.i 和 st2.i 指向同一存儲空間,也可以直接通過 StaticTest.i 訪問撼唾,一般建議通過 類名 訪問廉邑。
類似的,靜態(tài)方法也建議直接通過 ClassName.staticMethod() 的方式調(diào)用倒谷。
-
7. 第一個 Java 程序
叨叨了半天了蛛蒙,終于能開始寫 Java 程序了,感動不感動
直接上個例子吧:
//HelloData.java
import java.util.*;
public class HeloDate{
public static void main(String[] args){
System.out.println("Hello渤愁,it's ");
System.out.println(new Date());
}
}
解釋:
- 我們需要使用 Date 這個類牵祟,位于 Java.util 下,通過 import 引入
- public 關(guān)鍵字表示這是一個可由外部調(diào)用的方法抖格,后面會講解诺苹。
- main 方法的寫法是固定的,指明程序的入口雹拄,args 參數(shù)用來存儲命令參數(shù)收奔,此例中未用到。
- System.out.println 用來打印到控制臺滓玖,完成后換行坪哄。
8. 注釋和嵌入式文檔
(1) 注釋
- 單行注釋:// 起頭,到句末都是注釋
- 多行注釋:/* */,/* 和 */ 中間的都會被注釋掉
(2) 文檔
- 通過 Javadoc 命令
- 語法:在 /** 注釋中出現(xiàn)翩肌,結(jié)束于 */
- 嵌入式 HTML
- 標簽
9. 編碼風格
駝峰風格模暗,示例如下:
class AllTheColorsOfTheRainbow{
int anIntegerRepresentingColors;
void changeTheHueOfTheColoc(int newHue);
}
- 類名首字母大寫,每個單詞首字母均大寫
- 方法摧阅、字段等標識符的首字母小寫汰蓉,其余單詞的首字母大寫。
小結(jié)
本章的內(nèi)容也是屬于偏入門的棒卷,從對象入手介紹 Java 是如何面向?qū)ο缶幊痰墓四酢.斎灰仓皇呛唵蔚慕榻B一下,只通過這一章就能了解的非常透徹顯然是不現(xiàn)實的比规。
對于老手而言(顯然我不是)若厚,可能遺漏的絕對不是如何寫代碼,這太 low 了蜒什;還是需要了解代碼背后的思想测秸,為什么我要這么寫,這么寫有什么便利之處灾常?
看到這里霎冯,估計也能感覺的出來吧,末尾這一部分我就是完全在水了钞瀑,因為沒什么好總結(jié)的沈撞。就是一種會的依舊會,不常用的還是不太清楚雕什,需要用的時候仍然需要查閱資料(比如 javadoc 生成文檔缠俺,我重溫 Java 一時半會又不會去寫底層代碼,等到我需要的時候早忘光了好不好)贷岸。
漫漫 Java 之路壹士,共勉。