文章詳情頁
Java編程思想讀書筆記(第5-7章)
瀏覽:3日期:2024-06-17 09:05:08
內(nèi)容: 第2章萬事萬物皆對象一.所有對象都必須由你建立1.存儲在哪里1.寄存器:我們在程序中無法控制2.stack:存放基本類型的數(shù)據(jù)和對象的reference,但對象本身不存放在stack中,而是存放在Heap中3.Heap:存放用new產(chǎn)生的數(shù)據(jù)4.Static storage:存放在對象中用static定義的靜態(tài)成員5.Constant storage:存放常量6.NON-RAM:硬盤等永久存儲空間2.特例:基本型別基本類型數(shù)據(jù)存放在Stack中,存放的是數(shù)據(jù)。而產(chǎn)生對象時,只把對象的reference存放在stack中,用于指向某個對象,對象本身存放在Heap中。3.Java中的數(shù)組當(dāng)你產(chǎn)生某個存儲對象的數(shù)組時,真正產(chǎn)生的其實是存儲reference的數(shù)組。引數(shù)組建立后,其中的每一個reference都會被自動設(shè)為null,表示“不指向任何對象。二.建立新的數(shù)據(jù)型別:Class1.?dāng)?shù)據(jù)成員和函數(shù)1.1基本成員的缺省值1)當(dāng)class的某個成員屬于基本型別時,即使你沒有為它提供初值,Java仍保證它有一個缺省值。2)只有當(dāng)變量身份是“class內(nèi)的成員時,Java才保證為該變量提供初值。三.函數(shù)(Mehtods),引數(shù)(arguments),返回值(return values)1.引數(shù)列當(dāng)引數(shù)傳遞的是對象時,傳遞的是對象的reference。四.注解用內(nèi)嵌式文檔Java提供兩種注解風(fēng)格:/*XXXX*/、//XXXX第3章控制程序流程一.使用Java運(yùn)算符1.關(guān)系運(yùn)算符1.) 當(dāng)對兩個對象運(yùn)用關(guān)系運(yùn)算符進(jìn)行比較時,比較的是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);結(jié)果為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.邏輯運(yùn)算符1)只能將and、or、not施用于boolean值身上。如果邏輯運(yùn)算符兩邊的值存在non-boolean值,將會出錯,如:int test1 = 1;java/lang/System.java.html' target='_blank'>System.out.println((test && 1String ss){}Flower(int petals, Sting ss){//petals++;調(diào)用另一個構(gòu)造函數(shù)的語句必須在最起始的位置this(petals);//this(ss);會產(chǎn)生錯誤,因為在一個構(gòu)造函數(shù)中只能調(diào)用一個構(gòu)造函數(shù)}}**:1)在構(gòu)造調(diào)用另一個構(gòu)造函數(shù),調(diào)用動作必須置于最起始的位置2)不能在構(gòu)造函數(shù)以外的任何函數(shù)內(nèi)調(diào)用構(gòu)造函數(shù)3)在一個構(gòu)造函數(shù)內(nèi)只能調(diào)用一個構(gòu)造函數(shù)4.Static的意義無法在static函數(shù)中調(diào)用non-static函數(shù)(反向可行)。為什么不能呢,我們看下面的例子。例4.2.4.1假設(shè)能在static函數(shù)中調(diào)用non-static函數(shù),那么(a)處就將出錯。因為在沒有產(chǎn)生Movie class實例之前,在就不存在Movie class內(nèi)的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){//下面兩名先產(chǎn)生實例后再調(diào)用getName()沒有問題//Movie movie1 = new Movie(“movie1);//String name1 = movie1.getName();//下面一名將出錯//String name2 = Movie.getname(); (a)}}三.清理(cleanup):終結(jié)(finalization)與垃圾回收(garbage collection)1)你的對象可能不會被回收只有當(dāng)程序不夠內(nèi)存時,垃圾回收器才會啟動去回收不再被使用的對象的內(nèi)存空間。某個對象所占用的空間可能永遠(yuǎn)不會被釋放掉,因為你的程序可能永遠(yuǎn)不會逼近內(nèi)存用完的那一刻,而垃圾回收器完全沒有被啟動以釋放你的對象所占據(jù)的內(nèi)存,那些空間便會在程序終止時才一次歸還給操作系統(tǒng)3)只有在采用原生函數(shù)(native methods)時,才使用finalize()。四.成員初始化(member initialization)1)函數(shù)中的變量不會被自動初始化,如void f(){int i;i++;}將發(fā)生編譯錯誤,因為i沒有被初始化。2)class的數(shù)據(jù)成員會被自動初始化,具體情況如下(見P220例子):基本型別:boolean:false、char:null(u0000)、byte:0、short:0、int:0、long:0 、float:0、double:0第6章重復(fù)運(yùn)用classes一.繼承(inheritance)1.在derived class中overriding某個函數(shù)時,只能覆寫base class中的接口,即base class中的public或protected或friendly函數(shù)。如果試圖overriding一個private函數(shù),雖然編譯通過,但實際上你只是在derived class中添加了一個函數(shù)。如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中的一個函數(shù),所以當(dāng)試圖在(a)處通過多態(tài)來調(diào)用prt()時,會發(fā)生錯誤。如果把(b)處的private去掉,則結(jié)果為ExplicitStatic.prt()2.Super的使用1)通過關(guān)鍵字super可以調(diào)用當(dāng)前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();//調(diào)用的是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();}}運(yùn)行結(jié)果:Base()Cleanser(): CleanserExplicitStatic()testStatic()Cleanser dilute() apply() Detergen.scrub() scrub() foam()Test base class:Base()Cleanser(): CleanserCleanser dilute() apply() scrub()testStatic()2)通過super來調(diào)用superclass中的成員時,調(diào)用的是最近成員。例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();}}結(jié)果1:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Cleanser,super.baseS = CleanserbaseS = ExplicitStatic , super.baseS = Cleanser在上面例子中,在三個class中都存在String bases實例。在ExplicitStatic中如果直接調(diào)用baseS,則實際調(diào)用的是當(dāng)前類ExplicitStatic中的baseS(即(c)處的成員);如果通過super.bases來調(diào)用baseS,則調(diào)用的是離當(dāng)前類ExplicitStatic最近的baseS成員,即Cleanser class中的baseS實例(即(b)處),產(chǎn)生的結(jié)果如結(jié)果1所示。如果把(b)處語句注釋掉,則將調(diào)用Base class中的baseS,結(jié)果如結(jié)果2所示。結(jié)果2:Base()Cleanser(ExplicitStatic): s = CleanserExplicitStatic():s2 = Cleanser, baseS = Base,super.baseS = BasebaseS = ExplicitStatic , super.baseS = Base3.Base class的初始化2.1當(dāng)你產(chǎn)生derived class對象時,其中會包含base class子對象(subobject)。這個子對象就和你另外產(chǎn)生的base class對象一模一樣。2.2通過super()可調(diào)用base class的構(gòu)造函數(shù),但必須放在構(gòu)造函數(shù)的第一行,并且只能在構(gòu)造函數(shù)中運(yùn)用。2.3初始化順序為:1)加載代碼(.class文件)2)初始化class的靜態(tài)成員,初始化順序了“從里到外,即從base class開始。3)在derived class的構(gòu)造函數(shù)中調(diào)用base class的構(gòu)造函數(shù)。如果在derived class的構(gòu)造函數(shù)中沒有通過super()顯式調(diào)用調(diào)用base class的構(gòu)造函數(shù),編譯器會調(diào)用bass class的default構(gòu)造函數(shù)并自動生成相應(yīng)的調(diào)用語句,從而產(chǎn)生一個base class實例。如果在derived class的構(gòu)造函數(shù)中通過super()顯示調(diào)用了父類的構(gòu)造函數(shù),則調(diào)用所指定的構(gòu)造函數(shù)。調(diào)用構(gòu)造函數(shù)的調(diào)用順序是“從里到外。4)調(diào)用derived class的構(gòu)造函數(shù)。**:當(dāng)base class沒有default構(gòu)造函數(shù)時,必須在derived class的構(gòu)造函數(shù)中通過super顯示調(diào)用base class的構(gòu)造函數(shù)。例:下面代碼的初始化過程為:1)裝載ExplicitStatic的代碼(裝載ExplicitStatic.class文件)。2)發(fā)現(xiàn)ExplicitStatic有關(guān)鍵字extends,裝載ExplicitStatic的base class的代碼(裝載Cleanser.class文件)。3)發(fā)現(xiàn)Cleanser有關(guān)鍵字extends,裝載Cleanser的base class的代碼(裝載Base.class文件)。4)初始化Base class中的靜態(tài)成員。5)初始化Cleanser class中的靜態(tài)成員。6)初始化ExplicitStatic class中的靜態(tài)成員。如果把(c)處的代碼注釋掉,那么初始化工作到此就結(jié)束了。7)為ExplicitStatic對象分配存儲空間,并把存儲空間初始化為0。8)在ExplicitStatic class的構(gòu)造中調(diào)用super('ExplicitStatic')(在ExplicitStatic class的構(gòu)造函數(shù)中顯式調(diào)用父類的構(gòu)造函數(shù)),試圖產(chǎn)生一個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
標(biāo)簽:
Java
相關(guān)文章:
1. 《CSS3實戰(zhàn)》筆記--漸變設(shè)計(三)2. 《CSS3實戰(zhàn)》筆記--漸變設(shè)計(二)3. asp知識整理筆記2(問答模式)4. python基于scrapy爬取京東筆記本電腦數(shù)據(jù)并進(jìn)行簡單處理和分析5. vue學(xué)習(xí)筆記之slot插槽用法實例分析6. vue學(xué)習(xí)筆記之動態(tài)組件和v-once指令簡單示例7. Effective java學(xué)習(xí)筆記3:用私有構(gòu)造函數(shù)強(qiáng)化不可實例化能力8. Effective java學(xué)習(xí)筆記1:考慮使用靜態(tài)工廠方法代替構(gòu)造方法9. 《javascript設(shè)計模式》學(xué)習(xí)筆記五:Javascript面向?qū)ο蟪绦蛟O(shè)計工廠模式實例分析10. Java 并發(fā)學(xué)習(xí)筆記總結(jié)
排行榜
