国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

開(kāi)發(fā)Java系統(tǒng)程序員要注意的基本知識(shí)二

2019-11-18 11:47:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  問(wèn)題四:final要害字到底修飾了什么?
  
  final使得被修飾的變量"不變",但是由于對(duì)象型變量的本質(zhì)是“引用”,使得“不變”也有了兩種含義:引用本身的不變,和引用指向的對(duì)象不變。
  
  引用本身的不變:
  final StringBuffer a=new StringBuffer("immutable");
  final StringBuffer b=new StringBuffer("not immutable");
  a=b;//編譯期錯(cuò)誤
  
  引用指向的對(duì)象不變:
  final StringBuffer a=new StringBuffer("immutable");
  a.append(" broken!"); //編譯通過(guò)
  
  可見(jiàn),final只對(duì)引用的“值”(也即它所指向的那個(gè)對(duì)象的內(nèi)存地址)有效,它迫使引用只能指向初始指向的那個(gè)對(duì)象,改變它的指向會(huì)導(dǎo)致編譯期錯(cuò)誤。至于它所指向的對(duì)象的變化,final是不負(fù)責(zé)的。這很類似==操作符:==操作符只負(fù)責(zé)引用的“值”相等,至于這個(gè)地址所指向的對(duì)象內(nèi)容是否相等,==操作符是不管的。
  
  理解final問(wèn)題有很重要的含義。許多程序漏洞都基于此----final只能保證引用永遠(yuǎn)指向固定對(duì)象,不能保證那個(gè)對(duì)象的狀態(tài)不變。在多線程的操作中,一個(gè)對(duì)象會(huì)被多個(gè)線程共享或修改,一個(gè)線程對(duì)對(duì)象無(wú)意識(shí)的修改可能會(huì)導(dǎo)致另一個(gè)使用此對(duì)象的線程崩潰。一個(gè)錯(cuò)誤的解決方法就是在此對(duì)象新建的時(shí)候把它聲明為final,意圖使得它“永遠(yuǎn)不變”。其實(shí)那是徒勞的。
  
  問(wèn)題五:到底要怎么樣初始化!
  
  本問(wèn)題討論變量的初始化,所以先來(lái)看一下java中有哪些種類的變量。
  
  1. 類的屬性,或者叫值域
  
  2. 方法里的局部變量
  
  3. 方法的參數(shù)
  
  對(duì)于第一種變量,Java虛擬機(jī)會(huì)自動(dòng)進(jìn)行初始化。假如給出了初始值,則初始化為該初始值。假如沒(méi)有給出,則把它初始化為該類型變量的默認(rèn)初始值。
  
  int類型變量默認(rèn)初始值為0
  
  float類型變量默認(rèn)初始值為0.0f
  
  double類型變量默認(rèn)初始值為0.0
  
  boolean類型變量默認(rèn)初始值為false
  
  char類型變量默認(rèn)初始值為0(ASCII碼)
  
  long類型變量默認(rèn)初始值為0
  
  所有對(duì)象引用類型變量默認(rèn)初始值為null,即不指向任何對(duì)象。注重?cái)?shù)組本身也是對(duì)象,所以沒(méi)有初始化的數(shù)組引用在自動(dòng)初始化后其值也是null。
  
  對(duì)于兩種不同的類屬性,static屬性與instance屬性,初始化的時(shí)機(jī)是不同的。instance屬性在創(chuàng)建實(shí)例的時(shí)候初始化,static屬性在類加載,也就是第一次用到這個(gè)類的時(shí)候初始化,對(duì)于后來(lái)的實(shí)例的創(chuàng)建,不再次進(jìn)行初始化。這個(gè)問(wèn)題會(huì)在以后的系列中進(jìn)行具體討論。
  
  對(duì)于第二種變量,必須明確地進(jìn)行初始化。假如再?zèng)]有初始化之前就試圖使用它,編譯器會(huì)抗議。假如初始化的語(yǔ)句在try塊中或if塊中,也必須要讓它在第一次使用前一定能夠得到賦值。也就是說(shuō),把初始化語(yǔ)句放在只有if塊的條件判定語(yǔ)句中編譯器也會(huì)抗議,因?yàn)閳?zhí)行的時(shí)候可能不符合if后面的判定條件,如此一來(lái)初始化語(yǔ)句就不會(huì)被執(zhí)行了,這就違反了局部變量使用前必須初始化的規(guī)定。但假如在else塊中也有初始化語(yǔ)句,就可以通過(guò)編譯,因?yàn)闊o(wú)論如何,總有至少一條初始化語(yǔ)句會(huì)被執(zhí)行,不會(huì)發(fā)生使用前未被初始化的事情。對(duì)于try-catch也是一樣,假如只有在try塊里才有初始化語(yǔ)句,編譯部通過(guò)。假如在 catch或finally里也有,則可以通過(guò)編譯。總之,要保證局部變量在使用之前一定被初始化了。所以,一個(gè)好的做法是在聲明他們的時(shí)候就初始化他們,假如不知道要出事化成什么值好,就用上面的默認(rèn)值吧!
  
  其實(shí)第三種變量和第二種本質(zhì)上是一樣的,都是方法中的局部變量。只不過(guò)作為參數(shù),肯定是被初始化過(guò)的,傳入的值就是初始值,所以不需要初始化。
  
  問(wèn)題六:instanceof是什么東東?
  
  instanceof是Java的一個(gè)二元操作符,和==,>,<是同一類東東。由于它是由字母組成的,所以也是Java的保留要害字。它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類的實(shí)例,返回boolean類型的數(shù)據(jù)。舉個(gè)例子:
  
  String s = "I AM an Object!";
  boolean isObject = s instanceof Object;
  
  我們聲明了一個(gè)String對(duì)象引用,指向一個(gè)String對(duì)象,然后用instancof來(lái)測(cè)試它所指向的對(duì)象是否是Object類的一個(gè)實(shí)例,顯然,這是真的,所以返回true,也就是isObject的值為True。
  instanceof有一些用處。比如我們寫(xiě)了一個(gè)處理賬單的系統(tǒng),其中有這樣三個(gè)類:
  
  public class Bill {//省略細(xì)節(jié)}
  public class PhoneBill extends Bill {//省略細(xì)節(jié)}
  public class GasBill extends Bill {//省略細(xì)節(jié)}
  
  在處理程序里有一個(gè)方法,接受一個(gè)Bill類型的對(duì)象,計(jì)算金額。假設(shè)兩種賬單計(jì)算方法不同,而傳入的Bill對(duì)象可能是兩種中的任何一種,所以要用instanceof來(lái)判定:
  
  public double calculate(Bill bill) {
  if (bill instanceof PhoneBill) {
  //計(jì)算電話賬單
  }
  if (bill instanceof GasBill) {
  //計(jì)算燃?xì)赓~單
  }
  ...
  }
  這樣就可以用一個(gè)方法處理兩種子類。
  
  然而,這種做法通常被認(rèn)為是沒(méi)有好好利用面向?qū)ο笾械亩鄳B(tài)性。其實(shí)上面的功能要求用方法重載完全可以實(shí)現(xiàn),這是面向?qū)ο笞兂蓱?yīng)有的做法,避免回到結(jié)構(gòu)化編程模式。只要提供兩個(gè)名字和返回值都相同,接受參數(shù)類型不同的方法就可以了:
  
  public double calculate(PhoneBill bill) {
  //計(jì)算電話賬單
  }
  
  public double calculate(GasBill bill) {
  //計(jì)算燃?xì)赓~單
  }
  
  所以,使用instanceof在絕大多數(shù)情況下并不是推薦的做法,應(yīng)當(dāng)好好利用多態(tài)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 通州区| 登封市| 万山特区| 上饶市| 麟游县| 钟山县| 鸡西市| 巴楚县| 拉萨市| 运城市| 新安县| 龙井市| 水富县| 德州市| 甘孜县| 平湖市| 平度市| 肥城市| 拜泉县| 汪清县| 惠水县| 新泰市| 仁布县| 石狮市| 旅游| 沈丘县| 中山市| 敦化市| 杭州市| 醴陵市| 德保县| 越西县| 柞水县| 那曲县| 潮安县| 唐海县| 郯城县| 南木林县| 阿克陶县| 彭水| 靖江市|