面向對象

第二章:面向對象


面向對象的三大特點:封裝、繼承、多態。
 
封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共的訪問方式。
封裝的好處:將變化隔離、便於使用、提高重用性、提高安全性。
封裝的原則:
將不需要對外提供的內容都隱藏起來;把屬性都隱藏,提供公共方式對其訪問。
 
構造函數:
對象一建立就會調用與之對應的構造函數;構造函數的作用是給對象進行初始化;一個類中如果沒有定義構造函數,那麼系統會自動創建一個空參數的構造函數;如果類中定義了構造函數那麼默認的構造函數就沒有了;對象一建立構造函數就會執行,且只執行一次。
構造代碼塊:
作用也是給對象進行初始化。與構造函數的區別:優先於構造函數執行;構造代碼塊是給所有對象進行統一初始化,而構造函數是給相對應的對象進行初始化。
 
This關鍵字:
This代表所在函數中所屬的對象的引用。簡單說,哪個對象在調用this所在的函數,this就代表哪個對象。
This的應用:當定義類中的函數時,該函數內部要調用該類的對象時,就用this來表示此對象。但凡本類函數內部使用到的本類對象,都用this表示。
This()語句:
1.用於構造函數之間進行互相調用 。
2.只能定義在構造函數的第一行,因爲初始化要先執行。
 
Static關鍵字:
Static(靜態)用於修飾成員(方法、變量);當成員被靜態修飾後就多了一個調用方式,除了被對象調用外,還可以直接被類名調用:類名。靜態成員   
String name;//實例變量
Static string name="lisi";//靜態成員變量,類變量
實例變量與類變量的區別:
1.存放位置:類變量隨着類的加載而存在內存的方法區中;實例變量隨着對象的建立而存在於堆內存中。
2.生命週期:類變量的生命週期最長,隨着類的消失而消失;實例變量的生命週期隨着對象的消失而消失。
Static靜態使用注意事項:
1.靜態方法只能訪問靜態成員。非靜態即可訪問靜態的也可訪問非靜態的。
2.靜態方法中不可以定義this / super關鍵字。因爲靜態優先於對象存在。
 
單例設計模式:解決一個類在內存中只有一個對象。
單例模式-餓漢式舉例:
class Stu
{
private int age;
 
private static final Stu s = new Stu();//在類本身內部建立一個對象
private Stu()//把構造函數私有化
{}
public static Stu getStu()//提供僅供訪問
{
return s;
}
 
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
 
單例模式-懶漢式舉例:
class Stu
{
private int age;
 
private static final Stu s = null;//在類本身內部建立一個對象
private Stu()//把構造函數私有化
{}
public static Stu getStu()//提供僅供訪問
{
If(s==null)
s=new Stu();
return s;
}
 
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
 
繼承:extends
如果子類中出現了與父類相同的非私有同名成員變量時;子類訪問本類同名成員變量用:this,子類訪問父類同名成員變量用super。
函數的重寫:當子類出現與父類一模一樣的函數時,子類對象調用該函數時運行的是子類中的函數,如同父類中的函數被覆蓋一樣。
注:子類重寫父類時子類的權限必須大於等於父類的權限;靜態只能重寫靜態;構造函數不能重寫。
子父類中的構造函數:
在對子類對象進行初始化時父類中的構造函數也會進行初始化,這是因爲子類中的構造函數中默認第一行有一條隱式的super()語句,super()語句會訪問父類中無參數的構造函數;而且子類中的所有構造函數第一行都有一條super()。
 
Final(最終)關鍵字:
1.用來修飾類、函數、變量;
2.Final修飾的類不可以被繼承;
3.Final修飾的函數不可以被重寫;
4.Final修飾的變量,值不可改變,即常量。
 
Abstract 抽象修飾符:
1.抽象方法一定在抽象類中;
2.抽象類不可以用NEW來創建對象。
3.抽象類中的函數要被使用必須由子類重寫抽象類中的所有抽象函數後,建立子類對象進行調用。
 
接口:
1.格式:interface {}
2.接口中的成員修飾符是固定的;成員變量:public static final,成員函數:public abstract
3.接口是不可以創建對象的,因爲函數是抽象的。
4.接口需要被子類實現(implement),子類必須把接口中的所有抽象函數進行重寫後才能創建對象進行調用。
5.子類可能實現多個接口(java不支持多繼承,通過多實現對多繼承的一種轉型)
6.接口與接口之間可以進行繼承(extends),接口與接口可以多繼承。
 
多態性:
1.多態的體現:
  父類的引用指向了自己子類的對象。
  父類的引用也可以接收自己子類的對象。
2.多態的前提:
  必須類與類之間有關係,繼承(extends)或實現(implement),通常還有一個前提就是存在重寫。
3.多態的好處:提高了程序的擴展性。
4.多態的弊端:父類的引用只能訪問父類中的成員。
 
多態-轉型:
例:
Class A{}
Calss B extends A{}
A a = new B();//父類的引用指向了子類對象,向上轉型(提升)
B c = (B)a;//父類的引用a轉型成子類,向下轉型(強制轉換)
轉型注意事項:
1.不能將父類對象轉型成子類類型。
2.父類引用指向了自己子類的對象時,該引用可以被提升,也可以被強制轉換。
3.多態自始至終都是子類對象在做着轉型變化。
 
在多態中成員函數的特點:
在編譯時期:參閱引用型變量所屬的類中是否有被調用的函數。如果有編譯通過,如果沒有編譯失敗。
在運行時期:參閱對象所屬類中是否有被調用的函數。
簡單總結:成員函數在多態調用時,編譯看左,運行看右。
 
在多態中成員變量的特點:
無論編譯還是運行,都參閱左邊(引用型變量所屬的類)。
 
在多態中靜態函數的特點:
無論編譯還是運行,都參閱左邊(引用型變量所屬的類)。
 
內部類、嵌套類:
1.內部類可以直接訪問外部類的成員,包括私有成員(static)
2.外部類要訪問內部類成員必須要建立內部類對象。
3.內部類被static修飾後只能訪問外部類中的static成員。
4.內部類中的成員是static時內部類也必須是staitc。
內部類定義在局部(如函數中等)時:
1.內部類不能被成員修飾符所修飾。
2.可以直接訪問外部類中的成員,因爲還持有外部類的引用;但是不可以訪問它所在的局部中的變量,只能訪問被final修飾的變量。
 
匿名內部類:
1.匿名內部類其實就是內部類的簡寫格式;
2.定義匿名內部類的前提:內部類必須是繼承(extends)一個類或實現(implement)一個接口。
3.匿名內部類的格式:new 繼承的類/實現的接口(){ 定義子類的內部 }
4.匿名內部類中定義的函數最好不要超過三個。
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章