1.方法
可變參數(shù)
用類型...
定義,可變參數(shù)相當于數(shù)組類型:
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
2.構造方法
- 如果我們自定義了一個構造方法旨巷,那么强缘,編譯器就不再自動創(chuàng)建默認構造方法
- 可以定義多個構造方法,編譯器根據(jù)參數(shù)自動判斷
- 可以在一個構造方法內部調用另一個構造方法察皇,便于代碼復用
3.方法重載
- 方法名相同茴厉,但各自的參數(shù)不同,稱為方法重載(
Overload
)什荣。 - 注意:方法重載的返回值類型通常都是相同的矾缓。
- 方法重載的目的是,功能類似的方法使用同一名字稻爬,更容易記住嗜闻,因此,調用起來更簡單桅锄。
4.繼承
Protected
繼承有個特點琉雳,就是子類無法訪問父類的private
字段或者private
方法.
為了讓子類可以訪問父類的字段样眠,我們需要把private
改為protected
。用protected
修飾的字段可以被子類訪問.
protected
關鍵字可以把字段和方法的訪問權限控制在繼承樹內部
Super
表示父類,主要用于子類的構造方法中
子類不會繼承任何父類的構造方法.
如果沒有明確地調用父類的構造方法翠肘,編譯器會幫我們自動加一句
super();
,這樣做會有風險,因為自動加入的super()
構造方法可能不存在檐束。必須手動調用存在的某個構造方法。
向上轉型和向下轉型
把一個子類類型安全地變?yōu)楦割愵愋偷馁x值束倍,被稱為向上轉型(upcasting)被丧。
Student s = new Student();
Person p = s; // upcasting, ok
Object o1 = p; // upcasting, ok
Object o2 = s; // upcasting, ok
和向上轉型相反,如果把一個父類類型強制轉型為子類類型绪妹,就是向下轉型(downcasting)甥桂。
Person p1 = new Student(); // upcasting, ok
Person p2 = new Person();
Student s1 = (Student) p1; // ok
Student s2 = (Student) p2; // runtime error! ClassCastException!
向下轉型很可能會失敗。失敗的時候邮旷,Java虛擬機會報ClassCastException
黄选。
為了避免向下轉型出錯,Java提供了instanceof
操作符廊移,可以先判斷一個實例究竟是不是某種類型
Person p = new Student();
if (p instanceof Student) {
// 只有判斷成功才會向下轉型:
Student s = (Student) p; // 一定會成功
}
從Java 14開始糕簿,判斷instanceof
后探入,可以直接轉型為指定變量狡孔,避免再次強制轉型。
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
// 可以直接使用變量s:
System.out.println(s.toUpperCase());
}
}
5.多態(tài)
覆寫Override
子類重寫了父類的方法稱為覆寫蜂嗽。
加上
@Override
可以讓編譯器幫助檢查是否進行了正確的覆寫苗膝。
多態(tài)
多態(tài)是指,針對某個類型的方法調用植旧,其真正執(zhí)行的方法取決于運行時期實際類型的方法辱揭。
多態(tài)具有一個非常強大的功能,就是允許添加更多類型的子類實現(xiàn)功能擴展病附,卻不需要修改基于父類的代碼
在子類的覆寫方法中问窃,如果要調用父類的被覆寫的方法,可以通過
super
來調用
final
修飾符有多種作用
-
final
修飾的方法可以阻止被覆寫完沪; -
final
修飾的class可以阻止被繼承域庇; -
final
修飾的field必須在創(chuàng)建對象時初始化,隨后不可修改覆积。
6.抽象
問題:由于多態(tài)的存在父類的方法可能沒有實際意義听皿,需要去掉父類的方法,但不能正真的去掉宽档,因為會失去多態(tài)的特性尉姨。
解決:我們可以為父類方法聲明abstract
方法,但同時也必須將父類聲明為抽象類,才能正確編譯它吗冤。
abstract class Person {
public abstract void run();
}
抽象類的作用:強迫子類實現(xiàn)其定義的抽象方法,抽象方法實際上相當于定義了“規(guī)范”又厉。
面向抽象編程:使得調用者只關心抽象方法的定義九府,不關心子類的具體實現(xiàn)。
7.接口
在抽象類中馋没,抽象方法本質上是定義接口規(guī)范:即規(guī)定高層類的接口昔逗,從而保證所有子類都有相同的接口實現(xiàn),這樣篷朵,多態(tài)就能發(fā)揮出威力勾怒。
如果一個抽象類沒有字段(可以有靜態(tài)字段),所有方法全部都是抽象方法(可以有default方法)声旺,就可以把該抽象類改寫為接口:interface
笔链。
接口繼承
- 一個
interface
可以繼承多個interface
.
default方法
實現(xiàn)類可以不必覆寫
default
方法。default
方法和抽象類的普通方法是有所不同的腮猖。因為interface
沒有字段鉴扫,default
方法無法訪問字段,而抽象類的普通方法可以訪問實例字段澈缺。
8.靜態(tài)字段和靜態(tài)方法
使用static
修飾坪创。
靜態(tài)字段
- 所有實例共享該字段
- 不推薦用
實例變量.靜態(tài)字段
去訪問靜態(tài)字段 - 推薦用類名來訪問靜態(tài)字段
靜態(tài)方法
調用靜態(tài)方法不需要實例,通過類名就可以調用姐赡,無法訪問
this
莱预,但可以訪問靜態(tài)字段和其他靜態(tài)方法靜態(tài)態(tài)方法常用于工具類和輔助方法。
接口的靜態(tài)字段
因為interface
是一個純抽象類项滑,所以它不能定義實例字段依沮。但是,interface
是可以有靜態(tài)字段的枪狂,并且靜態(tài)字段必須為final
類型:
public interface Person {
public static final int MALE = 1;
public static final int FEMALE = 2;
}
實際上危喉,因為interface
的字段只能是public static final
類型,所以我們可以把這些修飾符都去掉州疾,上述代碼可以簡寫為:
public interface Person {
// 編譯器會自動加上public statc final:
int MALE = 1;
int FEMALE = 2;
}
編譯器會自動把該字段變?yōu)?code>public static final類型辜限。