當多個對象具備多種同樣的屬性和方法,每個人對象都要重復(fù)寫同樣的內(nèi)容,則會顯得代碼冗雜和繁重。作為面向?qū)ο笕筇匦灾坏睦^承,則可以很好地解決該問題。本篇文章將為您簡單地介紹繼承的內(nèi)容以及在 Java 中繼承的使用方法。
1、繼承的定義
當多個類存在相同的屬性和方法時,可以選擇講這些共同的部分抽象為一個父類,其他的子類就可以繼承父類的屬性和行為,使得子類對象獲得和父類對象同樣的屬性和方法。
繼承的優(yōu)點
(1)提高代碼的復(fù)用性。
(2)類與類之間產(chǎn)生了聯(lián)系,是多態(tài)的前提。
2、繼承的格式
通過 extends 關(guān)鍵字,可以聲明一個子類繼承了一個父類,定義格式:
public class 父類名稱{//定義父類的格式
..........
}
public class 子類名稱 extends 父類名稱{
...........//定義子類格式
}
3、成員變量重名
在父子類繼承關(guān)系中,如果成員變量重名了,則創(chuàng)建子類對象,有兩種訪問方式:
(1)直接通過子類對象訪問成員變量。
等號左邊是誰,就優(yōu)先用誰,沒有則向上找。
(2)間接通過成員方法訪問成員變量。
成員方法屬于誰,就優(yōu)先用誰,沒有則向上找。
public class Demo02ExtendsField {
public static void main(String[] args) {
Father father = new Father();//創(chuàng)建父類對象
System.out.println(father.numFather);
System.out.println("====================");
Son son = new Son();
System.out.println(son.numFather);//10
System.out.println(son.numSon);
System.out.println("====================");
System.out.println(son.num );//優(yōu)先子類200
System.out.println("===================");
son.methodSon();//這個方法定義在子類,優(yōu)先用子類,沒有再向上找
son.methodFather(); //這個方法在父類中定義的
}
}
public class Father {
int numFather = 10;
int num = 100;
public void methodFather(){
System.out.println(num);
}
}
public class Son extends Father{
int numSon = 20;
int num = 200;
public void methodSon(){
System.out.println(num);
}
}
注:也可以通過 super 關(guān)鍵字來訪問父類中的同名變量;this 關(guān)鍵用來訪問本類中的同名變量。
4、成員方法重名
如果父子類中都出現(xiàn)了重名的成員方法,一般使用重寫(Override)來進行訪問。
方法重寫:如果子類出現(xiàn)和父類中一模一樣的成員方法(返回類型、方法名和參數(shù)列表完全相同),就會出現(xiàn)覆蓋效果,也就是重寫。即聲明不變,重新實現(xiàn)。
重寫特點:創(chuàng)建的是誰,就優(yōu)先用誰的方法;只會向上找父類,而不會向下去找子類。
public class Demo04ExtendsMethod {
public static void main(String[] args) {
Son son = new Son();
son.methodFather();
son.methodSon();
System.out.println("===========");
son.method();
}
}
public class Father {
public void methodFather(){
System.out.println("父類方法執(zhí)行!");
}
public void method(){
System.out.println("父類方法重名執(zhí)行!");
}
}
public class Son extends Father {
public void methodSon(){
System.out.println("子類方法執(zhí)行!");
}
@Override
public void method(){
System.out.println("子類方法重名執(zhí)行!");
}
}
方法重寫的注意事項:
(1)必須保證父子類之間方法的方法名和參數(shù)列表一致。
(2)子類返回數(shù)據(jù)類型必須小于父類的返回數(shù)據(jù)類型。
(3)子類方法的權(quán)限必須大等于父類的權(quán)限修飾符。
(4)方法復(fù)寫前加一個? @Override
? 是用來檢測是否為有效的重寫。但這個不是必須的,可寫可不寫。
擴展:
(1)Object 類是所有類的公共最高父類(祖宗類)。
(2)public > protected > (deafult) > private 【(default)不是關(guān)鍵字,而表示權(quán)限修飾符留空?!?/p>
5、重寫的應(yīng)用場景
public class Demo06Phone {
public static void main(String[] args) {
Phone phone = new Phone();
phone.call();
phone.send();
phone.show();
System.out.println("==========");
NewPhone newPhone = new NewPhone();
newPhone.call();
newPhone.send();
newPhone.show();
System.out.println("==========");
}
}
public class Phone {
public void call(){
System.out.println("打電話");
}
public void send(){
System.out.println("發(fā)短信");
}
public void show(){
System.out.println("顯示號碼");
}
}
public class NewPhone extends Phone {
@Override
public void show() {
super.show();
System.out.println("顯示姓名");
System.out.println("顯示頭像");
}
}
6、總結(jié)
以上就是 Java 中面向?qū)ο笕筇匦灾焕^承的全部內(nèi)容,如果想要了解更多關(guān)于 Java 面向?qū)ο蟮膬?nèi)容,請繼續(xù)關(guān)注W3Cschool,如果對您的學習有所幫助,還希望多多支持我們!