昨天內容回顧:
1、多態
掌握多態的體現形式:父類引用指向子類對象。
父類 對象名=new 子類();
2、抽象類
定義格式:
public abstract class 類名{
public abstract void eat();
}
創建對象:
抽象類 對象名=new 子類();
3、接口
定義接口的格式以及實現類來實現接口的格式:
public interface 接口名{
void speak();//默認省略了public abstract
}
創建實現類實現接口:
public class 實現類名 implements 接口名,接口名,...{
//重寫接口中所有的抽象方法
}
創建對象:
接口名 對象名=new 實現類();
類和類的關係:繼承關係(extends),單繼承,可以多層繼承。
類和接口的關係:實現關係(implements),可以多實現。
接口和接口的關係:繼承關係,可以多繼承。
今日內容
1、引用數據類型作爲方法的形參和返回值(重點)
普通類:
作爲形參:傳遞的是類或者子類對象,也即是將new 出來的對象傳遞給方法。
作爲返回值:返回的也是類或者子類的對象。
抽象類:
作爲形參:傳遞的是子類的對象。
作爲返回值:返回的也是子類的對象。
接口:
作爲形參:傳遞的是實現類的對象。
作爲返回值:返回的也是實現類的對象。
總結:如果形參或者返回值是普通類類型,傳遞或者返回的就是該類或其子類對象。
如果形參或者返回值是抽象類類型,傳遞或者返回的就是它子類對象。
如果形參或者返回值是接口類型,傳遞或者返回的就是它實現類對象。
2、內部類:
概念:在一個類內部定義的類就叫做內部類。內部類可以分爲:成員內部類、局部內部類、匿名內部類。
內部類的目的:一般只需要在當前類中使用某個類的對象,那麼這個類就可以定義成內部類,而且被private修飾,外面無法直接訪問。
成員內部類:(次要)在類中方法外定義的內部類就是成員內部類。
注意:
如果成員內部類是public修飾的,那麼外界可以直接訪問。 外部類.內部類 對象名=new 外部類().new 內部類();
如果成員內部類是public static 修飾的,外界也可以直接訪問。 外部類.內部類 對象名=new 外部類.內部類();
如果成員內部類是private修飾的,那麼外界無法直接方法,只能在內部類所在的外部類創建該內部類對象。
局部內部類:(瞭解)在方法內部創建的類就是局部內部類。
匿名內部類:(重點):一般在開發中使用匿名內部類的形式創建抽象類的子類對象或者接口的實現類對象。僅僅只是簡化書寫子類或者實現類的過程。
常見用法:作爲方法的參數值傳遞
//創建飼養員類,讓動物吃東西
AnimalOperator operator=new AnimalOperator();
//調用useAnimal方法操作動物吃東西
operator.useAnimal(new Animal() {
@Override
public void eat() {
System.out.println("🐶吃骨頭");
}
});
上午內容總結:
1、引用數據類型作爲方法的參數和返回值
只要是引用數據類型作爲方法的參數和返回值,傳遞或者返回的永遠是對象。如果是普通類,那麼傳遞和返回的是該類或者它子類的對象。
如果是抽象類,那麼傳遞和返回的是該類的子類對象。如果是接口,那麼傳遞和返回的是它的實現類對象。
2、內部類:
成員內部類:定義在類中方法外的類叫做成員內部類。
局部內部類:定義在方法內部的類叫做局部內部類。
匿名內部類:不需要定義子類或者實現類,直接通過匿名內部類的方法創建子類或者實現類對象。
語法:
類/接口 變量名=new 類/接口(){
//重寫的方法
}
開發中的使用場景:將匿名內部類對象作爲方法的參數值使用
3、常用api:(知道每個類是幹什麼用的,會查api文檔即可)
Math:跟數學運算相關的對象
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
System:
static long currentTimeMillis() :獲取系統當前時間的毫秒值。
毫秒值:比秒還小一級的時間單位,1秒=1000毫秒。這裏獲取的毫秒值是距離1970年1月1日0點0分0秒0的值
Object:所有的類的父類(超類、基類)。所有類都直接或者間接繼承了Object類:
String toString():返回對象的字符串表示形式
所有對象都可以調用toString方法,如果該類重寫了toString方法(Alt+Insert/ins生成),那麼返回的結果就是成員變量的內容。
如果沒有重寫toString方法,那麼返回的是該對象的地址值。
ps:System.out.println(對象名);實際上會調用對象的toString方法。
boolean equals(Object obj):指示一些其他對象是否等於此。
所有對象都可以調用equals方法,如果該類沒有重寫equals方法,那麼比較的是對象的地址值。如果需要比較對象的內容,那麼就需要重寫
該方法(Alt+Insert/ins生成)。
ps:String類就重寫了equals方法,所以比較字符串的時候使用的是equals方法而不是==比較。
例如:
//重寫equals方法
@Override
public boolean equals(Object o) {
//比較當前對象和傳進來的對象地址值是否一樣,如果以及就爲true。
if (this == o) return true;
//判斷當前對象的類型和傳進來的對象類型是否一樣。如果不一樣,後面就不能將o轉換成Person
// if (o == null || getClass() != o.getClass()) return false;
//等價於這種寫法
if(o==null || !(o instanceof Person)){
return false;
}
//將傳進來的對象轉換成Person類型
Person person = (Person) o;
//比較年齡和姓名
return age == person.age &&
Objects.equals(name, person.name);
}
Arrays:該類包含用於操作數組的各種方法(如排序和搜索)
static void sort(int[] a):排序方法,從小到大排序
static String toString(任意類型數組):將數組中的內容以字符串的形式輸出,如果數組是對象類型的數組,那麼會調用每個對象的toString方法
類似於Math、Arrays類,它們不需要創建對象,方法都是靜態方法,這種類我們可以把它稱作工具類。
1、構造方法都被private修飾
2、方法都是public static修飾的。
3、有的工具類還會被final修飾,不能被繼承。