如果我們說另一種不同的語(yǔ)言鉴嗤,我們會(huì)發(fā)現(xiàn)另一個(gè)不同的世界
2.1 用引用來操作對(duì)象
每個(gè)語(yǔ)言都有自己操縱內(nèi)存元素的方式?
在c c++中程序猿使用指針來來操作內(nèi)存中的對(duì)象 ?
而java中使用引用來操作對(duì)象 ?但是引用并不是對(duì)象 而是指向?qū)ο?
對(duì)象是電視 那么 引用就是遙控器 ?我們可以通過遙控器來控制電視 同樣java中我們可以通過引用來控制對(duì)象
電視 和 遙控器 都可以獨(dú)立存在 ?所以你擁有一個(gè)引用并不代表 要有一個(gè)對(duì)象與之管理
例如 String ?A 斩启; 我們只創(chuàng)建了一個(gè)引用 ?由于他沒有對(duì)象無(wú)法通過 向A發(fā)送消息執(zhí)任何行為 如果我們這么做就會(huì)收到錯(cuò)誤提示
2.2 必須由你來創(chuàng)建對(duì)象
java 中使用 new 字來創(chuàng)建新對(duì)象
String a = new String(“sdfsdf”); ?//這種狀態(tài)下引用和對(duì)象進(jìn)行了關(guān)聯(lián) ?事實(shí)上 java 創(chuàng)建了引用就應(yīng)該讓引用于對(duì)象關(guān)聯(lián)醉锅,即初始化引用
對(duì)象在內(nèi)存中的存儲(chǔ)
1.寄存器:最快的存儲(chǔ)區(qū)域 位于CPU內(nèi)部兔簇,空間有限,按照需求進(jìn)行存儲(chǔ)硬耍,我們無(wú)法控制男韧,在程序運(yùn)行時(shí)無(wú)法感知到它的存在。
2.堆棧:位于RAM(隨機(jī)訪問存儲(chǔ)器)中默垄,通過堆棧指針可以從處理器那里獲得直接支持。堆棧指針向下移動(dòng)則分配新的內(nèi)存甚纲,向上移動(dòng)則釋放這些內(nèi)存口锭。這是一種快速有效的分配存儲(chǔ),效率僅次于寄存器介杆。但是在程序執(zhí)行時(shí)鹃操,必須嚴(yán)格的知堆棧站內(nèi)所有對(duì)象的生命周期,以來控制堆棧指針的移動(dòng)春哨,以便維護(hù)堆椌0控制對(duì)象資源的釋放(c c++ 使用該策略執(zhí)行進(jìn)行資源的控制)....?java為了程序的靈活性,放棄了該做法赴背,在java中堆棧用來存儲(chǔ)對(duì)象的引用 并不存放對(duì)象
3.堆:位于RAM中椰拒,一種通用的內(nèi)存池晶渠,用于存放所有的java對(duì)象。堆的好處在于:編譯器不需要知道存儲(chǔ)的數(shù)據(jù)在堆里的生命周期燃观,因此褒脯,在堆分配存儲(chǔ)具有很強(qiáng)的靈活性。需要?jiǎng)?chuàng)建對(duì)象只需要new 關(guān)鍵字就能在堆里面進(jìn)行存儲(chǔ)分配 ?缺點(diǎn):存儲(chǔ)和分配,清理的速度較慢相對(duì)于堆棧存儲(chǔ)(GC負(fù)責(zé)清理對(duì)象資源)
4.常量存儲(chǔ):常量值直接放在程序代碼內(nèi)部缆毁。 因?yàn)樗肋h(yuǎn)不會(huì)改變...有時(shí)在嵌入式系統(tǒng)中番川,常量本身會(huì)與其他部分分離,所以在這種情況下脊框,可以選擇存放在ROM中(比如常量池)
5.非RAM存儲(chǔ): 流對(duì)象 持久化 ?數(shù)據(jù)庫(kù)啥的
2.2.2 基本類型
對(duì)于基本類型 java使用的不是new出對(duì)象放在堆里 而是 學(xué)習(xí)c c++相同的方法 創(chuàng)建一個(gè)非引用的"自動(dòng)常量"颁督,這個(gè)常量直接存儲(chǔ)“值”,并置于堆棧中浇雹,因此更加高效
基本類型具有包裝類 ?使得可以在堆中創(chuàng)建一個(gè)非基本對(duì)象 沉御,來表示基本類型?
char c = “x”;
Character ch = new ?Character(“x”)箫爷;
ch = “x” ? //自動(dòng)裝箱
c = ch //自動(dòng)拆箱
高精度數(shù)字
Java提過兩個(gè)用于計(jì)算高精度的了: BigInteger 和 BigDecimal ?類似包裝類 但沒有對(duì)應(yīng)的基本類型
BigInteger : 支持任意精度的整數(shù)
BigDecimal:支持任意精度的定點(diǎn)數(shù)
2.2.3 Java中的數(shù)組
java中創(chuàng)建一個(gè)數(shù)組就相當(dāng)于創(chuàng)建了一個(gè)引用數(shù)組嚷节,并且每個(gè)引用都指向了null
2.3永遠(yuǎn)不需要銷毀對(duì)象
2.3.1 作用域
在作用域里定義的對(duì)象只可作用于作用域結(jié)束之前 ?{ ? ?<-----scope-----> ? ? ? }
2.3.2對(duì)象的作用域
對(duì)象的作用域與基本類型不同 ??
{
? ? ? ? ? ?String s = new String(“123”);
}//End of scope
引用s在作用域終點(diǎn)就消失了虎锚,然而 對(duì)象 String(“123”)任然在堆中占據(jù)空間硫痰,我們無(wú)法在作用域之后訪問該對(duì)象,因?yàn)樗呀?jīng)超出了作用域的范圍窜护。
2.4 創(chuàng)建新的數(shù)據(jù)類型:類
關(guān)鍵字 class + 類名 { ? }
2.4.1字段和方法
這里注意 在類中 定義的 字段中如果是 基本類型 java會(huì)默認(rèn)為基本類型賦值
但是在方法中 int x ?是不會(huì)被默認(rèn)賦值的
2.5 方法 參數(shù)和返回值
java的方法決定了一個(gè)對(duì)象可以接收什么樣的信息 ?
方法基本包括 名稱 參數(shù) 返回值 方法體
void ?main(String[ ] ?arg){ ? ? 修飾符 + 返回值 + 名字 + ()+參數(shù) +{ }
? ? ? ? ? ? A ? a = new A();
? ? ? ? ? ? a.f()效斑; ?// 調(diào)用方法的行為我們一般稱為 發(fā)消失給對(duì)象
}
2.5.1 參數(shù)列表
int getLength (String s ){
? ? ? ?return s.length() ;
}
事實(shí)上在傳遞對(duì)象參數(shù)時(shí) 我們傳遞的是 對(duì)象的引用 因?yàn)?引用指向?qū)ο?所以可以控制對(duì)象
在java中對(duì)象的傳遞其實(shí) 就是對(duì)象引用的傳遞
這里 我想強(qiáng)調(diào)的是 基本類型(除String外) 傳遞的不是引用 而是指
2.6 構(gòu)建一個(gè)java程序
2.6.1 名字空間 又名 命名空間 ?
標(biāo)識(shí)類的位置 同時(shí)也起到區(qū)分的作用 ?所以即使是同類名在java中只要包名不同 就無(wú)所謂了
使用import 來準(zhǔn)確的表示導(dǎo)入那個(gè)包,即類庫(kù)
如果我們?cè)?在 import 后面加* ?則表示我們導(dǎo)入改包下的所有類資源
2.6.2 static
當(dāng)創(chuàng)建類時(shí) 就是在描述這個(gè)類的外觀與行為 java中使用 new 來創(chuàng)建對(duì)象柱徙,數(shù)據(jù)空間才會(huì)被分配
這樣有兩個(gè)問題需要解決:1. 我只想在的定區(qū)域分配一個(gè)存儲(chǔ)空間缓屠,而不想要?jiǎng)?chuàng)建多少對(duì)象
2.我不想使用對(duì)象就調(diào)用某些類的行為,我希望這個(gè)行為和對(duì)象沒有關(guān)系
static 出現(xiàn)就是解決這類問題?
static 方法或域 ?不予對(duì)象關(guān)聯(lián) 而是與包含他的類相關(guān)聯(lián)
使用 : 直接將static放在 類前面做修飾即可
例如 ? class Test {
static ?int ? k =0护侮;
}
這個(gè)情況下 及時(shí)你創(chuàng)建了 連個(gè) Test 對(duì)象?
Test.i 也獨(dú)享一份存儲(chǔ)空間
兩個(gè)對(duì)象共享一個(gè) i
同樣的靜態(tài)方法也適用 :
class Incrementable{
? ? ? ? ? static ?void ?increment (){
? ? ? ? ? ? ? ? ? ? ? ? ? ?xxxx敌完;
? ? ? ? ? ? ?}?
}
Incrementable.increment() ?類名.方法名
當(dāng)使用static 修飾某個(gè)字段時(shí) , 那么這個(gè)字段的創(chuàng)建方式就發(fā)生了改變羊初,
static字段對(duì)于每個(gè)對(duì)象都是只有一份存儲(chǔ)空間滨溉,而非static字段 每個(gè)對(duì)象都有各自不同的存儲(chǔ)空間
但是 static 修飾的方法 差異性卻沒有那么大
2.7 你的第一個(gè)java程序
java.lang 是默認(rèn)導(dǎo)入在每個(gè)類中的
暫時(shí)結(jié)束