一切皆對(duì)象

一切皆對(duì)象

在 Java 中男杈,一切皆為對(duì)象挂脑。這里需要區(qū)分引用和對(duì)象迫肖。

對(duì)象和引用

//等號(hào)左側(cè)的變量名為引用
//等號(hào)右邊的為對(duì)象拷呆。
String str = "Hello World";
String str1 = new String("Hello World");
//false
System.out.println(str==str1);
//true
System.out.println(str==str.intern());

對(duì)于 str 和 str1 引用了不同的地址坡氯,但 str 和 str1 在常量池中的地址卻是一樣的。


WechatIMG33

數(shù)據(jù)存儲(chǔ)

在程序運(yùn)行時(shí),有以下五個(gè)地方用于存放數(shù)據(jù):

  1. 寄存器:位于處理器箫柳,存儲(chǔ)速度最快手形,但是數(shù)量有限,不允許直接控制悯恍。
  2. 棧:位于 RAM 库糠,速度僅次于寄存器。先進(jìn)后出涮毫,壓棧出棧瞬欧。Java 中引用、局部變量罢防、基本類型都存儲(chǔ)于此艘虎。
  3. 堆:位于 RAM ,用于存儲(chǔ) Java 對(duì)象咒吐,且不需要知道對(duì)象的生命周期野建,創(chuàng)建和回收比費(fèi)時(shí)。
  4. 常量存儲(chǔ):通常直接放于程序代碼內(nèi)部恬叹。
  5. 非RAM存儲(chǔ):流對(duì)象和持久化對(duì)象候生。如:文件的存儲(chǔ)。

基本類型

Java 中基本類型的大小绽昼、最大值唯鸭、最小值及包裝器對(duì)應(yīng)表。Java 5.0 之后提供了自動(dòng)裝箱和拆箱功能硅确。


WechatIMG34

高精度數(shù)字

Java 提供 BigInteger 和 BigDecimal 用于高精度計(jì)算目溉,兩者沒(méi)有對(duì)應(yīng)的基本類型。原則上菱农,只要計(jì)算機(jī)有足夠內(nèi)存缭付,兩者能表示的位數(shù)就是無(wú)限大。
BigInteger:支持任意精度的整數(shù)大莫。
BigDecimal:支持任意精度的定點(diǎn)數(shù)

public static void main(String[] args) {
   Scanner scanner = new Scanner(System.in);
   System.out.println("請(qǐng)輸入需要計(jì)算的值,如:100000000000000000 1988930304");
   while (scanner.hasNext()) {
       BigInteger a = scanner.nextBigInteger();
       BigInteger b = scanner.nextBigInteger();
       System.out.println("和為=" + a.add(b));
   }
}

作用域

作用域決定了變量的可見(jiàn)性和生命周期。但是在 Java 中對(duì)象不具備和基本類型一樣的生命周期官份。一個(gè) Java 對(duì)象可以存活于作用域之外只厘。

public void scope() {
    //變量i在方法執(zhí)行結(jié)束時(shí)就會(huì)失效
    int i = 0;
    //引用str在方法執(zhí)行結(jié)束時(shí)就會(huì)失效,我們無(wú)法用引用str繼續(xù)訪問(wèn)這個(gè)對(duì)象
    //但引用所指向的對(duì)象會(huì)一直存在直到被系統(tǒng)的垃圾回收器回收舅巷。
    String str = new String("Hello World!");
}

垃圾回收有兩種方法:引用計(jì)數(shù)法和可達(dá)性分析法羔味。在 Java 中使用的是后一種

  • 引用計(jì)數(shù)法

直接計(jì)數(shù),簡(jiǎn)單高效钠右,Python便是采用該方法赋元。但是如果出現(xiàn) 兩個(gè)對(duì)象相互引用,即使它們都無(wú)法被外界訪問(wèn)到,計(jì)數(shù)器不為0它們也始終不會(huì)被回收搁凸。為了解決該問(wèn)題媚值,java采用的是可達(dá)性分析法。

  • 可達(dá)性分析法

這個(gè)方法設(shè)置了一系列的“GC Roots”對(duì)象作為索引起點(diǎn)护糖,如果一個(gè)對(duì)象 與起點(diǎn)對(duì)象之間均無(wú)可達(dá)路徑褥芒,那么這個(gè)不可達(dá)的對(duì)象就會(huì)成為回收對(duì)象。這種方法處理 兩個(gè)對(duì)象相互引用的問(wèn)題嫡良,如果兩個(gè)對(duì)象均沒(méi)有外部引用锰扶,會(huì)被判斷為不可達(dá)對(duì)象進(jìn)而被回收(如下圖)。


0

方法寝受、參數(shù)和返回值

在 Java 中坷牛,方法屬于類的一部分,方法的基本形式如下:

public/protect/private/defualt 返回類型 methodName(參數(shù)列表) {}

方法名和參數(shù)列表唯一的標(biāo)識(shí)一個(gè)方法很澄。
方法調(diào)用有兩種方式:

//調(diào)用對(duì)象的方法
object.method(arg1,arg2);
//調(diào)用類方法京闰,類方法用 static 進(jìn)行修飾
Class.method(arg1,arg2);

方法中的參數(shù)如果為對(duì)象,則傳遞的參數(shù)為引用痴怨,對(duì)引用的修改會(huì)導(dǎo)致原始數(shù)據(jù)的改變忙干。下面的例子是用來(lái)測(cè)試修改引用類型參數(shù)的內(nèi)容會(huì)不會(huì)影響到原始數(shù)據(jù)的 demo。
補(bǔ)充

  1. 對(duì) String 類型的參數(shù)修改會(huì)表現(xiàn)出基本類型參數(shù)的特性浪藻,具體原因分析可見(jiàn):Java-String類型的參數(shù)傳遞問(wèn)題
  2. 值傳遞和引用傳遞的區(qū)別
  • 值傳遞:方法操作的是參數(shù)變量(也就是原型變量的一個(gè)值的拷貝)改變的也只是原型變量的一個(gè)拷貝而已捐迫,而非變量本身。所以變量原型并不會(huì)隨之改變爱葵。
  • 引用傳遞:也叫做傳址施戴,即方法操作參數(shù)變量時(shí)是拷貝了變量的引用,而后通過(guò)引用找到變量(在這里是對(duì)象)的真正地址萌丈,并對(duì)其進(jìn)行操作赞哗。當(dāng)該方法結(jié)束后,方法內(nèi)部的那個(gè)參數(shù)變量隨之消失辆雾。但是要知道這個(gè)變量只是對(duì)象的一個(gè)引用而已肪笋,它只是指向了對(duì)象所在的真實(shí)地址,而非對(duì)象本身度迂,所以它的消失并不會(huì)帶來(lái)什么負(fù)面影響藤乙。回頭來(lái)看原型變量惭墓,原型變量本質(zhì)上也是那個(gè)對(duì)象的一個(gè)引用(和參數(shù)變量是一樣一樣的)坛梁,當(dāng)初對(duì)參數(shù)變量所指對(duì)象的改變就根本就是對(duì)原型變量所指對(duì)象的改變。所以原型變量所代表的對(duì)象就這樣被改變了腊凶,而且這種改變被保存了下來(lái)划咐。
public static void main(String[] args) {
   //按理說(shuō)拴念,執(zhí)行change方法修改參數(shù),但是并沒(méi)有按預(yù)期輸出
   //這是個(gè)值得探尋的問(wèn)題
   String str = "1";
   System.out.println("str=" + str + "褐缠,address in memory=" + str.getClass() + "@" + str.hashCode());
   change(str);
   System.out.println(str.toString());
   System.out.println("after ref,str=" + str+ "政鼠,address in memory=" + str.getClass() + "@" + str.hashCode());

   //執(zhí)行change方法對(duì)參數(shù)進(jìn)行修改會(huì)影響到原始數(shù)據(jù)
   Person person = new Person(10);
   System.out.println("person=" + person.toString());
   change(person);
   System.out.println("after person=" + person.toString());
}

private static void change(String string) {
   System.out.println(string+ ",address in memory=" + string.getClass() + "@" + string.hashCode());
   string = "123";
   System.out.println(string+ "送丰,address in memory=" + string.getClass() + "@" + string.hashCode());
}

private static void change(Person person) {
   person.setAge(11);
}

public static class Person {
   private int age;

   public Person(int age) {
       this.age = age;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   @Override
   public String toString() {
       return "Person{" +
               "age=" + age +
               '}';
   }
}

輸出如下:

str=1缔俄,address in memory=class java.lang.String@49
1,address in memory=class java.lang.String@49
123器躏,address in memory=class java.lang.String@48690
1
after ref,str=1俐载,address in memory=class java.lang.String@49
person=Person{age=10}
after person=Person{age=11}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市登失,隨后出現(xiàn)的幾起案子遏佣,更是在濱河造成了極大的恐慌,老刑警劉巖揽浙,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状婶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡馅巷,警方通過(guò)查閱死者的電腦和手機(jī)膛虫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钓猬,“玉大人稍刀,你說(shuō)我怎么就攤上這事〕ú埽” “怎么了账月?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)澳迫。 經(jīng)常有香客問(wèn)我局齿,道長(zhǎng),這世上最難降的妖魔是什么橄登? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任抓歼,我火速辦了婚禮,結(jié)果婚禮上拢锹,老公的妹妹穿的比我還像新娘谣妻。我一直安慰自己,他們只是感情好面褐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布拌禾。 她就那樣靜靜地躺著取胎,像睡著了一般展哭。 火紅的嫁衣襯著肌膚如雪湃窍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天匪傍,我揣著相機(jī)與錄音您市,去河邊找鬼。 笑死役衡,一個(gè)胖子當(dāng)著我的面吹牛茵休,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手蝎,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼榕莺,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了棵介?” 一聲冷哼從身側(cè)響起钉鸯,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邮辽,沒(méi)想到半個(gè)月后唠雕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吨述,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年岩睁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揣云。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捕儒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出灵再,到底是詐尸還是另有隱情肋层,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布翎迁,位于F島的核電站栋猖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汪榔。R本人自食惡果不足惜蒲拉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痴腌。 院中可真熱鬧雌团,春花似錦、人聲如沸士聪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剥悟。三九已至灵寺,卻和暖如春曼库,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背略板。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工毁枯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叮称。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓种玛,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓤檐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赂韵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法挠蛉,內(nèi)部類的語(yǔ)法右锨,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法碌秸,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,664評(píng)論 18 399
  • 1.什么是垃圾回收绍移? 垃圾回收(Garbage Collection)是Java虛擬機(jī)(JVM)垃圾回收器提供...
    簡(jiǎn)欲明心閱讀 89,571評(píng)論 17 311
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)讥电,斷路器蹂窖,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • 我需要的 不多 不過(guò)是一個(gè)對(duì)我好的 護(hù)我周全的 免我驚慌的 容不得我受半點(diǎn)委屈的 和我談得來(lái)的人 所以...
    仙女會(huì)變身閱讀 183評(píng)論 4 4
  • 星巴克賣的是咖啡嗎瞬测?不是,是舒適纠炮;蘋(píng)果賣的是手機(jī)嗎月趟?不是,是審美恢口;你的展示面照片顯示的是你的生活嗎孝宗?顯示你很帥嗎?...
    Play戀愛(ài)閱讀 1,381評(píng)論 4 3