Java面向對象之類的繼承介紹
繼承的作用
如果沒有繼承機制是怎么樣的?
有以下兩個類,分別是Student、Teacher,它們的實現(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),這兩個類中的屬性和方法都是一樣的,或者說這兩個類都有相同的某些特性。
使用繼承機制后的示例?
先寫一個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;
}
}
兩個類繼承Person
public class Teacher extends Person {
}
public class Student extends Person {
}
再寫個測試類看一下:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setName("學生");
Teacher t = new Teacher();
t.setName("老師");
System.out.println(s.getName() + " " + t.getName());
}
}

類的繼承是什么?
通過上面的演示,我們發(fā)現(xiàn)繼承了Person類后,就算在Student、Teacher類中不寫對應的方法,也能使用父類的方法,這說明了子類繼承了父類的屬性和方法。其中Person叫做父類,Student、Teacher這樣的由Person衍生的類叫做子類。繼承的關鍵字是extends。
繼承的作用:減少重復的、冗余的相同屬性和方法。
多個類中存在相同的屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些相同的屬性和行為,只有繼承那個類即可。
子類和父類的繼承機制
繼承關系是兩個類,一個為子類(派生類),一個是(父類)。子類繼承父類,使用關鍵字extends表示(extends的意思是擴展,所以子類是對父類的擴展,就是說,我們還可以在子類中添加獨屬于它的屬性和方法)。Java中的類只有單繼承,沒有多繼承(一個兒子只能有一個爸爸,但是爸爸可以有多個兒子)
Java單繼承
Java不支持多繼承,只允許一個類直接繼承另一個類;
子類只能有一個父類,extends 關鍵字后面只能有一個類名
public class Animal {
}
public class Person {
}
我們讓Student繼承Animal和Person:

發(fā)現(xiàn)不允許多繼承。這里提一下,雖然不能多繼承,但是可以實現(xiàn)多個接口。
雖然不能多繼承,但不代表不能多重繼承(爸爸的爸爸是爺爺):
public class Person extends Animal{
}
public class Student extends Person {
}
學生是人類,人類是動物,所以學生也是動物。
Java繼承的頂級父類:Object
Object類是Java中所有類的始祖,Java中的每一個類都是由它擴展而來,但是并不明確寫出要繼承它,根據(jù)繼承的特性,所有的Java類都擁有其方法。
這里介紹Object中的常用方法:hashCode()、toString()、equals(Object obj),這也是所有類都有的方法。
hashCode()方法: 返回對象存儲地址。
public static void main(String[] args) {
System.out.println(new Person().hashCode());
System.out.println(new Person().hashCode());
}

這個地址對于每個對象都是唯一的,如果兩對象的hashCode值一樣,說明它們是同一對象。
toString()方法:該方法用來返回對象的字符串表示形式。
public static void main(String[] args) {
System.out.println(new Person().toString());
System.out.println(new Person().toString());
}
默認的toString()方法是類名+@+hashCode()相關的唯一標識。
看源碼如下:

現(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 + "]";
}
}
運行結果:

equals(Object obj): 該方法用于判斷兩個對象是否相同,如果沒有被重寫,其與==等價。
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
System.out.println(p1.equals(p2));
}

equals方法源碼如下:

Object的equals方法比較的就是兩對象的地址。
String類的equals方法就被重寫了。
對象的類型轉換
對象向上轉型
子類轉換成為父類,向上轉型
格式: 父類名稱 對象名稱 = new 子類名稱();
含義: 把創(chuà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) {
// 子類的對象 當作 父類的類型 使用,向上轉型
Person stu = new Student();
stu.run();
// 父類不能調用子類特有的方法
// stu.study();
}
}
對象向下轉型
父類轉換為子類,向下轉型
子類 引用 = (子類) 父類對象
強制類型轉換
public static void main(String[] args) {
Person p = new Person();// 向下轉型
Student stu = (Student) p;
Student stu1 = (Student) new Person();// 還可以這樣寫
stu.run();
stu.study();
}
需要注意可能會報java.lang.ClassCastException異常;
當應用程序代碼嘗試將某一對象轉換為某一子類時,如果該對象并非該子類的實例,JVM就會拋出ClassCastException異常。

以下情況就不會報類型轉換的異常,因為原本就是Student類的,強轉回來依舊是Student類
public static void main(String[] args) {
Person p = new Student();
Student stu = (Student) p;
stu.run();
stu.study();
}
明顯地,類的類型轉換就跟基本數(shù)據(jù)類型的轉換寫法一致。
總結
到此這篇關于Java面向對象之類的繼承介紹的文章就介紹到這了,更多相關Java繼承內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
又又叕出BUG啦!理智分析Java NIO的ByteBuffer到底有多難用
網(wǎng)絡數(shù)據(jù)的基本單位永遠是byte,Java NIO提供ByteBuffer作為字節(jié)的容器,但該類過于復雜,有點難用.本篇文章就帶大家簡單了解一下 ,需要的朋友可以參考下2021-06-06
java創(chuàng)建子類對象設置并調用父類的變量操作
這篇文章主要介紹了java創(chuàng)建子類對象設置并調用父類的變量操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Java File類 mkdir 不能創(chuàng)建多層目錄的解決
這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Java Swing實現(xiàn)的定制TextField功能示例
這篇文章主要介紹了Java Swing實現(xiàn)的定制TextField功能,結合實例形式分析了java swing組件TextField相關屬性功能與設置操作技巧,需要的朋友可以參考下2018-01-01

