繼承按照我的理解就是擁有別人所擁有的屬性
官方定義:當多個屬性中存在相同屬性和行爲時,將這些內容抽取一個單獨的類中,那麼多個類無需再定義這些屬性,只需繼承這個類即可。
其中,多個類稱爲子類,單獨的類稱爲父類
Java中只能單繼承不能多繼承
但是可以多層繼承
繼承格式
class A extends B{}
繼承中成員變量的特點
寫個代碼來說說
class Fu{
int age=48;
}
class Zi extends Fu{
int age=18;
void show()
{
System.out.println(age); //輸出子類18
System.out.println(super.age); //輸出父類48
}
}
class DemoJicheng{
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
}
}
成員函數特點
package com.b;
class Fu{
int age=48;
void talk()
{
System.out.println("爸爸會講中文。");
}
}
class Zi extends Fu{
int age=18;
void show()
{
System.out.println(age); //輸出子類18
System.out.println(super.age); //輸出父類48
}
}
public class Demo5 {
public static void main(String[] args)
{
Zi z=new Zi();
z.show();
z.talk();
//當子類和父類中的方法名相同時,執行的是子類的方法。
//原因:當名字相同時,子類的方法會覆蓋父類的方法,這稱爲方法的重寫
}
}
方法重寫
注意:
- 重寫方法必須和被重寫的方法具有相同的方法名,參數列表和返回值類型
- 覆蓋時子類方法權限一定要大於父類方法權限(靜態只能覆蓋靜態)
- 父類中私有方法不可以被覆蓋
方法重載與方法重寫的區別
1.定義不同
- 方法重載指方法名相同,返回值或者傳入參數不同
- 方法重寫,要求方法名,返回值傳入參數都相同
2.作用不同
- 方法重載作用在同一方法中
- 方法重寫作用在子父類中
子類實例化過程
package com.b;
class Fu{
int age=48;
Fu(){
talk();
System.out.println("父類構造函數");
}
void talk()
{
System.out.println("爸爸會講中文。");
}
}
class Zi extends Fu{
int age=18;
Zi()
{
//this(); //super和this只能存在一個
super(); // 不寫的話會隱藏
System.out.println("子類構造函數");
}
void talk()
{
System.out.println("兒子會講中文。");
}
}
public class Demo5 {
public static void main(String[] args)
{
new Zi(); //匿名對象,只能調用一次
}
}
/*輸出結果
兒子會講中文
父類構造函數
子類構造函數
*/
//原因,talk()被子類重寫
/*執行順序
1.main函數進棧後,先執行子類的構造函數
2.子類構造函數裏,包含了super();所以會跳到父類構造函數
3.父類構造函數裏也有個super();會跳到object。但是,object啥也沒有執行完彈棧。
4.父類構造函數執行talk();因爲takl被重寫,會輸出子類裏的talk();
5.執行完後,輸出“爸爸會說中文”,到此父類執行完彈棧
6.子類繼續執行輸出“兒子會說中文”,執行完彈棧
7.main執行完,彈棧
*/
最後再來個final關鍵字
final可以修飾類,方法,變量
特點:
- final修飾的類不可以被繼承
- final修飾的方法不可以被覆蓋
- final修飾的變量是一個常量。只能被賦值一次
- 內部類只能訪問被final修飾的局部變量