文章詳情頁
Java編程思想讀書筆記(第5-7章)
瀏覽:2日期:2024-06-17 09:05:08
內容: 第2章萬事萬物皆對象一.所有對象都必須由你建立1.存儲在哪里1.寄存器:我們在程序中無法控制2.stack:存放基本類型的數據和對象的reference,但對象本身不存放在stack中,而是存放在Heap中3.Heap:存放用new產生的數據4.Static storage:存放在對象中用static定義的靜態成員5.Constant storage:存放常量6.NON-RAM:硬盤等永久存儲空間2.特例:基本型別基本類型數據存放在Stack中,存放的是數據。而產生對象時,只把對象的reference存放在stack中,用于指向某個對象,對象本身存放在Heap中。3.Java中的數組當你產生某個存儲對象的數組時,真正產生的其實是存儲reference的數組。引數組建立后,其中的每一個reference都會被自動設為null,表示“不指向任何對象。二.建立新的數據型別:Class1.數據成員和函數1.1基本成員的缺省值1)當class的某個成員屬于基本型別時,即使你沒有為它提供初值,Java仍保證它有一個缺省值。2)只有當變量身份是“class內的成員時,Java才保證為該變量提供初值。三.函數(Mehtods),引數(arguments),返回值(return values)1.引數列當引數傳遞的是對象時,傳遞的是對象的reference。四.注解用內嵌式文檔Java提供兩種注解風格:/*XXXX*/、//XXXX第3章控制程序流程一.使用Java運算符1.關系運算符1.) 當對兩個對象運用關系運算符進行比較時,比較的是object reference,如:java/lang/Integer.java.html' target='_blank'>Integer n1 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/Integer.java.html' target='_blank'>Integer n2 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/System.java.html' target='_blank'>System.out.println(n1==n2);結果為false,因為兩個object reference(n1和n2)值是不同的2) quals()的缺省行為也是拿referenct來比較。不過Java中的class覆寫了equals方法,如:java/lang/Integer.java.html' target='_blank'>Integer n1 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/Integer.java.html' target='_blank'>Integer n2 = new java/lang/Integer.java.html' target='_blank'>Integer(3);java/lang/System.java.html' target='_blank'>System.out.println(n1.quals(n2));//值為true2.邏輯運算符1)只能將and、or、not施用于boolean值身上。如果邏輯運算符兩邊的值存在non-boolean值,將會出錯,如:int test1 = 1;java/lang/System.java.html' target='_blank'>System.out.println((test && 1String ss){}Flower(int petals, Sting ss){//petals++;調用另一個構造函數的語句必須在最起始的位置this(petals);//this(ss);會產生錯誤,因為在一個構造函數中只能調用一個構造函數}}**:1)在構造調用另一個構造函數,調用動作必須置于最起始的位置2)不能在構造函數以外的任何函數內調用構造函數3)在一個構造函數內只能調用一個構造函數4.Static的意義無法在static函數中調用non-static函數(反向可行)。為什么不能呢,我們看下面的例子。例4.2.4.1假設能在static函數中調用non-static函數,那么(a)處就將出錯。因為在沒有產生Movie class實例之前,在就不存在Movie class內的name實例,而在getName()中卻要使用name實例,顯然的錯誤的。class Movie{java/lang/String.java.html' target='_blank'>String name = “;Movie(){}public Movie(java/lang/String.java.html' target='_blank'>String name) { this.name = name; }public static java/lang/String.java.html' target='_blank'>String getName() { return name; }}public class Test{public static void main(java/lang/String.java.html' target='_blank'>String[] args){//下面兩名先產生實例后再調用getName()沒有問題//Movie movie1 = new Movie(“movie1);//String name1 = movie1.getName();//下面一名將出錯//String name2 = Movie.getname(); (a)}}三.清理(cleanup):終結(finalization)與垃圾回收(garbage collection)1)你的對象可能不會被回收只有當程序不夠內存時,垃圾回收器才會啟動去回收不再被使用的對象的內存空間。某個對象所占用的空間可能永遠不會被釋放掉,因為你的程序可能永遠不會逼近內存用完的那一刻,而垃圾回收器完全沒有被啟動以釋放你的對象所占據的內存,那些空間便會在程序終止時才一次歸還給操作系統3)只有在采用原生函數(native methods)時,才使用finalize()。四.成員初始化(member initialization)1)函數中的變量不會被自動初始化,如void f(){int i;i++;}將發生編譯錯誤,因為i沒有被初始化。2)class的數據成員會被自動初始化,具體情況如下(見P220例子):基本型別:boolean:false、char:null(u0000)、byte:0、short:0、int:0、long:0 、float:0、double:0第6章重復運用classes一.繼承(inheritance)1.在derived class中overriding某個函數時,只能覆寫base class中的接口,即base class中的public或protected或friendly函數。如果試圖overriding一個private函數,雖然編譯通過,但實際上你只是在derived class中添加了一個函數。如class Cleanser{private void prt(){//(b)java/lang/System.java.html' target='_blank'>System.out.println('Cleanser.prt()');}}public class ExplicitStatic extends Cleanser{public void prt(){java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic.prt()');}public static void main(java/lang/String.java.html' target='_blank'>String[] args){Cleanser x = new ExplicitStatic();x.prt();//(a)}}因為Cleanser中的prt()是private,所以不能在其derived class中被覆寫。ExplicitStatic中的prt()只是ExplicitStatic中的一個函數,所以當試圖在(a)處通過多態來調用prt()時,會發生錯誤。如果把(b)處的private去掉,則結果為ExplicitStatic.prt()2.Super的使用1)通過關鍵字super可以調用當前class的superclass(父類)。例6.1.1.1class Base{Base(){java/lang/System.java.html' target='_blank'>System.out.println('Base()');}public void scrub() { java/lang/System.java.html' target='_blank'>System.out.println(' Base.scrub()'); }}class Cleanser extends Base{private java/lang/String.java.html' target='_blank'>String s = new java/lang/String.java.html' target='_blank'>String('Cleanser');public void append(java/lang/String.java.html' target='_blank'>String a) { s+=a; }public void dilute() { append(' dilute()'); }public void apply() { append(' apply()'); }public void scrub() { append(' scrub()'); }public void print() { java/lang/System.java.html' target='_blank'>System.out.println(s); }Cleanser(){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(): ' + s);}public static void testStatic(){java/lang/System.java.html' target='_blank'>System.out.println('testStatic()');}public static void main(java/lang/String.java.html' target='_blank'>String[] args){Cleanser x = new Cleanser();x.dilute(); x.apply(); x.scrub(); x.print();}}public class ExplicitStatic extends Cleanser{ExplicitStatic(){java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic()');}public void scrub(){append(' Detergen.scrub()');super.testStatic();super.scrub();//調用的是Cleanser.scrub()}public void foam() { append(' foam()'); }public static void main(java/lang/String.java.html' target='_blank'>String[] args){ExplicitStatic x = new ExplicitStatic();x.dilute(); x.apply(); x.scrub(); x.foam();x.print(); java/lang/System.java.html' target='_blank'>System.out.println('Test base class:');Cleanser.main(args);testStatic();}}運行結果:Base()Cleanser(): CleanserExplicitStatic()testStatic()Cleanser dilute() apply() Detergen.scrub() scrub() foam()Test base class:Base()Cleanser(): CleanserCleanser dilute() apply() scrub()testStatic()2)通過super來調用superclass中的成員時,調用的是最近成員。例6.1.1.2class Base{protected java/lang/String.java.html' target='_blank'>String baseS = 'Base';//(a)//private String baseS = 'Base';Base(){java/lang/System.java.html' target='_blank'>System.out.println('Base()');}}class Cleanser extends Base{protected java/lang/String.java.html' target='_blank'>String baseS = 'Cleanser';//(b)public java/lang/String.java.html' target='_blank'>String s = new java/lang/String.java.html' target='_blank'>String('Cleanser');Cleanser(){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(): ' + s);}Cleanser(java/lang/String.java.html' target='_blank'>String a){java/lang/System.java.html' target='_blank'>System.out.println('Cleanser(' + a + '): s = ' + s );}}public class ExplicitStatic extends Cleanser{java/lang/String.java.html' target='_blank'>String s2 = s;java/lang/String.java.html' target='_blank'>String baseS = super.baseS; //(c)ExplicitStatic(){super('ExplicitStatic');java/lang/System.java.html' target='_blank'>System.out.println('ExplicitStatic():s2 = ' + s2 + ', baseS = '+ baseS + 'super.baseS = ' + super.baseS);baseS = 'ExplicitStatic';java/lang/System.java.html' target='_blank'>System.out.println('baseS = ' + baseS + ' , super.baseS = ' + super.baseS);}public static void main(java/lang/String.java.html' target='_blank'>String[] args){ExplicitStatic x = new ExplicitStatic();}}結果1:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Cleanser,super.baseS = CleanserbaseS = ExplicitStatic , super.baseS = Cleanser在上面例子中,在三個class中都存在String bases實例。在ExplicitStatic中如果直接調用baseS,則實際調用的是當前類ExplicitStatic中的baseS(即(c)處的成員);如果通過super.bases來調用baseS,則調用的是離當前類ExplicitStatic最近的baseS成員,即Cleanser class中的baseS實例(即(b)處),產生的結果如結果1所示。如果把(b)處語句注釋掉,則將調用Base class中的baseS,結果如結果2所示。結果2:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Base,super.baseS = BasebaseS = ExplicitStatic , super.baseS = Base3.Base class的初始化2.1當你產生derived class對象時,其中會包含base class子對象(subobject)。這個子對象就和你另外產生的base class對象一模一樣。2.2通過super()可調用base class的構造函數,但必須放在構造函數的第一行,并且只能在構造函數中運用。2.3初始化順序為:1)加載代碼(.class文件)2)初始化class的靜態成員,初始化順序了“從里到外,即從base class開始。3)在derived class的構造函數中調用base class的構造函數。如果在derived class的構造函數中沒有通過super()顯式調用調用base class的構造函數,編譯器會調用bass class的default構造函數并自動生成相應的調用語句,從而產生一個base class實例。如果在derived class的構造函數中通過super()顯示調用了父類的構造函數,則調用所指定的構造函數。調用構造函數的調用順序是“從里到外。4)調用derived class的構造函數。**:當base class沒有default構造函數時,必須在derived class的構造函數中通過super顯示調用base class的構造函數。例:下面代碼的初始化過程為:1)裝載ExplicitStatic的代碼(裝載ExplicitStatic.class文件)。2)發現ExplicitStatic有關鍵字extends,裝載ExplicitStatic的base class的代碼(裝載Cleanser.class文件)。3)發現Cleanser有關鍵字extends,裝載Cleanser的base class的代碼(裝載Base.class文件)。4)初始化Base class中的靜態成員。5)初始化Cleanser class中的靜態成員。6)初始化ExplicitStatic class中的靜態成員。如果把(c)處的代碼注釋掉,那么初始化工作到此就結束了。7)為ExplicitStatic對象分配存儲空間,并把存儲空間初始化為0。8)在ExplicitStatic class的構造中調用super('ExplicitStatic')(在ExplicitStatic class的構造函數中顯式調用父類的構造函數),試圖產生一個Cleanser class實例。9)為Cleanser對象分配存儲空間,并把存儲空間初始化為0。10)由于Cleanser class又是繼承自Base class, Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標簽:
Java
相關文章:
排行榜
