1. 程式人生 > 其它 >Java學習 11.17

Java學習 11.17

Java 第四天 繼承

1.1 為什麼要使用繼承

我們使用物件用來儲存資料,要想使用物件首先得有類。在一個專案中,可能有很多資料需要我們儲存
例如:儲存狗的資訊 貓的資訊 人的資訊 等等 不同的資訊需要不同的類去建立不同的物件

假如現在需要建立狗類 編號 名字 價格 貓類:編號 名字 品種

此時你就去完成這個操作
public class Dog {

int id;
String name;
double price;

}
public class Cat {

int id;
String name;
String type;

}
當你完成了,過了很久,此時需要把 id name 換成animalID animalName
此時你需要一個一個的都換(假如有一萬個)
public class Dog {

int animalID;
String animalName;
double price;

}
public class Cat {

int animalID;
String animalName;
String type;

}
這個操作太麻煩(不嫌棄麻煩的 面向過程思想 java是一種面嚮物件語言-java支援面向物件思想的那些語法)所以我們需要優化一波
所以我們希望達到的效果: 建立狗類 編號 名字 價格 貓類:編號 名字 品種 並且後期如果要修改 改一次全都改完

所以他們就創造了一個語法 能滿足你的需求 後來將這個語法命名為 繼承

1.2 使用繼承語法解決問題


A 建立一個新的類 Animal
B 在Animal中新增成員變數 (多個類共有的)
C 狗貓不再寫 id name 共有的內容
D 狗貓繼承於Animal
public class Animal {

int id;
String name;

}
public class Cat extends Animal{

String type;

}
public class Dog extends Animal{

double price;

}
public class JavaTest {

public static void main(String[] args) {

Dog d1 = new Dog();

d1.id = 666;
d1.name = "旺財";
d1.price = 66645;

Cat c1 = new Cat();

c1.id = 777;
c1.name = "威廉";
c1.type = "狸花貓";

}

}

1.3 記憶體模型

1.4 繼承語法規則


1 繼承使用 extends 關鍵字
public class Cat extends Animal{

String type;

}

2 java中類的關係(提問:java中是單繼承還是多繼承)
繼承關係 單繼承
介面 實現關係 多實現 (彌補java單繼承的侷限性 因為java剛造出來的時候 吹牛說 我們基於c++並且摒棄了c++中晦澀難懂的多繼承多指標的概念)
介面 介面 繼承關係 多繼承
Class cannot extend multiple classes
public class Cat extends Animal,People{

String type;

}

3 類和類之間建立繼承關係 則子類可以訪問父類許可權達到的內容
提問:私有的可以被繼承嗎?
不可以 因為私有的無法被子類訪問 可以 但是私有的不能被子類訪問

4 一個類不寫extends 預設繼承Object(祖宗類 基類 超類)
驗證規則:Animal沒有寫繼承 但是可以呼叫notify () 此時證明其繼承於Object

public static void main(String[] args) {
Animal a1 = new Animal();
a1.notify();
}
提問: Object 有哪些函式 各自的作用

/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {}

5 子類和父類函式呼叫順序:本類有先呼叫本類的 本類沒有則呼叫父類的

此時就有疑問了,繼承本來就是父類有 子類可以直接用,現在有一個問題?父類有一個eat函式 子類為什麼還要有一個eat函式? (為什麼需要重寫 或者說 什麼時候重寫)
在java中 父類有了 子類如果再寫一個一樣的稱之為 函式的重寫 英文名字 voerride

父類的函式滿足不了子類的需求 所以子類可以對父類函式進行重寫 此時呼叫順序就起作用了

public static void main(String[] args) {
Animal a = new Animal();
a.id = 666;
a.name = "阿斯蒂芬";
System.out.println(a);
}
此時我們輸出a 列印的是com.aaa.day02.test4.Animal@1540e19d 為什麼是這個呢?
當我們輸出物件的時候 會呼叫其 toString函式 首先會去Animal類中找 是否有 toString ,發現沒有,則呼叫其父類的,Animal沒有寫extends關鍵字 所以其直接繼承Object ,所以就去Object中找toString ,發現有
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
則呼叫,所以輸出的是com.aaa.day02.test4.Animal@1540e19d ,但是父類的toString 輸出的形式 滿足不了Animal的需求 因為Animal想輸出自己成員變數的值,所以Animal需要重寫父類的toString,重寫之後 自己本類有 則呼叫本類的

在java中 為了防止重寫的時候 重寫失敗 所以造了一個@Override 註解 用來驗證當前函式是否對父類重寫成功

public class Animal {
public void hello(){}
}
public class Dog extends Animal{
@Override Method does not override method from its superclass
public void hell0(){}
}

6 繼承中會產生多型
public class Animal {
public void eat(){
System.out.println("動物都愛吃飯");
}
}
public class Dog extends Animal{
@Override
public void eat(){
System.out.println("狗愛吃肉");
}
}
public static void main(String[] args) {
Animal d1 = new Dog();
d1.eat();
}
這樣的寫法 有個好聽的名字 叫做 多型。


7 super() super
super()代表呼叫父類公共無引數的建構函式 這句程式碼在建構函式的第一句 不寫預設生成 寫了就必須第一句
super 代表 super()創建出來的父類物件
this 代表當前類的物件
this()

public class Animal {

public Animal(){
System.out.println("動物被建立了");
}

}

public class Dog extends Animal{

public Dog(){
int a = 10;
super(); // Call to 'super()' must be first statement in constructor body
System.out.println("狗被建立了");
}

}

此時我們得到一結論: 建立物件的時候 首先會建立一個父類物件 再建立自己類的物件
面試題:
public class Animal {
int age;
public Animal(int age){
this.age = age;
}
}
public class Dog extends Animal{}
程式碼會報錯:
There is no default constructor available in 'com.aaa.day02.test4.Animal'

此時這幾個關鍵字 就體現了繼承的原理