Java面向?qū)ο笾惖睦^承介紹
繼承的作用
如果沒有繼承機(jī)制是怎么樣的?
有以下兩個(gè)類,分別是Student、Teacher,它們的實(shí)現(xiàn)類如下:
/** * 老師類 封裝了姓名、年齡 * * @author Administrator * */ public class Teacher { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
我們發(fā)現(xiàn),這兩個(gè)類中的屬性和方法都是一樣的,或者說這兩個(gè)類都有相同的某些特性。
使用繼承機(jī)制后的示例?
先寫一個(gè)Person父類:
public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
兩個(gè)類繼承Person
public class Teacher extends Person { }
public class Student extends Person { }
再寫個(gè)測試類看一下:
public class Test { public static void main(String[] args) { Student s = new Student(); s.setName("學(xué)生"); Teacher t = new Teacher(); t.setName("老師"); System.out.println(s.getName() + " " + t.getName()); } }
類的繼承是什么?
通過上面的演示,我們發(fā)現(xiàn)繼承了Person類后,就算在Student、Teacher類中不寫對(duì)應(yīng)的方法,也能使用父類的方法,這說明了子類繼承了父類的屬性和方法。其中Person叫做父類,Student、Teacher這樣的由Person衍生的類叫做子類。繼承的關(guān)鍵字是extends。
繼承的作用:減少重復(fù)的、冗余的相同屬性和方法。
多個(gè)類中存在相同的屬性和行為時(shí),將這些內(nèi)容抽取到單獨(dú)一個(gè)類中,那么多個(gè)類無需再定義這些相同的屬性和行為,只有繼承那個(gè)類即可。
子類和父類的繼承機(jī)制
繼承關(guān)系是兩個(gè)類,一個(gè)為子類(派生類),一個(gè)是(父類)。子類繼承父類,使用關(guān)鍵字extends表示(extends的意思是擴(kuò)展,所以子類是對(duì)父類的擴(kuò)展,就是說,我們還可以在子類中添加獨(dú)屬于它的屬性和方法)。Java中的類只有單繼承,沒有多繼承(一個(gè)兒子只能有一個(gè)爸爸,但是爸爸可以有多個(gè)兒子)
Java單繼承
Java不支持多繼承,只允許一個(gè)類直接繼承另一個(gè)類;
子類只能有一個(gè)父類,extends 關(guān)鍵字后面只能有一個(gè)類名
public class Animal { }
public class Person { }
我們讓Student繼承Animal和Person:
發(fā)現(xiàn)不允許多繼承。這里提一下,雖然不能多繼承,但是可以實(shí)現(xiàn)多個(gè)接口。
雖然不能多繼承,但不代表不能多重繼承(爸爸的爸爸是爺爺):
public class Person extends Animal{ }
public class Student extends Person { }
學(xué)生是人類,人類是動(dòng)物,所以學(xué)生也是動(dòng)物。
Java繼承的頂級(jí)父類:Object
Object類是Java中所有類的始祖,Java中的每一個(gè)類都是由它擴(kuò)展而來,但是并不明確寫出要繼承它,根據(jù)繼承的特性,所有的Java類都擁有其方法。
這里介紹Object中的常用方法:hashCode()、toString()、equals(Object obj),這也是所有類都有的方法。
hashCode()方法: 返回對(duì)象存儲(chǔ)地址。
public static void main(String[] args) { System.out.println(new Person().hashCode()); System.out.println(new Person().hashCode()); }
這個(gè)地址對(duì)于每個(gè)對(duì)象都是唯一的,如果兩對(duì)象的hashCode值一樣,說明它們是同一對(duì)象。
toString()方法:該方法用來返回對(duì)象的字符串表示形式。
public static void main(String[] args) { System.out.println(new Person().toString()); System.out.println(new Person().toString()); }
默認(rèn)的toString()方法是類名+@+hashCode()相關(guān)的唯一標(biāo)識(shí)。
看源碼如下:
現(xiàn)在我們重寫一下toString()方法:
public class Person { private String name; private int age; public Person() { this.name = "未命名"; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }
運(yùn)行結(jié)果:
equals(Object obj): 該方法用于判斷兩個(gè)對(duì)象是否相同,如果沒有被重寫,其與==等價(jià)。
public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(); System.out.println(p1.equals(p2)); }
equals方法源碼如下:
Object的equals方法比較的就是兩對(duì)象的地址。
String類的equals方法就被重寫了。
對(duì)象的類型轉(zhuǎn)換
對(duì)象向上轉(zhuǎn)型
子類轉(zhuǎn)換成為父類,向上轉(zhuǎn)型
格式: 父類名稱 對(duì)象名稱 = new 子類名稱();
含義: 把創(chuàng)建的子類對(duì)象當(dāng)做父類看待和使用
public class Person { public void run() { System.out.println("Person run"); } }
public class Student extends Person{ public void study() { System.out.println("Student study"); } }
public class Test { public static void main(String[] args) { // 子類的對(duì)象 當(dāng)作 父類的類型 使用,向上轉(zhuǎn)型 Person stu = new Student(); stu.run(); // 父類不能調(diào)用子類特有的方法 // stu.study(); } }
對(duì)象向下轉(zhuǎn)型
父類轉(zhuǎn)換為子類,向下轉(zhuǎn)型
子類 引用 = (子類) 父類對(duì)象
強(qiáng)制類型轉(zhuǎn)換
public static void main(String[] args) { Person p = new Person();// 向下轉(zhuǎn)型 Student stu = (Student) p; Student stu1 = (Student) new Person();// 還可以這樣寫 stu.run(); stu.study(); }
需要注意可能會(huì)報(bào)java.lang.ClassCastException異常;
當(dāng)應(yīng)用程序代碼嘗試將某一對(duì)象轉(zhuǎn)換為某一子類時(shí),如果該對(duì)象并非該子類的實(shí)例,JVM就會(huì)拋出ClassCastException異常。
以下情況就不會(huì)報(bào)類型轉(zhuǎn)換的異常,因?yàn)樵揪褪荢tudent類的,強(qiáng)轉(zhuǎn)回來依舊是Student類
public static void main(String[] args) { Person p = new Student(); Student stu = (Student) p; stu.run(); stu.study(); }
明顯地,類的類型轉(zhuǎn)換就跟基本數(shù)據(jù)類型的轉(zhuǎn)換寫法一致。
總結(jié)
到此這篇關(guān)于Java面向?qū)ο笾惖睦^承介紹的文章就介紹到這了,更多相關(guān)Java繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse將Maven項(xiàng)目打成jar包的方法
這篇文章主要介紹了Eclipse將Maven項(xiàng)目打成jar包的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2007-09-09又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡(luò)數(shù)據(jù)的基本單位永遠(yuǎn)是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復(fù)雜,有點(diǎn)難用.本篇文章就帶大家簡單了解一下 ,需要的朋友可以參考下2021-06-06java創(chuàng)建子類對(duì)象設(shè)置并調(diào)用父類的變量操作
這篇文章主要介紹了java創(chuàng)建子類對(duì)象設(shè)置并調(diào)用父類的變量操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01Springboot如何切換默認(rèn)的Tomcat容器
這篇文章主要介紹了Springboot如何切換默認(rèn)的Tomcat容器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java Swing實(shí)現(xiàn)的定制TextField功能示例
這篇文章主要介紹了Java Swing實(shí)現(xiàn)的定制TextField功能,結(jié)合實(shí)例形式分析了java swing組件TextField相關(guān)屬性功能與設(shè)置操作技巧,需要的朋友可以參考下2018-01-01