八、繼承及其相關
1、系統結構圖(xmind)
——1.繼承:
——2.多態:
——3.內部類:
——4. 包:
2、tips
——1.繼承
Java不支持多繼承,但支持多層繼承(繼承體系):
C繼承B,B繼承A,就會出現繼承體系,多層繼承出現的繼承體系中,通常看父類中的功能,瞭解該體系的基本功能,建立子類對象,即可使用該體系功能。定義繼承時需要注意:不要僅爲了獲取其他類中某個功能而去繼承,類與類之間要有所屬("is a")關係。
——2.函數具有兩個特性
1.重載,在同一個類中。
2.覆蓋,子類中,覆蓋也稱爲重寫,覆寫,override。
什麼時候使用覆蓋操作?
當子類需要父類的功能,而功能主體子類有自己特有的內容時,可以覆寫父類中的方法,這樣即沿襲了父類的功能,又定義了子類特有的內容。
——3.構造函數總結
一個對象實例化過程,以person p = new person();爲例:
1.JVM會讀取指定的路徑下的Person.class文件,並加載進內存,並會先加載Person的父類(如果有直接的父類的情況下)。
2.在內存中開闢空間,並分配地址。
3.並在對象空間中,對對象的屬性進行默認初始化。
4.調用對應的構造函數進行初始化。
5.在構造函數中,第一行會先到調用父類中構造函數進行初始化。
6.父類初始化完畢後,再對子類的屬性進行顯示初始化。
7.再進行子類構造函數的特定初始化。
8.初始化完畢後,將地址值賦值給引用變量。
——4.final關鍵字
在程序中如果一個數據是固定的,那麼直接使用這個數據就可以了,但是這種閱讀性差,所以應該給數據起個名字,而且這個變量名稱的值不能變化,所以加上final固定。
寫法規範:常量所有字母都大寫,多個單詞,中間用_連接。
——5.多態概述
慄:動物中貓。
貓這個對象對應的類型是貓類型:貓 m = new 貓();
同時貓也對應着動物這個類型:動物 d = new 貓();
動物是貓這個具體事務中抽取出來的父類型,代表更大的範圍,父類型引用指向了子類對象。
多態性簡單說就是一個對象對應着不同類型。「
實例代碼:
//類型動物的抽象類描述了一個喫的共性
abstract class Animals
{
public abstract void eat();
}
//類型貓繼承動物,重寫一個共性喫,以及自身抓老鼠的行爲
class Cat extends Animals
{
public void eat()
{
System.out.println("喫魚");
}
public void catchmouse()
{
System.out.println("抓老鼠");
}
}
//類型狗繼承動物,重寫了一個喫的共性,以及自身看家的行爲
class Dog extends Animals
{
public void eat()
{
System.out.println("啃骨頭");
}
public void lookhouse()
{
System.out.println("看家");
}
}
//類型豬繼承動物,重寫了喫的共性,以及自身拱地的行爲
class Pig extends Animals
{
public void eat()
{
System.out.println("飼料");
}
public void gongdi()
{
System.out.println("拱地");
}
}
class duotaiDemo
{
public static void main(String[] args)
{
//自動類型提升,貓對象提升到了動物類型。但是特有功能無法訪問,作用就是限制對特有功能的訪問。
//專業講:向上轉型,將子類型隱藏。就不能使用子類的特有方法了。
Animals a =new Cat();
a.eat();
//報錯a.catchmouse();
//如果還想用具體動物的功能,還可以向下轉型。
Cat c = (Cat)a;//向下轉型的目的是爲了能夠使用子類的特有方法
c.eat();
c.catchmouse();
//注意:對於轉型,自始至終都是子類對象在做類型的變化。
//Animal a = new Dog();
//Cat c = (Cat)a;//但是類型不能隨意轉換,否則可能會報出ClassCastException的異常
}
public static void Eat(Animals a)
{
a.eat();
}
}
運行結果:
——6.內部類
慄1:
class Outer
{
private int num = 4;
private static int num2 = 5;
//靜態定義在類上,不是內部類的方法上。
static class Inner
{
public void show()
{
System.out.println("Inner run...."+num2);
}
}
}
class InnerClassDemo2
{
public static void main(String[] args)
{
//Outer.Inner o = new Outer().new Inner();當內部類爲靜態是當做外部類使用。
Outer.Inner o = new Outer.Inner();
//靜態內部類的方法只能訪問靜態內部類變量
o.show();。
}
}
運行結果:
2.匿名內部類實例
//定義一個擁有兩個方法的接口
interface Inter
{
void show1();
void show2();
}
class InnerClassDemo8
{
public static void main(String[] args)
{
/*
直接將接口式匿名內部類當做參數。
重寫Inter接口中的兩個方法。
*/
show(new Inter()
{
public void show1()
{
System.out.println("show1...run");
}
public void show2()
{
System.out.println("show2...run");
}
});
}
//輸入的參數爲一個接口,返回值類型爲void
public static void show(Inter in)
{
in.show1();
in.show2();
}
}
運行結果: