<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
茫茫人海千千萬萬,感謝這一秒你看到這裡。希望我的面試題系列能對你的有所幫助!共勉!
願你在未來的日子,保持熱愛,奔赴山海!
Java基礎知識(繼承)
繼承是java物件導向程式設計技術的一塊基石,因為它允許建立分等級層次的類。描述的是事物之間的所屬關係,這種關係是:is-a
的關係。
繼承:就是子類繼承父類別的屬性和行為,使得子類物件(範例)可以直接具有與父類別相同的屬性、相同的行為。子類可以直接存取父類別中的非私有的屬性和行為。
兔子和長頸鹿屬於食草動物類,老虎和獅子屬於食肉動物類。而食草動物和食肉動物又是屬於動物類。
那是不是兔子、長頸鹿、老虎、獅子都屬於動物類呢?答案是沒錯滴!雖然食草動物和食肉動物都是屬於動物,但是兩者的屬性和行為上有差別,所以子類會具有父類別的一般特性也會具有自身的特性。我們就可以再多個類中存在相同屬性和行為時,我們可以將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那一個類即可。
在Java當中會通過extends
關鍵字可以申明一個類是從另外一個類繼承而來的,一般形式如下:
class 父類別 {
}
class 子類 extends 父類別 {
}
需要注意一點: Java 不支援多繼承,但支援多重繼承。就如下:
class A {
}
class B extends A { (對的)
}class C extends A, B { (錯的)
}class C extends B { (對的)
}
頂層父類別是Object類。所有的類預設繼承Object,作為父類別。
編寫一個父類別極其對應的子類資訊
結構如下:
程式碼如下:
父類別Person:
package com.nz.pojo; 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; } }
子類Student沒有額外的屬性和方法:
package com.nz.pojo; /** * 繼承了Person特有的name, age, * 沒有額外的獨有屬性和方法 */ public class Student extends Person{ }
子類Teacher多了一個工資的屬性和獨有的教書方法:
package com.nz.pojo; /** * 繼承了Person特有的name, age, * 多了自己獨有的工資屬性還有獨有的教書方法 */ public class Teacher extends Person{ // 工資 private double salary ; // 特有方法 public void teach(){ System.out.println("老師在認真教書!"); } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }
編寫測試程式碼:
package com.nz; import com.nz.pojo.Student; import com.nz.pojo.Teacher; public class InheritDemo { public static void main(String[] args) { Teacher teacher = new Teacher(); teacher.setName("最愛吃魚罐頭"); teacher.setAge(18); teacher.setSalary(1999.99); System.out.println(teacher.getName()); System.out.println(teacher.getAge()); System.out.println(teacher.getSalary()); teacher.teach(); Student student = new Student(); student.setName("罐頭"); student.setAge(12); //student.setSalary(1999.99); // student沒有工資屬性,報錯! System.out.println(student.getName()); System.out.println(student.getAge()); } }
結果如下:
最愛吃魚罐頭
18
1999.99
老師在認真教書!
罐頭
12
從結果來看,子類繼承父類別,就可以直接得到父類別的成員變數和方法。而子類可以編寫一些特有的屬性和方法,但是是否可以繼承所有成分呢?
並不是父類別的所有內容都可以給子類繼承的:
這裡先將這兩個關鍵字,super和this在繼承關係中,運用比較頻繁。
super和this完整的用法如下:
this.成員變數 -- 本類的
super.成員變數 -- 父類別的this.成員方法名() -- 本類的
super.成員方法名() -- 父類別的
package com.nz; public class InheritDemo2 { public static void main(String[] args) { Animal a = new Animal(); a.eat(); Cat cat = new Cat(); cat.eatFish(); } } class Animal { void eat() { System.out.println("animal : eat"); } } class Cat extends Animal { void eat() { System.out.println("cat : eat"); } void eatFish() { this.eat(); // this 呼叫自己的方法 super.eat(); // super 呼叫父類別方法 } }
呼叫結果如下:
animal : eat
cat : eat
animal : eat
子類的每個構造方法中均有預設的super(),呼叫父類別的空參構造。手動呼叫父類別構造會覆蓋預設的super()。
super() 和 this() 都必須是在構造方法的第一行,所以不能同時出現。
getter/setter
方法存取父類別的private成員變數。super
關鍵字呼叫父類別的構造器並配以適當的參數列。super
關鍵字呼叫父類別構造器,系統會自動呼叫父類別的無參構造器。package com.nz; public class InheritDemo3 { public static void main(String[] args) { System.out.println("------Teacher 類繼承------"); Teacher teacher = new Teacher(); Teacher teacher2 = new Teacher("張三"); System.out.println("------Student 類繼承------"); Student student = new Student(); Student student2 = new Student("張三三"); } } // 父類別 class Person { private String name; Person(){ System.out.println("呼叫了父類別的無參構造器: Person()"); } Person(String name) { System.out.println("呼叫了父類別的帶參構造器: Person(String name)"); this.name = name; } } // Teacher子類繼承Person class Teacher extends Person{ private String name; Teacher(){ // 自動呼叫父類別的無引數構造器 因為會有預設super(); System.out.println("Teacher"); } public Teacher(String name){ super("最愛吃魚罐頭"); // 呼叫父類別中帶有引數的構造器 System.out.println("Teacher(String name):"+name); this.name = name; } } // Student子類繼承Person class Student extends Person{ private String name; Student(){ super("heihei"); // 呼叫父類別中帶有引數的構造器 System.out.println("SubClass2"); } public Student(String name){ // 自動呼叫父類別的無引數構造器 System.out.println("Student(String name):"+name); this.name = name; } }
結果如下:
------Teacher 類繼承------
呼叫了父類別的無參構造器: Person()
Teacher
呼叫了父類別的帶參構造器: Person(String name)
Teacher(String name):張三
------Student 類繼承------
呼叫了父類別的帶參構造器: Person(String name)
SubClass2
呼叫了父類別的無參構造器: Person()
Student(String name):張三三
final 關鍵字主要用在三個地方:變數、方法、類。
final 的特點:
我們測試下修飾類後到底能不能繼承:
package com.nz; public class InheritDemo4 { } // 父類別 final class Fu { private String name; } //class Zi extends Fu{ // Cannot inherit from final 'com.nz.Fu' 會顯示沒辦法繼承Fu //}
結果:可以看出來在被final修飾的Fu類沒辦法繼承,而且在編譯期間就會報錯了,沒辦法通過執行。
子類中出現與父類別一模一樣的方法時(返回值型別,方法名和參數列都相同),會出現覆蓋效果,也稱為重寫或者複寫。宣告不變,重新實現。
發生在子父類別之間的關係。 子類繼承了父類別的方法,但是子類覺得父類別的這方法不足以滿足自己的需求,子類重新寫了一個與父類別同名的方法,以便覆蓋父類別的該方法。
寫個測試案例:
package com.nz; public class InheritDemo5 { public static void main(String[] args) { // 建立子類物件 Cat lanMao = new Cat(); // 呼叫父類別繼承而來的方法 lanMao.run(); // 呼叫子類重寫的方法 lanMao.sing(); } } class Animal{ public void sing(){ System.out.println("動物都可以唱歌!"); } public void run(){ System.out.println("動物都可以跑!"); } } class Cat extends Animal { public void sing(){ System.out.println("我們一起學貓叫,一起喵喵喵!讓我們一起撒個嬌"); } }
執行結果:
動物都可以跑!
我們一起學貓叫,一起喵喵喵!讓我們一起撒個嬌
可以看出,藍貓呼叫了重寫後的sing方法。
加上後的子類程式碼形式如下:
class Cat extends Animal { // 宣告不變,重新實現 // 方法名稱與父類別全部一樣,只是方法體中的功能重寫了! @Override public void sing(){ System.out.println("我們一起學貓叫,一起喵喵喵!讓我們一起撒個嬌"); } }
相信各位看官看到這裡,都對Java繼承有了一定的瞭解吧,繼承在Java的特性裡還是佔據比較大得多作用,他還有很多特點:
讓我們也一起加油吧!本人不才,如有什麼缺漏、錯誤的地方,也歡迎各位人才大佬評論中批評指正!
學到這裡,今天的世界打烊了,晚安!雖然這篇文章完結了,但是我還在,永不完結。我會努力保持寫文章。來日方長,何懼車遙馬慢!
感謝各位看到這裡!願你韶華不負,青春無悔!
到此這篇關於Java由淺入深刨析繼承的文章就介紹到這了,更多相關Java 繼承內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45