1、類的概念:java
類通常包括兩個部分:屬性(成員變量)和方法(成員方法)
方法組成部分:修飾符(可選) 返回值類型(必須) 方法名(必須)參數列表(可選)數組
package com.classTest.project; public class ClassTest {
//成員變量 String name; int age;
//成員方法 public void count(){ this.age+=1; } }
2、定義方法的幾點說明安全
一、返回值類型:基本數據類型(整型(int)、浮點型(float)、字符串類型(String)、字符型(char)等)、引用數據類型(數組、類、接口)模塊化
例子:測試
①基本數據類型做爲返回值類型:this
⑴整型(int)spa
⑵浮點型(float)code
⑶字符串類型(String)對象
⑷字符型(char)blog
package com.returntype.project; public class BasicData { public static void main(String[] args) { BDMethod BdMethod=new BDMethod(); int getInt=BdMethod.getInt(); System.out.println("返回值爲整型的返回的內容:"+getInt); float getFloat=BdMethod.getFloat(); System.out.println("返回值爲浮點型的返回的內容:"+getFloat); String getString=BdMethod.getString(); System.out.println("返回值爲字符串型的返回的內容:"+getString); char getChar=BdMethod.getChar(); System.out.println("返回值爲字符的返回的內容:"+getChar); } }
package com.returntype.project; public class BDMethod { public int getInt(){ return 2; } public float getFloat(){ return 3.2f; } public String getString(){ return "返回值String類型"; } public char getChar(){ return 'a'; } }
②引用數據類型做爲放回值類型:
⑴數組
⑵類
⑶接口
二、修飾符:訪問級別(public、private、protect、default)
同一類 | 同一包 | 不一樣包的子類 | 不一樣包的非子類 | |
public | ✔ | ✔ | ✔ | ✔ |
protect | ✔ | ✔ | ✔ | |
default | ✔ | ✔ | ||
private | ✔ |
三、參數列表:
實參:它是指方法在被調用時,參數列表所傳入的參數
基本數據類型爲實參時,直接以變量的形式傳入
引用數據類型爲實參時,數組是把數組名傳入,類是把對象名傳入,接口通常不作爲實參傳入
例子:
sum(a,b);//這裏的a和b是實參
形參:它是指方法在定義時,參數列表所寫的參數
基本數據類型做爲形參時,直接以變量的形式傳入
引用數據類型做爲形參時,以數組聲明的方式或者以類聲明引用變量的方式
例子:
void sum(int a,int b);//這裏的a和b是形參
四、方法的注意事項:
一、方法中不能定義方法
//錯誤例子 public void sum(){ void change(); }
二、實參不能帶數據類型
//錯誤例子 sum(String name,int age);
三、實參與形參要爲同一類型(自動類型轉換除外)
例如:void sum(String name,int age)
sum(username,userage)//name的類型必須是String,userage的類型必須是int
四、傳參:
一、String類型變量,在沒有給他賦值時,默認值null, int類型的變量默認爲0,double類型的變量默認爲0.0
二、局部變量和成員變量
局部變量(在方法中定義)
成員變量(在類中定義)
3、構成方法:
一、爲何要用構造方法:
構造方法至關因而提供一個場所,爲建立一個對象而提供的一個場所。
二、構造方法的注意事項:
①構造方法的名字跟類名同樣
②無返回類型
③若是在類中沒有定義構造方法,系統默認會創造一個無參數的構造方法,只要在類中定義本身的構造方法,系統便不會再創造參數的構造方法
三、帶參數的構造方法:能夠爲成員變量初始化
getter and setter 的做用:
(1)安全性,裏面參數不能隨意修改;
(2)類提供給外面的接口;
四、方法的重載:
定義:在同一個類中,方法名相同,參數的個數或者類型不一樣
判斷方法是否是重載的依據:
①方法是否在同一個類中
②方法名是否相同
③方法的參數個數或者類型是否不一樣
五、修改屬性(成員變量的可見性):
①經過訪問修飾符設置 訪問修飾符;public private protected default
②public修飾的成員變量和方法:類、外部能夠直接訪問
③private修飾的成員變量和方法:類裏面是能夠直接訪問,可是外部不可訪問
六、static關鍵字的使用:
由static關鍵字修飾的成員變量和方法,他們屬於類自己,他們分別叫靜態成員變量或者靜態成員方法
靜態成員變量定義語法:
修飾符 static 關鍵字 類型 變量名
好比:public static int i=0;
如何使用:
一般採用類名+"."調用或者不推薦採用對象名+"."調用
語法:類名.靜態成員變量 或者 類名.靜態成員方法
靜態成員方法語法:
修飾符static 返回類型 方法名(參數列表){
//方法體
}
引用靜態成員如何使用:
一般採用類名+"."調用或者不推薦採用對象名+"."調用
語法:類名.靜態變量 或者 類名.靜態成員方法
注意事項:
①靜態成員方法中,只能調用靜態成員方法和靜態變量,且靜態變量不能用this引用
②不是有static關鍵字的修飾方法,稱做爲對象方法
③在對象方法中,能夠用靜態成員方法
package com.classTest.project; public class ClassTest { int age;//不是由static關鍵字修飾的成員變量或成員方法,它們只屬於對象才能夠引用 static int num;//有static關鍵字修飾的成員方法或者成員變量,它們是屬於類自己,不依賴於對象而存在,可是對象能夠去引用它們,可是不推薦經過對象去引用,他們的引用方式:類名.成員變量(成員方法)
public void count(){
//兩種的表達形式均可以 this.age+=1; age+=1; } public void count1(){ //普通方法便可調用普通方法和調用靜態方法,也能夠調用成員變量和靜態變量 this.age+=1; num+=1; count(); num1(); } public static void num1(){ num+=1;//調用的變量必須是靜態變量,但是不能用this引出來
// this.num+=1;//出錯,this當前類的對象,解決成員變量和局部變量同名衝突,this不能使用在由static關鍵字修飾的成員方法中使用
num2();//調用的方法必須是靜態方法 // count();//會報錯,由於該方法不是靜態方法 } public static void num2(){ } }
package com.classTest.project; class Test{ public static void main(String[] args) { //引用類中的靜態方法和靜態變量,一般採用類名+"."調用,語法:類名.靜態變量 或者 類名.靜態成員方法 ClassTest.num+=1; ClassTest.num1(); ClassTest.num2(); } }
七、構造方法的引用:
package com.classTest.project; public class ClassTest { String name; int hobby; int weight; public ClassTest(int weight){ this.weight=weight; } public ClassTest(String name,int hobby,int weight){ this(weight);//經過this去引用其餘重載的構造方法,該語句必須放在第一行 this.name=name; this.hobby=hobby; // this(weight);//報錯 } }
包的做用:便於管理咱們的代碼
3、繼承、封裝、多態
一、繼承(extends):提升代碼的複用性
封裝:使代碼模塊化,提升安全性,隱藏類的類部細節
包:便於管理咱們的代碼
方法的重寫(向上轉型)
多態的應用:
向上轉型和向下轉型
Java解決多繼承問題用接口
二、方法分紅類方法和對象方法,以static來區別,若是以靜態關鍵字來修飾的方法是類方法,不然爲對象方法
方法的重寫:
①重寫方法和被重寫方法必須具備相同的方法名和參數列表
②重寫方法的返回值類型必須和被重寫方法的返回值類型相同了或者是其子類
③重寫方法的不能縮小被重寫方法的訪問權限
三、super的使用:
(1)super.print();子類裏面調用父類的方法及屬性等,用super,但是在父類中不能引用super的方法及屬性等
(2)super關鍵字和this關鍵字的做用相似,都是將被屏蔽了的成員變量、成員方法變爲可見可用。
(3)super用在子類中,訪問直接父類中的被屏蔽的內容,進一步提升代碼的重要性和靈活性。super關鍵字不只能夠訪問父類的構造方法,還能夠訪問父類的成員,包括父類的屬性、通常方法等,沒法經過super訪問private
條件 | 順序 |
子類的構造方法中沒有經過super顯示調用父類的有參構造方法,也沒有經過this顯示調用自身的其餘構造方法 | 默認先調用父類的無參構造方法 |
子類中的構造方法中經過super顯示調用父類的有參構造方法 | 將執行父類相應的構造方法,而不執行父類無參構造方法 |
子類構造方法中經過this顯示調用吱聲的其餘構造方法 | 在相應的構造方法中應用以上兩條規則 |
四、繼承的總結:
(1)子類必須經過關鍵字extends來實現繼承
(2)子類能夠重寫父類的方法
(3)在子類中能夠經過super關鍵字去訪問父類的成員變量和成員方法,可是不能調用父類中private的屬性和方法。
格式:super.方法名()或者super.屬性,可是引用構造方法的格式:super()(無參的構造方法)、super(參數)(有參構造方法)
(4)繼承中構造方法調用的順序:先調用父類的構造方法,再調用自身的構造方法,若是有多級繼承的關係,也遵循上述順序原則
五、Object類是全部類的父類和被子類常常重寫的方法
方法 | 說明 |
toString() | 返回當前對象自己的有關信息,按字符串對象返回 |
equals() | 比較兩個對象是不是同一個對象,是則返回true |
hashCode() | 返回該對象的哈希代碼值 |
getClass() | 獲取當前對象所屬的類信息,返回Class對象 |
六、形參在方法中如何表現出來:
按基本數據類型、數組、類類型聲明形式(好比:int i、int[]a、Dog dog)
七、多態
多態解決代碼冗餘問題,提升程序的擴展性,以及提升代碼的複用性
多態:同一個引用類型,使用不一樣的實例而執行不一樣操做。方法重寫是實現多態的基礎
多態的總結:
(1)同一個引用類型,使用不一樣的實例(對象)而執行不一樣的操做,是具體根據實例(對象)來肯定調用相應的方法
(2)多態的條件:
a 繼承是多態的基礎,繼承是必要條件
b 方法重寫
c 父類引用指向子類對象
(3)多態的好處:提升程序的可擴性以及維護性,實際應用中,新增一個子類就至關於一個新的需求,測試類至關於業務的邏輯實現
(4)沒有使用多態前的解決方案:
a 新建一個子類
b 在主人類中增長一個喂新增子類的方法
c 在測試類中去實例化(建立)子類的對象以及主人類實例化(建立)對象
該解決方案的弊端:每新增一個子類,就得去主人類中增長一個方法,並且該方法中代碼是相同的,這樣代碼就顯得冗餘。
使用多態的解決方案:
a 新建一個子類
b 在測試類中去實例化(建立)子類的對象以及主人類實例化(建立)對象
若是子類中沒有給方法(如:pet.eat()),就會主動父類的方法eat()方法
八、向上轉型和向下轉型
(1)向上轉型:子類向父類靠,如Pet pet=new Dog();將沒法調用子類特有的方法
向上轉型:
實現步驟:
第一步:實例化子類對象
格式:Dog dog=new Dog();
第二步:父類的引用變量指向子類對象(體現向上轉型)
格式:Pet pet=dog;
第三步:實例化第三方(主人類)
格式:Master master=new Master();
第四步:父類的引用變量做爲第三方(主人類)的方法實參進行傳遞
格式:master.playToPet(pet);
(2)向下轉型:父類類型轉換爲子類類型,如:Dog dog=(Dog)pet;
格式:子類的類類型 子類的引用變量 = (父類)
向下轉型:
實現步驟:
第一步:實例化子類對象
格式:Dog dog=new Dog();
第二步:父類的引用變量指向子類對象
格式:Pet pet=dog;
第三步:父類的引用變量強制轉換成子類引用變量
格式:Dog dog1=(Dog)pet;
第四步:實例化第三方(主人類)
格式:Master master=new Master();
第五步:子類的引用變量成爲第三方(主人類)的方法實參進行傳遞
格式:master.playToPet(dog1);
第六步:修改第三方(主人類)中相應方法 語法:結合instanceof運算符來判斷是否真正子類類型,才能夠調用相應的子類特有的方法
格式: if(pet instanceof Dog){ //形參的引用變量 instanceof 子類相應的子類類型
((Dog)pet).play();
}
向下轉型的最終目的:即實現多態(主要體如今第三方類中),又要讓子類引用變量去引用子類中所特有的方法
(3)instanceof判斷是否轉型成功
(4)抽象方法與普通方法的區別
a、普通方法必需要有方法體,抽象方法不能有方法體(大括號也沒有)
b、抽象方法要用abstract修飾
c、抽象方法必須存於抽象類中
抽象方法:有關鍵字abstract修飾的方法,它沒有方法體。
注意事項:
a、抽象方法只能存在抽象類中
b、抽象方法必須在子類中重寫
抽象類:有關鍵字abstract修飾的類,稱做爲抽象類
注意事項:
a、抽象類不能被實例化不能跟new 一塊兒使用 error:new Car()
b、抽象類中能夠有屬性(成員變量)、普通方法以及抽象方法的組成
c、抽象類的抽象方法沒有方法體
d、抽象類的抽象方法必須在子類中實現
(5)接口是爲了實現方法裏面的多繼承問題,通常用於解決java多繼承問題 接口: a、定義:接口是經過interface關鍵字直接定義一個接口,不須要關鍵字class b、接口中的方法必定是抽象方法,可是該抽象方法能夠不加abstract關鍵字 c、接口中的屬性必定要初始化,可是接口通常用於定義靜態常量 格式:public final static int BRIDCOUNT=5; d、實現接口必須實現接口中全部的方法 e、接口不可以實例化(即不能跟new關鍵字一塊兒使用),可是能夠用來聲明引用變量 語法:接口名 引用變量 f、接口不可以繼承普通類和抽象類,可是能夠繼承接口,實現接口必須實現接口中全部的方法,包括繼承過來的接口中的方法