- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java基礎之方法重寫(xiě)詳解
方法的重寫(xiě)是子類(lèi)根據需求對父類(lèi)繼承的方法進(jìn)行重新的編寫(xiě),在重寫(xiě)時(shí),可以使用super方法的方式來(lái)保留父類(lèi)中的方法,注意:構造方法不可以被重寫(xiě)。
創(chuàng )建一個(gè)人類(lèi),屬性包括姓名 性別 年齡 行為方法是輸出信息
方法重寫(xiě)時(shí)要在子類(lèi)中定義一個(gè)和父類(lèi)相同名稱(chēng)的方法,并采用super關(guān)鍵字super.方法名();
,這樣就實(shí)現了方法的重寫(xiě)
package cn.zhz.Kind.dh; public class Person1 { public String sex; public String name; public int age; public void showInfo() { System.out.println("姓名:" + name + "年齡:" + age + "性別:" + sex); } }
創(chuàng )建一個(gè)學(xué)生類(lèi),屬性包括學(xué)號 學(xué)科,行為方法是輸出信息
package cn.zhz.Kind.dh; public class Student1 extends Person1{ public int stuId; public String stuSubject; public void showInfo(){ super.showInfo(); System.out.println("學(xué)號:"+ stuId+ "學(xué)科:"+ stuSubject); } }
創(chuàng )建學(xué)生類(lèi)的一個(gè)實(shí)例,進(jìn)行賦值操作,賦值后輸出
package cn.zhz.Case.dh; import cn.zhz.Kind.dh.Student1; public class Student1Test { public static void main(String[] args) { Student1 student1 = new Student1(); student1.stuId = 1; student1.name = "張三"; student1.age = 18; student1.sex = "男"; student1.stuSubject = "物理"; student1.showInfo(); } }
super可以應用在子類(lèi)訪(fǎng)問(wèn)父類(lèi)成員中,比如說(shuō):
訪(fǎng)問(wèn)父類(lèi)的屬性
super.print();
注意是非private的方法
訪(fǎng)問(wèn)父類(lèi)的方法super.name;
訪(fǎng)問(wèn)父類(lèi)的構造方法super();
package cn.zhz.Inherit.dh; public class Pet { private String name = "無(wú)名氏"; private int health = 100; private int love = 0; public int age = 1; public Pet() { System.out.println("父類(lèi)無(wú)參構造方法"); } public Pet(String name) { this.name = name; } public Pet(String name, int health, int love) { //this可以調用本類(lèi)的構造方法,且在第一行 //this(name); this.name = name; this.health = health; this.love = love; System.out.println("父類(lèi)帶參構造方法"); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setHealth(int health) { if (health < 0 || health > 100) { System.out.println("寵物的健康值在0-100之間"); this.health = 60; return; } this.health = health; } public int getHealth() { return this.health; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setLove(int love) { if (love < 0 || love > 100) { System.out.println("寵物的親密度只能在0-100之間"); this.love = 60; return; } this.love = love; } public int getLove() { return this.love; } //輸出寵物的信息 public void print() { System.out.println("寵物的自白:\n我的名字叫" + this.name + "健康值是" + this.health + "和主人的親密度是:" + this.love); } }
package cn.zhz.Inherit.dh; public class Dog extends Pet { private String strain = "聰明的拉布拉多犬"; public Dog() { System.out.println("子類(lèi)狗狗的無(wú)參構造方法"); } public Dog(String name, int health, int love, String strain) { //通過(guò)super調用父類(lèi)的構造方法,必須是第一句 //super(); super(name, health, love); this.strain = strain; System.out.println("狗狗的帶參構造方法"); } public void setStrain(String strain) { this.strain = strain; } public String getStrain() { return this.strain; } public void print() { //調用父類(lèi)的非private的print()方法 super.print(); System.out.println("我是一只" + this.strain); } public void m1() { //super不可以調用父類(lèi)的private屬性 // System.out.println(super.name); System.out.println(super.age); } }
在使用super關(guān)鍵字來(lái)訪(fǎng)問(wèn)父類(lèi)的成員時(shí),使用super關(guān)鍵字,super代表的是父類(lèi)的對象,super只可以出現在子類(lèi)的方法和構造方法中,使用super調用構造方法時(shí),只可以是第一句,super不可以訪(fǎng)問(wèn)父類(lèi)的private成員。
當子類(lèi)中的方法重寫(xiě)了父類(lèi)的方法,或者是在子類(lèi)中定義了和父類(lèi)的同名稱(chēng)的成員變量,使用super關(guān)鍵字可以使被屏蔽的成員可見(jiàn)。.
package cn.zhz.Inherit.dh; public class Pet { private String name = "無(wú)名氏"; private int health = 100; private int love = 0; public int age = 1; public Pet() { System.out.println("父類(lèi)無(wú)參構造方法"); } public Pet(String name) { this.name = name; } public Pet(String name, int health, int love) { //this可以調用本類(lèi)的構造方法,且在第一行 //this(name); this.name = name; this.health = health; this.love = love; System.out.println("父類(lèi)帶參構造方法"); } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setHealth(int health) { if (health < 0 || health > 100) { System.out.println("寵物的健康值在0-100之間"); this.health = 60; return; } this.health = health; } public int getHealth() { return this.health; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public void setLove(int love) { if (love < 0 || love > 100) { System.out.println("寵物的親密度只能在0-100之間"); this.love = 60; return; } this.love = love; } public int getLove() { return this.love; } //輸出寵物的信息 public void print() { System.out.println("寵物的自白:\n我的名字叫" + this.name + "健康值是" + this.health + "和主人的親密度是:" + this.love); } }
子類(lèi)和父類(lèi)中同時(shí)定義了一個(gè)age屬性,子類(lèi)調用這個(gè)age屬性時(shí)先會(huì )在本類(lèi)中找,這時(shí)可以使用super關(guān)鍵字代表父類(lèi),用super.屬性
的方式調用父類(lèi)中的age屬性
package cn.zhz.Inherit.dh; public class Dog extends Pet { private String strain = "聰明的拉布拉多犬"; private int age = 10; public Dog() { System.out.println("子類(lèi)狗狗的無(wú)參構造方法"); } public Dog(String name, int health, int love, String strain) { //通過(guò)super調用父類(lèi)的構造方法,必須是第一句 //super(); super(name, health, love); this.strain = strain; System.out.println("狗狗的帶參構造方法"); } public void setStrain(String strain) { this.strain = strain; } public String getStrain() { return this.strain; } public void print() { //調用父類(lèi)的非private的print()方法 super.print(); System.out.println("我是一只" + this.strain); } public void m1() { //super不可以調用父類(lèi)的private屬性 // System.out.println(super.name); System.out.println(super.age); } public void m2() { //子類(lèi)會(huì )覆蓋服了誒的同名成員 System.out.println(this.age); //可以使用super關(guān)鍵字調用父類(lèi)被子類(lèi)覆蓋的成員 System.out.println(super.age); } }
super和this的區別
總結的來(lái)說(shuō)是this代表的是本類(lèi),而super代表的是父類(lèi)
因為super代表的是父類(lèi),那么如果聲明了多個(gè)類(lèi)時(shí),子類(lèi)中如果要訪(fǎng)問(wèn)父類(lèi)的父類(lèi)的成員,難道要使用的是super.super.
的方式嗎?
package cn.zhz.Kind; //爺爺類(lèi) public class Animal { private int age; private String sex; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public void print() { System.out.println("爺爺類(lèi)下的方法"); } }
package cn.zhz.Kind; public class Person extends Animal { public String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cn.zhz.Kind; //孫子類(lèi) public class Student extends Person { private String sid; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } @Override public void print() { //訪(fǎng)問(wèn)父類(lèi)的父類(lèi)的成員,不可以使用super.super.的方法,可以直接使用super.print();來(lái)進(jìn)行調用 super.print(); System.out.println("這個(gè)是孫子類(lèi)下的方法"); } }
package cn.zhz.Instance; import cn.zhz.Kind.Student; public class StudentTest { public static void main(String[] args) { Student student = new Student(); student.print(); } }
Student孫子類(lèi)調用Animal爺爺類(lèi)時(shí)也是通過(guò)super.成員
的方式來(lái)調用,這是因為java是只支持單根繼承的,一個(gè)類(lèi)只可以有一個(gè)直接父類(lèi),但是一個(gè)類(lèi)可以有多個(gè)的間接父類(lèi)
package cn.zhz.Kind; public class Car { private int site = 4; Car(){ System.out.println("載客量是"+site+"人"); } public void setSite(int site){ this.site = site; } public void print(){ System.out.println("載客量是"+site+"人"); } }
package cn.zhz.Kind; public class Bus extends Car{ public Bus(int site){ setSite(site); } }
package cn.zhz.Instance; import cn.zhz.Kind.Bus; public class BusTest { public static void main(String[] args) { Bus bus = new Bus(20); bus.print(); } }
子類(lèi)構造方法沒(méi)有通過(guò)super顯示調用父類(lèi)的有參構造方法,也沒(méi)有通過(guò)this顯示調用自身的其他構造方法時(shí),系統會(huì )默認調用父類(lèi)的無(wú)參構造方法
子類(lèi)構造方法通過(guò)super顯示調用父類(lèi)的有參構造方法時(shí),執行父類(lèi)相應的構造方法,而不執行父類(lèi)無(wú)參構造方法
子類(lèi)構造方法通過(guò)this顯示調用自身的其他構造方法,在相應構造方法中應用以上的兩條規則
方法重寫(xiě)規則
方法名稱(chēng)相同
參數列表相同
返回值類(lèi)型相同或者是其子類(lèi)
訪(fǎng)問(wèn)權限不可以嚴于父類(lèi)
父類(lèi)的靜態(tài)方法不可以背子類(lèi)覆蓋為非靜態(tài)方法,父類(lèi)的非靜態(tài)方法不可以背子類(lèi)覆蓋為靜態(tài)方法
子類(lèi)可以定義于父類(lèi)同名的靜態(tài)方法,以便在子類(lèi)中隱藏父類(lèi)的靜態(tài)方法(靜態(tài)方法中無(wú)法使用super)
父類(lèi)的私有方法不可以被子類(lèi)覆蓋
不可以跑出比父類(lèi)方法更多的異常
package cn.zhz.Kind; public class Father { public void m1() { System.out.println("父類(lèi)的m1的方法"); } //同一個(gè)類(lèi)中同名不同參的是方法重載 public String m1(int num1){ return "test"; } //方法返回值類(lèi)型可以是自定義的數據類(lèi)型 public Father m2() { System.out.println("父類(lèi)的m2方法"); return new Father(); } public static void m3(){ System.out.println("父類(lèi)的靜態(tài)方法m3"); } private void m4(){ System.out.println("父類(lèi)的私有方法m4"); } }
package cn.zhz.Kind; public class Son extends Father { //子類(lèi)重寫(xiě)方法不可以比父類(lèi)方法訪(fǎng)問(wèn)權限小,可以擴大方法的訪(fǎng)問(wèn)權限 //子類(lèi)方法只要訪(fǎng)問(wèn)權限不嚴于父類(lèi),就構成了方法重寫(xiě) public void m1() { System.out.println("子類(lèi)重寫(xiě)后的m1方法"); } //方法重寫(xiě)是父子類(lèi)的同名同參的 //子類(lèi)方法返回值類(lèi)型可以是父類(lèi)方法返回值類(lèi)型的子類(lèi),也是方法重寫(xiě) public Son m2() { System.out.println("子類(lèi)重寫(xiě)后的m2方法"); return new Son(); } /* 父類(lèi)的靜態(tài)方法不能被重寫(xiě)為非靜態(tài)方法 反之,父類(lèi)的非靜態(tài)方法也不可以被重寫(xiě)為靜態(tài)方法 public void m3(){ System.out.println("子類(lèi)的非靜態(tài)方法m3"); } */ //在子類(lèi)中可以定義和父類(lèi)一模一樣的靜態(tài)方法 public static void m3(){ //在靜態(tài)方法中不可以使用super // super.m3(); Father.m3(); System.out.println("子類(lèi)的非靜態(tài)方法m3"); } public static void main(String[] args) { Son son = new Son(); son.m1(); son.m2(); Son.m3(); } }
到此這篇關(guān)于Java基礎之方法重寫(xiě)詳解的文章就介紹到這了,更多相關(guān)java方法重寫(xiě)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站