java 物件導向總結

2020-08-12 18:49:26
			#一、概念

##1.1基本概念
1、物件導向:三大特徵: 封裝、繼承、多型
2、物件:客觀事物的實體(具體)
3、類:具有相同屬性和方法的一組物件的集合(抽象)
##1.2 定義類
1 、定義類
存取修飾符]class 類名{}
存取修飾符有4種:public private protected 預設的
2、屬性
物件所擁有的靜態特徵即屬性
3、方法
物件執行操作的行爲稱爲類的方法
方法的返回型別有兩種:
1、無返回值:void(),方法體中不必使用"return"關鍵字,但是可以使用return關鍵字,退出方法。
2、有返回值:在方法體中一定要使用」return「,否則編譯報錯,小括號的參數型別和參數名必須對應,多個參數列表用 」,「分隔開
##1.3建立和使用物件
1.建立物件 :類名 物件名=new 類名();
(1)左邊的類名:物件 的數據型別
(2)右邊的類名():類的構造方法
物件導向的優點:(1)與人的思維一樣;(2)資訊隱藏;(3)提高了程式的可重用性,一個類可以創多個物件
物件陣列:
方法過載
同一個類中,方法名相同,參數型別或者參數個數不同,與返回值無關,簡化類呼叫方法的程式碼
成員變數
作用域:直接在類中定義的變數(成員變數),即方法的外部
在整個類中都可用,如果存取許可權允許,在類外部都可以使用,有預設初始值(基本數據型別爲0,參照型別爲null)
區域性變數: 定義在方法內部的變數,只是在方法體裏面使用時需要賦值,否則編譯報錯,同一個方法體內不允許有同名的區域性變數,不同方法體之間可以有同名的區域性變數,
區域性變數具有更高的優先順序
數據型別
基本數據型別:byte short char int long float double boolean
參照數據型別:String 類 陣列 介面
構造方法
建立一個物件時會自動呼叫該類的構造方法
作用:進行數據的初始化
注意:構造方法無返回值,預設構造方法沒有參數 ,方法名與類名相同
構造方法的過載:
this關鍵字
是對一個物件的預設參照。每個實體方法內部都有一個this參照變數
作用:
(1)用this 呼叫成員變數,解決同名衝突
(2)this呼叫成員方法
(3)this呼叫過載的構造方法,只能在構造方法中使用,且必須是構造方法的第一條語句

注意:this不能呼叫(類變數和類方法 static修飾),也不能呼叫區域性變數

					****封裝****

作用:(1)將類的狀態資訊隱藏到類內部,不允許外部程式直接存取,通過該類提供的方法來存取(2)事物相對獨立性 (3)隱藏類的實現細節(4)松耦合(降低程式碼之間的關聯性,和依賴性)
步驟:
(1)將類的屬性私有化(private)
(2)爲私有屬性新增getter/setter()方法。在setter方法中利用判斷語句進行賦值限制
(3)設定必要的讀取許可權

作用:(1)包也是封裝的一種形式 (2)防止命名衝突,不同的包中類才能 纔能重名(3)類似於資料夾,將類組合成較小的單元
定義包:
package 包名:在Java原始檔的第一條非註釋語句,一個原始檔只能右一個包
包名全部小寫的ASCII字母
使用import匯入包
static 關鍵字(靜態)
使用static修飾的屬性和方法屬於類,不屬於物件,可以直接通過類名"."直接呼叫類的成員
(1)修飾屬性
static修飾的屬性稱爲:靜態變數或者類變數*
無static修飾的叫範例變數
(2)修飾方法
static修飾的方法叫做靜態方法或者類方法
無static修飾的叫實體方法
注意:靜態方法中不能直接存取範例變數和實體方法
實體方法中可以直接呼叫類中定義的靜態常數和靜態方法

**常數final修飾,**不能改變
eg: static final int PERSON_LIVE=1;

				**繼承**

作用:
(1)解決程式碼冗餘
(2)實現程式碼重用
(3)增加軟體的可擴充性
Java中類只支援單繼承(extends)
子類可以繼承父類別的哪些內容:
(1)繼承public和protected修飾的屬性和方法,無論是否在一個包裏面
(2)繼承預設存取修飾符修飾的屬性和方法,子類和父類別必須在一個包裏面
子類不能繼承父類別的哪些內容:
(1)無法繼承父類別的構造方法
(2)private修飾的屬性和方法
(3)不同包的預設存取修飾符
使用繼承和重寫完善類的結構:
步驟:(1)extends繼承(2)super()呼叫父類別成員 (3)重寫父類別的方法輸出子類自身的資訊

使用super關鍵字呼叫父類別成員
注意:super只能用在子類,
不能存取父類別的private成員
作用:(1)存取直接父類別中被遮蔽的內容(2)提高程式碼的重用性和靈活性
(3)super可存取父類別的構造方法、父類別的成員、父類別的屬性、父類別的方法

範例化子類物件時構造方法的執行
一、類的構造方法總執行:
建立該類的物件(範例化)
建立該類的子類的物件(子類的範例化)
子類在範例化時先執行父類別的構造方法,後執行自身的構造方法
子類繼承父類別時構造方法的呼叫規則如下:
(1)如果子類的構造方法中沒有通過super呼叫父類別的有參構造,也沒有通過this呼叫自身的其他構造,則會先呼叫父類別的無參構造
(2)如果子類的構造方法中通過super呼叫父類別的有參構造,則執行相應的父類別的構造方法,不執行父類別的無參構造方法
(3)如果子類的構造方法中通過this呼叫自身的其他構造,則遵循以上條
注意:如果存在多級繼承,在建立一個子類物件時,一直執行到頂級父類別(Object)的無參構造方法

object類所有類的父類別
object類常用的方法:
toString()…返回字串物件
equals()…比較是否爲同一個物件
clone()…生成當前物件的一個副本,並返回
hashCode()…返回該物件的雜湊程式碼值
getClass()…獲得當前物件所屬的類資訊,返回class物件

方法重寫(Overriding):
重寫與被重寫的方法要求:
方法名相同 參數列表相同 返回值型別相同或是其子
注意:重寫方法不能縮小被重寫方法的存取許可權

					**多型**

含義:一個特定型別的變數可以參照不同類型的物件,並且能自動呼叫參照物件的方法,實現不同的操作重寫是多型的基礎

1、向上轉型:子類向父類別的轉換
Pet pet=new Dog();
將一個父類別的參照指向一個子類的物件
呼叫子類覆蓋父類別的方法,但是,呼叫不了子類特有的方法

2、向下轉型:父類別型別轉換爲子類型別
Dog dog=(Dog)pet;將一個指向子類物件的父類別參照賦給一個子類的參照
實現子類特有的方法
注意*:轉換時如果不是真實的子類時會出現異常藉助於( instanceof )關鍵字,該關鍵字前面的物件型別必須和後面的參數所指定的類右繼承關係,不然編譯錯誤*
多型的應用:
1、使用父類別作爲方法的形參

//主人類
class Host(){
public void letCry(Pet pet){
pet.cry();//呼叫動物叫的方法
	}
}
//呼叫程式碼
public class Test{
public  static void  main(String[]args){
Host host=new Host();
Pet pet;
pet=new Dog();
host.letCry(pet);
}
}

2、使用父類別作爲方法的返回值

//主人類
class Host{
//贈送動物
public  Pet donatePet(String type){
Pet pet;
if(type==dog){
pet=new Dog();
}
return pet;
}
}
//呼叫類
public class Test{
public static void main(String[]args){
Host host=new Host();
Pet pet;
pet=host.donatePet("dog");
pet.cry();
}
}

注意:
1、抽象類不能被範例化
2、子類如果不是抽象類,則必須重寫抽象父類別的全部抽象方法
3、abstract 修飾符不能和 final 修飾符一起使用
4、abstract 修飾抽象方法,沒有方法體
5、private 關鍵字不能用來修飾抽象方法

多型的優點:
可替換性 可擴充性 介面性 靈活性 簡化性

				**抽象類和介面**
****被abstract 修飾的類,抽象類裏面的抽象方法,沒有方法體
抽象類沒有具體的實現,但是其子類如果不是抽象類則子類可以範例化。,抽象方法只能在抽象類中****

介面:可看作特殊的抽象類,全部爲抽象方法
不能被範例化
注意:1、定義介面interface,存取修飾符只能是public
2、介面成員爲全域性常數和公共的抽象方法
3、子類通過implements 實現介面

定義和實現介面時:
1、介面和類、抽象類一個層次,命名規則一樣
2、修飾符如果是public ,則在整個專案中可見,如果不寫,則該介面只能在當前包中可見
3、介面中全部是常數,屬性預設用 " public static final "修飾介面中所有屬性都是全域性靜態常數。必須賦初值

//兩種定義方式等價,在介面中
public static final int PI=3.14;
int PI=3.14;
4、介面中全是抽象方法,預設public
5、介面不能範例化,不能有構造方法
6、介面之間可以通過extends繼承,且一個介面可以繼承多個介面,但介面不能被繼承,
7、類可以通過implements 實現多個介面,該類必須實現介面的全部方法,不然該類必須定義爲抽象類
8、一個類如果既有繼承又有實現介面,必須繼承在前
//繼承在前。實現介面在後
//A類繼承B類,實現介面c,d,e
public class A extends B implements c,d,e,{}
					**異常的捕獲和處理**

例外處理的步驟:

try-catch
try-catch-finally
使用多重catch 塊處理

異常的體系結構:
(1)Error類:程式本身無法恢復,記憶體溢位、動態鏈接失敗、虛擬機器錯誤
(2)Exception類
(3)執行時異常
(4)Checked異常(非執行時異常)
自定義異常
//常見的異常類
Exception //異常層次結構的根
ArithmeticException//算術錯誤異常,如除數爲零
ArrayIndexOutOfBoundsException//陣列下標越界
NullPointerException//空指針(存取的物件成員爲null)
ClassCastException//物件強制轉換出錯
NumberFormatException//數位格式化轉換異常,如把abc 轉換成數位

例外處理的5大關鍵字:try catch finally throw throws

try-catch-finally 
try 必須存在。catchfinally 二者至少出項一個
finally表示總被執行,除非System.exit(1),退出虛擬機器;不執行
//使用多重catch時,catch的排列順序必須是子類到父類別
try{
Scanner input=new Scanner(System,in)int totalTime=input.nextInt();
}catch(InputMismatchException e1){
System.err.println("必須輸入數位")}catch(Exception e2){
System.err.println("發生錯誤")}

使用throws 宣告拋出異常
throws宣告某個方法可能拋出的各種異常,異常之間用 」,「 隔開

使用throw拋出異常
1、throw用於程式設計師自行產生並拋出異常,throws 用於宣告該方法內拋出了異常
2、throw 位於方法體內部,可以作爲單獨語句使用;throws 必須在方法參數列表的後面,不能單獨使用
3、throw 拋出一個異常物件,只能一個;throws 後面跟異常類。可以多個

			**JAVA高階特性**
一、集合框架和泛型

集合框架在这集合里插入图片描述
介面:
collection :儲存一組不唯一、無序的物件
map:鍵值對(單向對映),鍵唯一

collection:
List:儲存一組不唯一、有序的物件
set:儲存一組唯一、無序的物件
List介面
(1)ArrayList: 動態陣列, 長度可變 , 記憶體分配連續空間 儲存任何型別的數據,
優點:遍歷和隨機存取元素的效率高

//ArrayList常用方法
boolean add(Object o);//在列表末尾新增O元素
void add(int index,Object o);//在指定下標位置新增O元素
int size();//元素個數
Object get(int index);//取出該位置下的元素(Object)型別
void set(int index,Object obj);//將該位置的元素替換成obj
boolean contains(Object o);//判斷列表是否有O元素
int indexOf(Object obj);//返回該元素在集閤中的下標
boolean  remove(Object o);//刪除指定元素
Object  remove(int index);//刪除對應下標的元素

(2)LinkedList:
儲存方式:鏈表儲存方式
優點:插入和刪除元素效率比較高

//常用方法
xxxFist();
XXXLast();

set介面
(1)、HashSet–>查詢效率高
特點:集合內元素無序 非執行緒安全 允許集合元素爲null

//常用方法
Boolean add();//新增元素
void clear();//清空集合
int size();//集合元素個數
boolean isEmpty();//是否爲空
boolean contains();//是否爲空
boolean remove();//刪除元素

Map介面
儲存鍵值對key–>value 不要求有序,但是唯一

//常用方法
Object put(key,value);//新增鍵值對
remove(key);//刪除key返回對應的value
get(key);//獲取key對應的value 如果不存在則返回null
boolean containsKey(key);//是否包含key
boolean containsValue(value);/是否包含value
boolean isEmpty();//是否爲空
void clear();//清空
int size();//鍵值對數
Set key(Set);//獲取所有Key的集合
Collection values();//獲取所有value 的集合
二、實用類
String類常用的方法
length();//字串長度
equals();//比較字串
concat();//連線兩個字串
substring();//提取字串
indexOf();//索引字串
split();//拆分字串
replace()//替換字串

StringBuffer

//常用方法
toString();//轉string
append();//連線字串
insert();//插入字串
三、I/O和反射機制 機製
一、反射機制 機製:
//反射在多型中的應用,不用instanceof
package fanshe;

/**
 * 父類別:貨物類
 */
public  abstract class Goods {
    private  String name;

    public Goods() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //抽象方法
    public  abstract  void print();
}

package fanshe;
/**
 * 子類
 */
public class Food extends Goods {
    @Override
    public  void print(){
        System.out.println("輸出食品名稱:"+super.getName());
    }

}
package fanshe;

public class Tv extends  Goods {
    @Override
    public void print() {
        System.out.println("輸出TV名稱:"+super.getName());
    }
}
package fanshe;

public class Test {
    //生產一個商品:父類別作爲方法返回值型別(多型)
    //className使用者想要獲得的商品型別,這裏爲 Food Tv 類的完整限定名包括包名
   public  Goods getGoods(String className){
       //獲取型別對應的Class物件範例
       //通過Class的newInstance()生成相應型別的範例,即使用者所需要的物件
       Goods goods=null;
       try {
           //關鍵程式碼
           goods=(Goods)Class.forName(className).newInstance();
       } catch (InstantiationException e) {
           e.printStackTrace();
       } catch (IllegalAccessException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       }
       return  goods;
   }
        //測試類
    public static void main(String[] args) {
        Test test=new Test();
        //生成使用者需要的子類物件(包名.類名)!!!
        Goods goods=test.getGoods("fanshe.Food");
        goods.print();

        Goods goods2=test.getGoods("fanshe.Tv");
        goods2.print();

    }
}
//輸出結果:
輸出食品名稱:null
輸出TV名稱:null