【java】多態


多態:某一類事物的多種存在形態java

如:動物中的貓和狗
貓對象對象的類型是貓類型,即 cat c1= new cat()
但同時貓也是動物中的一種,也能夠把貓成爲動物,即 animal c1= new cat()函數

多態提現:父類的引用指向了本身子類對象。
                 父類的引用也能夠接受本身的子類對象。設計

多態前提:1.必須是雷和類以前有關係,要麼繼承,要麼實現。
     2.存在複寫對象

多態好處:大大提升了程序的擴展性blog

多態弊端:只能使用父類的引用訪問父類的成員繼承

abstract class animal
{
	abstract void eat();
    } class cat extends animal { void eat() { System.out.println("cat eat"); } void say() { System.out.println("miu,miu"); } } class dog extends animal { void eat() { System.out.println("dog eat"); } void say() { System.out.println("wang,wang"); } } class DuoDemo1 { public static void main(String[] args) { fuc(new cat()); fuc(new dog()); } static void fuc(animal a)// 多態的表現animal a=new cat();模板設計思想,把不肯定的暴露出來 { a.eat(); } }

 向上轉型和向下轉型:編譯

abstract class animal
{
	abstract void eat();
}

class animal
{
	void eat(){};
}

class cat extends animal
{
	void eat()
	{
		System.out.println("cat eat");
	}

	void say()
	{
		System.out.println("miu,miu");
	}
}

class dog extends animal
{
	void eat()
	{
		System.out.println("dog eat");
	}

	void say()
	{
		System.out.println("wang,wang");
	}
}

class  DuoDemo1
{
	public static void main(String[] args) 
	{
		animal a1=new cat();//多態表現,也是向上轉型
		//animal a2=new animal()  當animal爲非抽象類,不能強制向下轉型
		/*千萬不要出現把父類對象轉換成子類類型。*/
		a1.eat();
		cat cl=(cat)a1;//若是子類想調用本身的特有方法,須要強制將父類的引用轉換爲子類類型。也叫向下轉型。
		cl.say();
	}

}

 多態中成員特色:模板

1) 在多態中成員函數的特色:
  在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。若是有,編譯經過,若是沒有編譯失敗。
  在運行時期:參閱對象所屬的類中是否有調用的方法。
  簡單總結就是:成員函數在多態調用時,編譯看左邊,運行看右邊。class

2)在多態中,成員變量的特色:
     不管編譯和運行,都參考左邊(引用型變量所屬的類)。變量

3)在多態中,靜態成員函數的特色:
     不管編譯和運行,都參考作左邊。

class Fu
{
	static int num = 6;
	void method1()
	{
		System.out.println("fu method_1");
	}
	void method2()
	{
		System.out.println("fu method_2");
	}
	static void method4()
	{
		System.out.println("fu method_4");
	}
}

class Zi extends Fu
{
	static int num = 8;
	void method1()
	{
		System.out.println("zi method_1");
	}
	void method3()
	{
		System.out.println("zi method_3");
	}

	static void method4()
	{
		System.out.println("zi method_4");
	}
}
class  DuoTaiDemo4
{
	public static void main(String[] args) 
	{
		Fu f = new Zi();
		System.out.println(f.num);
		f.method1();
		f.method2();//多態中的成員函數運行時看右邊,儘管子類沒有method2方法,可是他繼承了父類的method2方法,所以能夠運行
		//f.method3();//編譯時後報錯,由於多態中的成員函數編譯時看左邊,也就是看父類,父類沒有method3方法,所以會報錯
		f.method4();

		Zi z = new Zi();
		z.method4();

	}
}	
相關文章
相關標籤/搜索