繼承
繼承:
多個類有共同的成員變量和成員方法,抽取到另外一個類中(父類),在讓多個類去繼承這個父類,我們的多個類就可以獲取到父類中的成員了。
extends關(guān)鍵字
格式:
class 子類 extends 父類 {}
public class ExtendsDemo {
public static void main(String[] args) {
DotA1 d = new DotA1();
d.start();
LOL1 l = new LOL1();
l.start();
}
}
class Game1 {
String name;
double version;//版本號
String agent;//代理商
public void start() {
System.out.println("游戲啟動了");
}
public void stop() {
System.out.println("游戲關(guān)閉了");
}
}
class DotA1 extends Game1 {
}
class LOL1 extends Game1 {
}
繼承的特點
1、在Java中,類只支持單繼承,不允許多繼承,也就是說一個類只能有一個直接父類
2.多個類可以繼承一個父類,例如下面這種情況是允許的。
class A{}
class B extends A{}
class C extends A{}
3、在Java中,多層繼承是可以的,即一個類的父類可以再去繼承另外的父類,例如C類繼承自B類,而B類又可以去繼承A類,這時,C類也可稱作A類的子類。下面這種情況是允許的。
class A{}
class B extends A{} // 類B繼承類A,類B是類A的子類
class C extends B{} // 類C繼承類B,類C是類B的子類,同時也是類A的子類
一個父類可以有多個子類,但一個子類只有一個父類
public static void main(String[] args) {
CSGO C = new CSGO();
l.update();
l.start();
}
}
class Game {
public void start() {
System.out.println("游戲啟動了");
}
}
class PCGame extends Game {
public void update() {
System.out.println("PCGame更新了");
}
}
class MobileGame extends Game {
public void update() {
System.out.println("MobileGame更新了");
}
}
class CSGO extends PCGame {
}
繼承中成員變量的特點
A:子類只能獲取父類非私有成員
子父類中成員變量的名字不一樣直接獲取父類的成員變量
子父類中成員變量名字是一樣的獲取的是子類的成員變量
B:就近原則:誰離我近我 就用誰
如果有局部變量就使用局部變量
如果沒有局部變量,有子類的成員變量就使用子類的成員變量
如果沒有局部變量和子類的成員變量,有父類的成員變量就使用父類的成員變量
C: super:可以獲取父類的成員變量和成員方法,用法和this是相似的
public static void main(String[] args) {
Kid3 k = new Kid3();
k.show();
}
}
class Dad3 {
String name = "建霖";
}
class Kid3 extends Dad3 {
String name = "四蔥";
public void show() {
String name = "五蔥";
System.out.println(super.name);
System.out.println(this.name);
System.out.println(name);
}
繼承中成員方法的特點和方法重寫
A:子類中沒有這個方法,調(diào)用父類的
B: 子類中重寫了這個方法,調(diào)用子類的
a:方法的重寫:在子父類當中,子類的方法和父類的完全一樣,子類重寫了父類的方法(覆蓋),當子類重寫了父類的方法之后,使用子類對象調(diào)用的就是子類的方法
b:方法的重載:在一個類中,有多個重名的方法,但是其參數(shù)不一樣(參數(shù)的個數(shù),參數(shù)的類型,參數(shù)的順序),和返回值無關(guān)
public static void main(String[] args) {
Kid4 k = new Kid4();
k.eat();
}
}
class Dad4 {
public void eat() {
System.out.println("小酌兩口");
System.out.println("去睡覺了");
}
}
class Kid4 extends Dad4 {
public void eat() {//無重載情況繼續(xù)調(diào)用父類方法
System.out.println("好好吃飯");
}
方法重寫的應(yīng)用場景和注意事項
方法重寫的應(yīng)用場景:當父類的方法不能完全滿足子類使用的時候,既可以保留父類的功能(沿襲、傳承),還可以有自己特有的功能
方法重寫的注意事項:
不可以重寫父類私有的成員方法,壓根就看不到父類的私有成員
子類重寫父類方法,權(quán)限必須大于等于父類方法的權(quán)限
注解
@Override:方法重寫,說明下面的方法是重寫父類的方法
public static void main(String[] args) {
NewPhone np = new NewPhone();
np.call();
}
}
class Phone {
void call() {
System.out.println("打電話");
}
}
class NewPhone extends Phone {
@Override
public void call() {
System.out.println("錄音");
//System.out.println("打電話");
//super.call();//調(diào)用父類的方法
}