8、繼承及其相關


八、繼承及其相關

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();
	}
}


運行結果:

       





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章