這是我的第一篇文章,都不知道寫什麼,寫的不好的地方,希望瀏覽到這篇文章的朋友指點指點。

一、什麼是類的繼承

今天學習了java中類的繼承,那麼什麼是繼承——繼承是指在原有類中派生出新的類,新的類叫子類,也叫派生類,原來的類叫父類也叫超類。子類具有父類的數據屬性和行為方式,並且能擴展出新的能力。

二、java類繼承的特性

(1)繼承具有傳遞性:子類繼承父類,父類可以再繼承一個父類

(2)繼承具有唯一的父類(這是java的特殊之處),一個子類只有唯一一個父類,但是一個父類可以有多個子類。

三、為什麼使用類的繼承

一個東西既然存在就一定有他的道理,不然就會被歷史摒棄。子類具有父類的屬性和方法,那麼當有多個類有相同的屬性和方法,就可以將這些特性提取出來,封裝成一個父類,這樣減少了代碼的冗餘,也提高了程序的擴展性。

三、類的繼承格式

在java中類的繼承需要用到關鍵字extents如下:

但是C++中不一樣,如下所示:

四、具體實例

我寫了一個學生父類Student

package com.extend11;

public class Student {
private String name;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void show() {
System.out.println(getName()+"在追劇");
}
}

一個大學生子類UnStudent

package com.extend11;

public class UnStudent extends Student {
public void Display() {
System.out.println(getName()+"在打怪!");
}

}

還有主函數

package com.extend11;

public class Manage {
public static void main(String[] args) {
UnStudent us = new UnStudent();
us.setName("張三");
us.show();//父類中的函數
us.Display();//子類中的函數
}
}

運行顯示結果如下:子類創建的對象us,成功調用了父類的方法,也可以擴展新的方法

如果我們想要父類的show方法不能滿足子類的使用,可以對父類的方法進行重寫,當然這裡要特別注意:重寫方法的返回值類型,方法名和傳入的參數的類型個數都要一致。如下圖所示重寫父類中的show()方法,注意到代碼左邊有小三角形的符號,這是重寫的標誌。

我們再來運行一下,發現第一行的輸出發生了變化,重寫成功了!

最後我們再來說一下關於對象類型轉換!

面向對象具有封裝性,繼承和多態性。多態性包括方法的重載和方法的轉換。轉換方式分成兩種,向上轉換和向下轉換。

向上轉換:父類 對象 = 子類 對象

向下轉換:子類 對象 = 父類 對象

我們向下父類是大盒子,子類是小盒子,那麼子類可以重大盒子里拿出來也可以放進去,但是大盒子不能放進小盒子。所以向下轉換即(子向父轉換)不需要條件,稱為自動轉換,而向上轉換有限制,需要通過強制類型轉換的方式

// 自動轉換,將子類轉換成父類
Student s = new UnStudent();
s.setName("鄧倫");
s.show();

顯示結果分析:

子類的s轉化為父類,轉換後s不能調用Unstudent的所有方法,但是可以調用Unstudent里的重寫的方法。這就是自動裝換的格式和功能。添加語句s.Display();會報錯。如下所示:

//強制轉型
Student s = new UnStudent();//父類轉換成子類,創建對象s
UnStudent us = (UnStudent)s;//將父類對象強制轉換成子類,並創建子類us
us.show();//調用子類重寫父類的方法
us.setName("李四");
us.Display();//調用子類特有的方法

運行結果:

嘿嘿,強制類型轉換還不是很熟悉,以後要用還是會經常查閱,第一篇文章到這就要結束了,畢竟碼了蠻多的字。在文章的末尾附上自己寫的奧特曼小怪獸大戰的代碼!!!

package com.extend;

public class Parent {
private int blood;
private int attack;

public void setBlood(int b) {
blood = b;
}
public int getBlood() {
return blood;
}
public void setAttack(int a) {
attack = a;
}
public int getAttack() {
return attack;
}
}

package com.extend;

public class Automan extends Parent{
public void play(Parent m) {
for(int i=1;i<=m.getAttack();i++) {
setBlood(getBlood()-10);
}
System.out.println("奧特曼剩餘血量:"+getBlood());
if(getBlood()==0) {
System.out.println("Automan is over!");
}
}
}

package com.extend;

public class Monster extends Parent{
public void play(Parent a) {
int c = a.getAttack();
for(int i=1;i<=c;i++) {
setBlood(getBlood()-10);
}
System.out.println("小怪獸剩餘血量:"+getBlood());
if(getBlood()==0) {
System.out.println("Monster is over!");
}
}
}

package com.extend;

public class Boss extends Parent{
public void play(Parent p) {
for(int i=1;i<=p.getAttack();i++) {
setBlood(getBlood()-10);
}
System.out.println("BOSS剩餘血量:"+getBlood());
if(getBlood()==0)
System.out.println("Boss is over!");
}
}

package com.extend;

public class Manage {

public static void main(String[] args) {
// TODO Auto-generated method stub
Monster m = new Monster();
Automan a = new Automan();
Boss b = new Boss();
m.setBlood(100);
a.setBlood(100);
b.setBlood(100);
m.setAttack(3);
a.setAttack(5);
b.setAttack(6);
m.play(a);
a.play(m);
if(m.getBlood()<a.getBlood()) {
System.out.println("Automan is win!");
// Automan p = new Automan();
a.setBlood(100);
a.setAttack(7);
b.play(a);
a.play(b);
if(a.getBlood()<b.getBlood())
System.out.println("Boss is win!");
if(a.getBlood()>b.getBlood())
System.out.println("Automan is win!");

}
else if(a.getBlood()<m.getBlood()) {
System.out.println("Monster is win!");
m.setBlood(100);
m.setAttack(4);
b.play(m);
m.play(b);
if(m.getBlood()<b.getBlood()) {
System.out.println("Boss is win!");
}
if(m.getBlood()>b.getBlood()){
System.out.println("Monster is win!");
}
}
}
}

推薦閱讀:

相关文章