1. 程式人生 > >交行2部培訓總結

交行2部培訓總結

out 原來 作用 post 所有 .com 虛擬 什麽是 對象類型

摘要:本文總結了6個問題
1、java有幾大特性,分別是什麽,並簡述這些特性的特點
2、簡單說明什麽是 String 不可變
3、分別描述重載與重寫,並說明重載與重寫的區別
4、抽象類的特點
5、局部變量與全局變量的作用域
6、堆內存與棧內存的區別

一、java有幾大特性,分別是什麽,並簡述這些特性的特點

1.封裝:該公開的公開,改私有的私有。 類的屬性一般私有;類的方法該公開的公開。 2.繼承:extends:實際上是對父類的擴展。    任何父類適用的方法,子類一定適用。 生成對象的過程:   1)分配對象空間;   2)給屬性賦初值;     boolean:false     數值類型的:0或0.0     對象類型:null   3)調用構造方法     ①任何子類的構造方法都會調用父類的構造方法     ②任何類都有構造方法,如果程序員自己不定義則系統會加上一 個默認的無參空實現的構造方法;如果定義了,則系統不會加。     ③任何子類的構造方法的第一行一定是super(...)或this;     如果程序員不這麽寫,則系統會默認加上super();     自己寫this()就不會加super();     但是this()調用的構造方法一定會調用父類的構造方法;     This(...);//表示調用本類的其它構造方法,只能出現在構造方法的第一行;其它位置都是不合法的;     Super(...);//調用父類的構造方法,也是只能出現在構造方法的第一行;根據參數類型來確定調用父類的哪個構造方法。     //默認調用父類的無參的構造方法。     //即使把父類的私有屬性繼承下來,但還是不能直接訪問,必須用getName(); 方法的覆蓋:   1) 發生在父子類中   2)同名、同參、同返回值   3)訪問權限同父類或更寬泛

3.多態:類中多個方法的重載叫做多態,父子類中方法的覆蓋也叫多態。

  因此多態兩種體現:
  一個是方法的覆蓋,一個是方法的重載。
  所有的多態可以歸結為兩個定理:
  1)可以把子類對象當做父類對象來看,一旦這樣做了,就只能去調用父類中原有定義的屬性和方法,也就是子類擴展的方法和屬性就不能調用了
  2)當我們把子類對象當做子類對象來看時,如果子類覆蓋了父類中的方法,在調用的時候實際上調用的是子類覆蓋後的方法。
  例如:
  Animal a=new Bird();
  前面的引用a的類型叫做編譯時類型(主觀認為),
  後面的bird類型叫做運行時類型(客觀存在)

二、簡單說明什麽是 String 不可變

  什麽是不可變對象?

  如果一個對象,在它創建完成之後,不可再改變它的狀態,那麽這個對象就是不可變的。不可改變狀態的意思是,不能改變對象內的成員變量,包括基本數據的值不能改變,引用類型的變量不能指向其他的對象,引用類型指向的對象的狀態也不能改變。
  String s="ABCabc";
  System.out.println(s);
  s="123";
  System.out.println(s);
  s的值確實變了。
  解釋: s只是String對象的一個引用,並不是對象本身。
     對象在內存中是一塊內存區,成員變量越多,這塊內存區占的空間越大。

     引用只是一個4字節的數據,裏面存放了它所指向的對象的地址,通過這個地址可以訪問對象。
     也就是說,s只是一個引用,它指向了一個具體的對象,當s="123"這句代碼執行以後,又創建了一個新的對象"123",而引用s重新指向了這個新的對象,原來的"ABCabc"在內存中還存在,並沒有改變。

  拓展:
  創建String的方式,三類:
  ①String s1=new String("abc");
  ②String s2="abc";
  ③String s3="ab"+c;
  String 的創建原理:
  1)當使用任何方式來創建一個字符串對象s時,java運行時(jvm)會拿著這個s在String Pool中找是否存在內容相同的字符串對象。
  如果不存在,則在池中創建一個字符串s,否者,不在池中添加。
  2)java中,只要使用new關鍵字來創建對象,則一定會(在堆區或棧區)創建一個新的對象。
  3)使用直接指定或者使用純字符串串聯來創建String對象,則僅僅會檢查維護String池中的字符串,池中沒有就在池中創建一個,有則罷了。
  但絕不會在堆棧中再去創建一個String對象
  4)使用包含變量的表達式來創建String對象,則不僅會檢查維護String池,而且還會在堆棧中創建一個String對象。

  拓展:string對象的初始化java提供了一種簡化的特殊語法,格式如下:String s="abc";
  如果按照String s=new String("abc");在內存使用上會存在很大的浪費,因為它實際上創建了兩個String對象,一個是"abc"對象,存儲在常量空間中,一個是使用new 關鍵字為對象s申請的空間。

三、分別描述重載與重寫,並說明重載與重寫的區別

  重寫是子類的方法覆蓋父類的方法,要求方法名和參數都相同
  重載是同一個類兩個或兩個以上的方法,方法名相同,但是參數類型不同,或者個數不同,或者順序不同

四、抽象類的特點

  抽象類不能實例化
  抽象類中的抽象方法只能是public、protected來修飾

五、局部變量與全局變量的作用域

  定義在類中方法外的變量,就是全局變量,存放在堆內存。隨對象的創建而創建 ,隨對象的消失而消失。
  定義在方法裏或域裏的就是局部變量。局部變量離開了它的域{}就會失效,存放在棧內存。隨方法的調用而存在,方法調用完畢就消失了。

六、堆內存與棧內存的區別:

  在函數中定義的一些 基本類型的變量對象的引用變量 都是在函數的棧內存中分配。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域後,就會自動釋放掉為該變量分配的內存空間,該內存空間可以立即另作他用。
  堆內存用於存放由new創建的 對象數組。在堆中分配的內存,由java虛擬機自動垃圾回收器來管理。
  在堆中產生了一個數組或者對象後,還可以在棧中定義一個特殊的變量,這個變量的取值等於數組或者對象在對內存中的首地址,在棧中這個特殊的變量就成了數組或者對象的引用變量。
  引用變量就是普通變量,定義在棧中分配內存,引用變量在程序運行到作用域外釋放。
  而數組和對象本身子在堆中分配,即使程序運行到使用new產生數組和對象的語句所在的代碼塊之外,數組和對象本身占用的對內存也不會被釋放,數組和對象在沒有引用變量的時候,才會變成垃圾,不能再被使用,但是仍然占著內存,在隨後的一個不確定的時間被垃圾回收器釋放掉。這也是java比較占內存的主要原因。

  例如,下列Java代碼中的變量a、b、c分別在內存的____存儲區存放。

技術分享圖片

  解析:
  a是類中的成員變量,存放在堆區
  b、c都是方法中的局部變量,存放在棧區

交行2部培訓總結