找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2091|回復(fù): 0
收起左側(cè)

OPP--面向?qū)ο笾R點(diǎn)

[復(fù)制鏈接]
ID:140343 發(fā)表于 2016-9-25 11:34 | 顯示全部樓層 |閱讀模式
第一天1.什么是類?什么是對象?
  1)現(xiàn)實(shí)世界是由很多很多對象組成的
    基于對象抽出了類
  2)對象:真真正正存在的單個(gè)的個(gè)體
    類:代表一類個(gè)體(類型、類別)
  3)類中可以包含:
    3.1)所有對象所共有的屬性(靜)----變量
    3.2)所有對象所共有的行為(動(dòng))----方法
  4)一個(gè)類可以創(chuàng)建多個(gè)對象
    同一個(gè)類創(chuàng)建的多個(gè)對象,結(jié)構(gòu)相同,數(shù)據(jù)不同
  5)類是對象的模板,對象是類的具體的實(shí)例
2.如何創(chuàng)建類?如何創(chuàng)建對象?
3.引用類型畫等號:
  1)指向同一個(gè)對象
  2)對其中一個(gè)引用的修改會(huì)影響另外一個(gè)
    eg:房門鑰匙
  基本類型畫等號:
  1)賦值
  2)對其中一個(gè)值的修改不會(huì)影響另外一個(gè)
    eg:身份證復(fù)印件
4.null:空,即不指向任何對象
       若引用的值為null,則該引用不能再進(jìn)行任何操作了
       若操作則空指針異常(NullPointerException)
補(bǔ)充
1. 1)找對象:一堆小格子
2)抽類:格子類Cell
3)設(shè)計(jì)類中的成員變量和方法:
4)創(chuàng)建對象:
2. 面向過程是一種以過程為核心的編程思想,即分析出解決問題所需要的步驟,然后使用方法將這些步驟一步一步的實(shí)現(xiàn),使用的時(shí)候,在main方法中一個(gè)一個(gè)依次調(diào)用就可以了。
3. 請描述類和對象的關(guān)系
參考答案
對象是一個(gè)客觀存在的實(shí)體,是面向?qū)ο缶幊踢^程中分析與解決問題的出發(fā)點(diǎn)與基礎(chǔ)。對象的實(shí)質(zhì)就是內(nèi)存中的一塊數(shù)據(jù)存儲區(qū)域,其數(shù)據(jù)結(jié)構(gòu)由定義它的類來決定。
類是用于構(gòu)建對象的模板,對象通過類的實(shí)例化產(chǎn)生,一個(gè)類可以創(chuàng)建多個(gè)對象,每個(gè)對象擁有自己的數(shù)據(jù)和行為。
3 請描述引用類型和基本類型的區(qū)別
參考答案
除8種基本類型之外,用類名(接口、數(shù)組)聲明的變量稱為引用類型變量,簡稱“引用”。引用的功能在于訪問對象。
基本類型變量本身就包含了其實(shí)例數(shù)據(jù),而引用類型變量中存儲的是某個(gè)對象在內(nèi)存中的地址信息。當(dāng)一個(gè)引用類型變量指向該類的對象時(shí),就可以通過這個(gè)變量訪問對象。
第二天
1.方法的簽名:方法名+參數(shù)列表
2.方法的重載:
  1)同一個(gè)類中,方法名稱相同,參數(shù)列表不同
  2)編譯器在編譯時(shí)自動(dòng)根據(jù)方法的簽名綁定調(diào)用不同的方法
3.構(gòu)造方法:構(gòu)造函數(shù)、構(gòu)造器、構(gòu)建器
  1)給成員變量賦初值
  2)與類同名,沒有返回值類型
  3)在創(chuàng)建(new)對象時(shí)被自動(dòng)調(diào)用
  4)若自己不寫構(gòu)造,則系統(tǒng)默認(rèn)提供一個(gè)無參構(gòu)造方法
    若自己寫了構(gòu)造,則不再默認(rèn)提供
  5)構(gòu)造方法可以重載
4.this:指代當(dāng)前對象,哪個(gè)對象調(diào)指的就是哪個(gè)對象
       方法中訪問成員變量之前,默認(rèn)有個(gè)this.
  this用法:
  1)this.成員變量名----訪問成員變量
  2)this.方法名()------調(diào)用方法
  3)this()-------------調(diào)用構(gòu)造方法
5.引用類型數(shù)組
  1)
1 Cell[] cells = new Cell[4];2 cells[0] = new Cell(2,5);3 cells[1] = new Cell(3,6);4 cells[2] = new Cell(4,7);5 cells[3] = new Cell(5,8);
2)
1 Cell[] cells = new Cell[]{2 new Cell(2,5),3 new Cell(3,6),4 new Cell(4,7),5 new Cell(5,8)6 }
  3)
1 int[][] arr = new int[3][];2 arr[0] = new int[2];3 arr[1] = new int[3];4 arr[2] = new int[2];5 arr[1][0] = 100; //arr中第2個(gè)元素中的第1個(gè)元素賦值為100
4)
1 int[][] arr = new int[3][4]; //3行4列2 for(int i=0;i<arr.length;i++){3 for(int j=0;j<arr[ i].length;j++){4 arr[ i][j] = 100;5 }6 }
1)找對象:T對象,J,O,I,S,Z,L
2)抽類:T類,J類,L類,O,S,Z,I類
3)設(shè)計(jì)類中的成員變量和方法:
4)創(chuàng)建對象測試:
知識點(diǎn)補(bǔ)充:
1.一個(gè)文件中可以包含多個(gè)類
public修飾的類只能有一個(gè)
public修飾的類的名字必須與文件名相同
第三天
1.內(nèi)存管理:理解
  1)堆:
    1.1)存儲所有new出來的對象
    1.2)成員變量的生命周期:
          創(chuàng)建對象時(shí)存在堆中,對象被回收時(shí)一并消失
    1.3)沒有任何引用所指向的對象即為垃圾,
        垃圾回收器(GC)不定時(shí)查看,看到垃圾則自動(dòng)回收
    1.4)內(nèi)存泄露:無用的對象沒有被及時(shí)的回收
          建議:若對象不再使用,及時(shí)將引用設(shè)置為null
  2)棧:
    2.1)存儲正在調(diào)用的方法中的所有局部變量
    2.2)調(diào)用方法時(shí)在棧中為該方法分配一塊對應(yīng)的棧幀,
        棧幀中存儲方法中的局部變量,
               方法執(zhí)行結(jié)束時(shí)棧幀被消除,局部變量一并消失
    2.3)局部變量的生命周期:
          方法被調(diào)用時(shí)存在棧中,方法結(jié)束時(shí)棧幀被消除時(shí)一并消失
  3)方法區(qū):
    3.1)存儲.class字節(jié)碼文件以及所有方法
    3.2)方法只有一份,通過this來區(qū)分具體的引用
2.繼承:
  1)有利于代碼的重用(避免代碼重復(fù))
  2)通過extends實(shí)現(xiàn)繼承
  3)父類/基類:所有子類所共有的特征和行為
    子類/派生類/:子類所特有的特征和行為
  4)子類繼承父類后,具有:
      父類共有的+子類特有的
  5)一個(gè)父類可以有多個(gè)子類,
    一個(gè)子類只能有一個(gè)父類---單一繼承
  6)繼承具有傳遞性
  7)java規(guī)定:構(gòu)造子類之前必須先構(gòu)造父類
    子類構(gòu)造中若沒有調(diào)用父類構(gòu)造,則默認(rèn)添加super()來調(diào)用父類的無參構(gòu)造
    若子類構(gòu)造中調(diào)了父類構(gòu)造,則不再默認(rèn)提供
    super()必須位于子類構(gòu)造的第一句
3.super:指代當(dāng)前對象的父類對象
  用法:
  1)super.成員變量名---訪問父類的成員變量
  2)super.方法名()-----調(diào)用父類的方法
  3)super()------------調(diào)用父類的構(gòu)造方法
4.向上造型
  1)父類型的引用指向子類的對象
  2)能點(diǎn)出來什么,看引用的類型
知識點(diǎn)補(bǔ)充:
1.成員變量:
1)類中,方法外
2)new時(shí)存在堆中,對象被回收時(shí)一并被清除
3)有默認(rèn)值
局部變量:
1)方法中
2)方法被調(diào)用時(shí)存在棧中,調(diào)用結(jié)束棧幀被清除時(shí)一并消失
3)沒有默認(rèn)值
成員變量:有幾個(gè)對象就有幾份(堆)
成員方法:只有一份(方法區(qū))
2. 在JAVA中,有java程序、虛擬機(jī)、操作系統(tǒng)三個(gè)層次,其中java程序與虛擬機(jī)交互,而虛擬機(jī)與操作系統(tǒng)交互。編譯好的java字節(jié)碼文件運(yùn)行在JVM中。
程序中無論代碼還是數(shù)據(jù),都需要存儲在內(nèi)存中,而java程序所需內(nèi)存均由JVM進(jìn)行管理分配,開發(fā)者只需關(guān)心JVM是如何管理內(nèi)存的,而無需關(guān)注某種操作系統(tǒng)是如何管理內(nèi)存的,這就保證了java程序的平臺無關(guān)性。
JVM會(huì)將申請的內(nèi)存從邏輯上劃分為三個(gè)區(qū)域:堆、棧、方法區(qū)。這三個(gè)區(qū)域分別用于存儲不同的數(shù)據(jù)。
3.GC線程會(huì)從棧中的引用變量開始跟蹤,從而判定哪些內(nèi)存是正在使用的,若GC無法跟蹤到某一塊堆內(nèi)存,那么GC就認(rèn)為這塊內(nèi)存不再使用了,即為可回收的。但是,java程序員不用擔(dān)心內(nèi)存管理,因?yàn)槔占鲿?huì)自動(dòng)進(jìn)行管理。
4. 構(gòu)建T類和J類的父類Tetromino類,將公共的(T類和J類公有的)信息存放在父類中, T類和J類繼承Tetromino父類。此時(shí),子類即可以共享父類的數(shù)據(jù)。這個(gè)過程就是泛化的過程。
5.簡述JVM垃圾回收機(jī)制
垃圾回收機(jī)制是Java提供的自動(dòng)釋放內(nèi)存空間的機(jī)制。
垃圾回收器(Garbage Collection,GC)是JVM自帶的一個(gè)線程,用于回收沒有被引用的對象。
6 Java程序是否會(huì)出現(xiàn)內(nèi)存泄露
會(huì)出現(xiàn)內(nèi)存泄漏。一般來說內(nèi)存泄漏有兩種情況。
一是在堆中分配的內(nèi)存,在沒有將其釋放掉的時(shí)候,就將所有能訪問這塊內(nèi)存的方式都刪掉;另一種情況則是在內(nèi)存對象明明已經(jīng)不需要的時(shí)候,還仍然保留著這塊內(nèi)存和它的訪問方式(引用)。第一種情況,在Java中已經(jīng)由于垃圾回收機(jī)制的引入,得到了很好的解決。所以,Java中的內(nèi)存泄漏,主要指的是第二種情況。
7.Foo foo = new Foo();
foo.f();
以上代碼的內(nèi)存實(shí)現(xiàn)原理為:
1.Foo類首先被裝載到JVM的方法區(qū),其中包括類的信息,包括方法和構(gòu)造等。
2.在棧內(nèi)存中分配引用變量foo。
3.在堆內(nèi)存中按照Foo類型信息分配實(shí)例變量內(nèi)存空間;然后,將棧中引用foo指向foo對象堆內(nèi)存的首地址。
4.使用引用foo調(diào)用方法,根據(jù)foo引用的類型Foo調(diào)用f方法。
8.當(dāng)調(diào)用子類構(gòu)造器來初始化子類對象時(shí),父類構(gòu)造器總會(huì)在子類構(gòu)造器之前執(zhí)行。子類構(gòu)造器調(diào)用父類構(gòu)造器分如下幾種情況。
A,子類構(gòu)造器執(zhí)行體的第一行使用super顯式調(diào)用父類構(gòu)造器,系統(tǒng)將根據(jù)super調(diào)用里傳入的實(shí)參列表調(diào)用父類對應(yīng)的構(gòu)造器。
B,子類構(gòu)造器執(zhí)行的第一行代碼使用this顯式調(diào)用本類中重載的構(gòu)造器,系統(tǒng)將根據(jù)this調(diào)用里傳入的實(shí)參列表調(diào)用本類中的另一個(gè)構(gòu)造器。執(zhí)行本類中另一個(gè)構(gòu)造器時(shí)即會(huì)調(diào)用父類構(gòu)造器。
C,子類構(gòu)造器執(zhí)行體中既沒有super調(diào)用,也沒有this調(diào)用,系統(tǒng)將會(huì)在執(zhí)行子類構(gòu)造器之前,隱式調(diào)用父類無參數(shù)的構(gòu)造器。
第四天
1.方法的重寫(override):
  1)發(fā)生在父子類中,方法名相同,參數(shù)列表相同,方法體不同
  2)重寫方法被調(diào)用時(shí),看對象
2.重寫與重載的區(qū)別:----常見面試題
  1)重寫:
    1.1)父子類中,方法名相同,參數(shù)列表相同
    1.2)遵循"運(yùn)行期"綁定,根據(jù)對象的類型調(diào)用方法
  2)重載(overload):
    2.1)同一個(gè)類中,方法名相同,參數(shù)列表不同
    2.2)遵循"編譯期"綁定,根據(jù)引用的類型綁定方法
3.package:
  1)避免類的命名沖突
  2)類的完全限定名:包名.類名
  3)包名建議所有字母小寫
  import:
  1)同包中的類可以直接訪問,
    不同包中類訪問兩種方式:
    1.1)通過import聲明類/引入類
    1.2)完全限定名----繁瑣
  2)語法: import 包名.類名;
4.訪問控制修飾符:
  1)public:公開的,任何類
  2)private:私有的,本類
  3)protected:受保護(hù)的,本類、子類、同包類
  4)默認(rèn):什么也不寫,本類、同包類
  說明:
    1)類的訪問控制只能是public和默認(rèn)
    2)類中的成員如上4種都可以
5.static:靜態(tài)的
  1)靜態(tài)變量:
    1.1)由static修飾
    1.2)是屬于類的,存在方法區(qū)中,只有一份
    1.3)常常通過類名.來訪問
    1.4)何時(shí)用:所有對象的數(shù)據(jù)都一樣時(shí)使用
  2)靜態(tài)方法:
    2.1)由static修飾
    2.2)是屬于類的,存在方法區(qū)中,只有一份
    2.3)常常通過類名.來訪問
    2.4)靜態(tài)方法沒有隱式this傳遞,
        所以靜態(tài)方法中不能直接訪問實(shí)例成員
    2.5)何時(shí)用:方法的操作僅與參數(shù)相關(guān)而與對象無關(guān)
  3)靜態(tài)塊:
    3.1)由static修飾
    3.2)類被加載時(shí)自動(dòng)執(zhí)行,類只被加載一次,
        靜態(tài)塊只執(zhí)行一次
    3.3)何時(shí)用:常常用于加載靜態(tài)資源(圖片、音頻、視頻等)
6.final:最終的
  1)修飾變量:變量不能被改變
  2)修飾方法:方法不能被重寫
  3)修飾類:類不能被繼承
7.static final-----------自學(xué)
補(bǔ)充知識點(diǎn):
1.實(shí)例變量多還是靜態(tài)變量多?
----------實(shí)例變量多
----------靜態(tài)方法不可能多
2. 靜態(tài)方法沒有隱式的this傳遞,
沒有this意味著沒有對象,
實(shí)例變量是屬于對象,必須通過對象點(diǎn)來訪問
所以靜態(tài)方法中不能直接訪問實(shí)例成員
3. 成員變量:
1)實(shí)例變量:屬于對象的,存在堆中,
           有幾個(gè)對象有幾份  通過對象點(diǎn)來訪問
2)靜態(tài)變量:屬于類的,存在方法區(qū)中,
           只有一份   通過類名點(diǎn)來訪問
4.重寫遵守"兩同兩小一大"原則:----等于時(shí)絕對正確
* 1)兩同:
*   1.1)方法名相同
*   1.2)參數(shù)列表相同
* 2)兩小:
*   2.1)子類的返回值類型小于或等于父類的
*       2.1.1)void和基本類型時(shí),必須相同
*       2.1.2)引用類型時(shí),小于或等于父類的
*   2.2)子類拋出的異常小于或等于父類的-----異常之后
* 3)一大:
*   3.1)子類的訪問權(quán)限大于或等于父類的-----修飾符之后
5.方法重載的要求是“兩同一個(gè)不同“的原則,
* 1)兩同:
*   1.1)方法名相同,
同一類中是指兩個(gè)方法可以是同一個(gè)類中聲明的,或者是繼承來的,抑或一個(gè)是聲明的,另一個(gè)是繼承來的
*   1.2) 同一類
* 2)一不同:參數(shù)列表不同
6. 對于類的修飾可以使用public和默認(rèn)方式。 其中,public修飾的類可以被任何一個(gè)類使用,而默認(rèn)訪問控制的類只可以被同一個(gè)包中的類使用。
而protected和private訪問修飾符是不可以修飾類的,但其可以修飾內(nèi)部類(后面課程詳細(xì)介紹)。
7. 關(guān)于package和import語句,下面說法錯(cuò)誤的是:
A. package 提供了一種命名機(jī)制,用于管理類名空間
B. 定義類時(shí),除了定義類的名稱以外,必須要指定一個(gè)包名
C. import語句用于導(dǎo)入所需要的類
D. 同時(shí)使用不同包中相同類名的類,包名不能省略
8. final關(guān)鍵字修飾成員變量,意為初始化后不可改變(對象一旦創(chuàng)建即不可改變),那么該成員變量可以在聲明時(shí)賦初始值,也可以在構(gòu)造方法或是靜態(tài)代碼塊中初始化。
第五天
1.static final常量:
  1)常量必須聲明同時(shí)初始化
  2)不能被改變、通過類名.來訪問
  3)常量名建議所有字母大寫,多個(gè)單詞用_分隔
  4)在編譯時(shí)被直接替換為具體的值---效率高
2.抽象方法:
  1)由abstract修飾
  2)只有方法的定義,沒有方法的具體實(shí)現(xiàn)(連{}都沒有)
3.抽象類:
  1)由abstract修飾
  2)包含抽象方法的類必須是抽象類
    若一個(gè)類中沒有抽象方法,也可以聲明為抽象類---我愿意
  3)抽象類不能被實(shí)例化(new)
  4)抽象類是需要被繼承的,子類:
    4.1)重寫父類的所有抽象方法--常用
    4.2)也聲明為抽象類----不常用
  5)抽象類的意義:
    5.1)封裝子類所共有的數(shù)據(jù)和行為--子類重用
    5.2)為所有子類提供了一種公共的類型--向上造型
    5.3)包含抽象方法,為所有子類提供統(tǒng)一的入口
4.接口:
  1)是一個(gè)標(biāo)準(zhǔn)、規(guī)范
    只要符合了這個(gè)標(biāo)準(zhǔn)、就能干某件事---API
  2)由interface定義
  3)只能包含常量和抽象方法
  4)接口不能被實(shí)例化
  5)接口是需要被實(shí)現(xiàn)/繼承的,實(shí)現(xiàn)類/子類:
      必須重寫接口中的所有抽象方法
  6)一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,
    若又繼承又實(shí)現(xiàn)時(shí),必須先繼承后實(shí)現(xiàn)
  7)接口可以繼承接口
補(bǔ)充知識點(diǎn)
1. 抽象類中可以包含抽象方法和非抽象方法,而接口中的所有方法均為抽象的。
2. 接口里不包含構(gòu)造器;抽象類里可以包含構(gòu)造器,抽象類里的構(gòu)造器并不是用于創(chuàng)建對象,而是讓其子類調(diào)用這些構(gòu)造器來完成屬于抽象類的初始化操作
3. //演示接口的基礎(chǔ)語法
1 interface Inter1{ 2 public static final int NUM = 250;3 public abstract void show();4 double PI = 3.14159; //默認(rèn)public static final5 void say(); //默認(rèn)public abstract6 }

第六天
正課:
1.多態(tài):多種形態(tài)
  1)多態(tài)的意義:
    1.1)同一類型的引用在指向不同的對象時(shí),有不同的實(shí)現(xiàn)
          行為的多態(tài): cut(),run()
    1.2)同一對象被造型為不同的類型時(shí),有不同的功能
          對象的多態(tài): 我,水
  2)向上造型:
    2.1)父類型的引用指向子類的對象
    2.2)能造型成的類型:父類、所實(shí)現(xiàn)的接口
    2.3)能點(diǎn)出來什么,看引用的類型
  3)強(qiáng)制類型轉(zhuǎn)換,成功的條件只有兩個(gè):
    3.1)引用所指向的對象,就是該類型
    3.2)引用所指向的對象,實(shí)現(xiàn)了該接口
  4)只要不符合如上兩個(gè)條件,
    則發(fā)生ClassCastException類型轉(zhuǎn)換異常
    一般在轉(zhuǎn)換之前先通過instanceof判斷:
      引用所指向的對象是否是該類型
2.成員內(nèi)部類:單獨(dú)應(yīng)用的幾率不太大
  1)類中套類,里面的叫內(nèi)部類Inner,外面的叫外部類Outer
  2)內(nèi)部類通常只服務(wù)于外部類,對外不具備可見性
  3)通常在外部類中創(chuàng)建內(nèi)部類的對象
  4)內(nèi)部類中可以直接訪問外部類的成員(包括私有的)
    內(nèi)部類中有一個(gè)隱式的引用指向了創(chuàng)建它的外部類對象
      外部類名.this.
3.匿名內(nèi)部類:
  1)想創(chuàng)建一個(gè)類(子類)的對象,并且該對象只創(chuàng)建一次,
    此時(shí)該類不必命名,稱之為匿名內(nèi)部類
  2)內(nèi)部類(成員、匿名)有獨(dú)立的.class
4.面向?qū)ο笕筇卣?
  1)封裝:
    1.1)類:封裝的是對象的特征和行為
    1.2)方法:封裝的具體的業(yè)務(wù)邏輯/實(shí)現(xiàn)
    1.3)訪問控制修飾符:封裝的是訪問的權(quán)限
  2)繼承:
    2.1)便于代碼的重用
    2.2)extends,父:共有的 子:特有的
  3)多態(tài):
    3.1)意義:
        3.1.1)同一類型的引用指向不同對象時(shí),有不同的實(shí)現(xiàn)
                       行為的多態(tài)
               3.1.2)同一對象被造型為不同的類型的,有不同的功能
                       對象的多態(tài)
    3.2)向上造型、強(qiáng)制轉(zhuǎn)換、instanceof
    3.3)兩種表現(xiàn)形式:
        3.3.1)重寫
               3.3.2)重載
知識點(diǎn)補(bǔ)充:
1.父類大,子類小
類型轉(zhuǎn)換:
1)自動(dòng)類型轉(zhuǎn)換:從小到大
2)強(qiáng)制類型轉(zhuǎn)換:從大到小
2. 設(shè)計(jì)原則:
1)將公共的特征和行為抽到父類中
2)若所有子類行為都一樣,設(shè)計(jì)為普通方法
  若所有子類行為不一樣,設(shè)計(jì)為抽象方法
3)符合既是也是的關(guān)系時(shí),使用接口
3. 繼承要符合is a的關(guān)系
4.   1)創(chuàng)建了Inter2的一個(gè)子類,沒有名字
2)為該子類創(chuàng)建了一個(gè)對象,名為o3
3).大括號中的為該子類的類體
Inter2 o3 = new Inter2(){};
知識點(diǎn)鞏固:

1 1.public class Answer { 2 public static void main(String[] args) { 3 int score = 20; 4 Answer ans= new Answer(); 5 ans.add(score); 6 System.out.println(" main: score = " + score); 7 } 8 void add(int score) { 9 System.out.println(" add: score=" + score++);10 }11 }

解析:輸出add: score=20
main: score =20
原因是score只定義在main函數(shù)中,作用域也是main函數(shù),程序調(diào)用ans.add函數(shù)時(shí),往函數(shù)中傳給了參數(shù)score=20,但是這個(gè)函數(shù)沒有返回值。Main函數(shù)中輸出的還是變量score=20

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表