1.基本形式和概念
/*
優點:
1.提高了代碼的複用性
2.讓類與類之間產生了關係,給第三個特徵多態提供了前提
java 中支持單繼承,不直接支持多繼承,但對c++中的多繼承機制進行了改良
單繼承: 一個子類只有一個直接父類
多繼承: 一個子類可以有多個直接父類(Java中不允許)
不支持是因爲多個父類中有相同成員,會產生調用不確定性
java 支持多層(重)繼承:
c繼承b ,b繼承a
就會出現繼承體系
當要使用一個繼承體系時:
1.查看該體系中的頂層類,瞭解該體系的基本功能
2.創建體系中的最子類的對象,完成功能的使用。
什麼時候定義繼承:
當類與類之間有所屬關係時,就定義繼承。
*/
class Peeson
{
String name;
int age;
}
class Student extends Person //繼承
{
// String name;
// int age;
void study()
{
System.out.println(name +"st");
}
}
class Worker
{
String name;
int age;
void work()
{
System.out.println(name+ "wo");
}
}
class Extend
{
public static void main(String[] args)
{
Student s = new Student();
s.name = "zhangsan";
s.age=20;
s.student();
}
}
2.繼承的具體使用
/*
在子父類中。成員的特點體現。
1.成員函數
2.成員變量
3.構造函數
*/
/*
當本類的成員和局部變量同名用this區分。
當子父類的成員變量同名用super區分父類。
this和super用法很相似:關鍵字
區別:
this 代表一個本類對象的引用
super: 代表一個父類的空間
*/
//成員變量
class Fu
{
private int num1 = 4;
public int getNum()
{
return num1;
}
}
class Zi extends Fu
{
// int num2 = 5;
int num1 = 4;
void show()
{
System.out.println(this.num1+"..."+super.getNum());
}
}
class ExtendDemo
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show();
}
}
//成員函數
/*
當子父類中出現成員函數一模一樣的情況,會運行子類的函數。
這種現象稱爲覆蓋操作。這是函數在子父類中的特性。
函數兩個特性:1.重載(同一個類中)/重寫/覆寫 2. 覆蓋(子類中)
覆蓋注意事項:
1.子類覆蓋父類方法時,子類權限必須大於等於父類權限。(public private修飾的不可覆蓋)
2.靜態只能覆蓋靜態或者被靜態覆蓋。
什麼時候使用覆蓋:
*/
class Fu1
{
void show1()
{
System.out.println("fu show run");
}
}
class Zi extends Fu
{
void show1()
{
System.out.println("zi show run");
}
}
class ExtendsDemo3
{
public static void main(String[] args)
{
Zi z = new Zi();
z.show1();
z.show2();
}
}
/*
什麼時候使用覆蓋:
當對一個類進行子類的擴展時,子類需要保留父類的功能聲明。
但是要定義子類中標特有的功能時,就要用覆蓋操作完成。
*/
class Phone
{
void show()
{
System.out.println("number");
}
}
class NewPhone extends Phone
{
void show()
{
System.out.println("name");
// System.out.println("number");
super.show();
}
}
/*子父類中的構造函數的特點
在子類構造對象時,發現在訪問子類構造函數時,父類也就運行了。
原因是:
在子類的構造函數中第一行有個默認的隱式語句。super()
構造函數不可覆蓋,不可繼承
爲什麼子類實例化的時候要訪問父類中的構造函數:
那是因爲子類繼承了父類,獲取到了父類中的內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的
內容進行初始化的。所以子類在完成構造函數時,必須訪問父類中的構造函數。
爲了完成必須的動作,就在子類構造函數中加了 super()語句。
如果父類中沒有定義空參數構造函數,那麼子類的構造函數,必須用super明確調用父類中的那個構造函數。
同時子類構造函數中如果使用了this調用了本類構造函數時,那麼super 就沒有了因爲 super 和 this 都只能定義在第一行,所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數(構造函數可以有多個)。、
注意:super語句必須要定義在子類構造函數的第一行。因爲父類的初始化動作要先完成。
*/
class Fu1
{
Fu()
{
System.out.println("zi show run");
}
}
class Zi extends Fu
{
Zi()
{
//super(); 調用的就是父類中的空參數的調用涵數。
//如果不是空參,那麼就用 super(參數) 的形式
System.out.println("zi show run");
}
}
class ExtendsDemo4
{
public static void main(String[] args)
{
new Zi();
}
}
3.一個對象實例化的過程
/*
一個對象實例化的過程
Person p = new Person();
1. jvm 會讀取指定的路徑下的 Person.class 文件,並加載進內存,並會
先加載 Person 的父類(如果有父類的情況下)
2.在堆內存中開闢空間,分配地址
3.並在對象空間中,對對象中的屬性進行默認初始化。
4.調用對應的構造函數進行初始化
5.在構造函數中,第一行會先調用父類中的構造函數進行初始化
6.父類初始化完畢後,再對子類的屬性進行顯示初始化
7.再進行子類構造函數的特定初始化
8.初始化完畢後,將地址值付給引用變量
9.
*/