黑馬程序員-java基礎-面向對象-多態和內部類

-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!--------------------------

多態

1、含義:父類的引用指向了自己的子類對象。
2、多態的好處:多態的出現大大的提高了代碼的擴展性。
3、多態的前提
第一,類與類之間要有關係,要麼繼承,要麼實現;
第二,一般還要有:存在覆蓋
4、多態的弊端
雖然提高了擴展性,但是隻能使用父類的引用的訪問父類中的成員。
5、多態的轉型
轉型包括向上轉型和向下轉型
向上轉型:Animal a=new Cat();爲向上轉型。即父類引用指向子類對象
向下轉型:Cat c=(Cat)a;爲向下轉型。將父類引用轉爲子類引用
向下轉型主要用於調用子類的特有方法。

例子:

abstract class Animal
		{
			public abstract void eat();
		}
		class Cat extends Animal
		{
			public void eat()
			{
				System.out.println("吃魚");
			}
			public void catchMouse()
			{
				System.out.println("抓老鼠");
			}
		}
		class Dog extends Animal
		{
			public void eat()
			{
				System.out.println("吃骨頭");
			}
			public void kanJia()
			{
				System.out.println("看家");
			}
		}
		class DuoTaiDemo 
		{
			public static void main(String[] args) 
			{
				//function(new Cat());
				//function(new Dog());
				FunctionDemo fd=new FunctionDemo();
				fd.function(new Cat());
				fd.function(new Dog());
			}
			/*
			public static void function(Animal a)
			{
				a.eat();
				if (a instanceof Cat)
				{
					Cat c=(Cat)a;
					c.catchMouse();
				}
				else if (a instanceof Dog)
				{
					Dog d=(Dog)a;
					d.kanJia();
				}

			}
			*/
		}
		//將上面註釋掉的代碼單獨封裝成了一個類,這樣提高了代碼的複用性
		class FunctionDemo
		{
			public static void function(Animal a)
			{
				//由於大家都要訪問吃的功能,所以爲了不每次都調用此功能
				//所以利用多態來調用此功能
				a.eat();
				if (a instanceof Cat)
				{
					//向下轉型,來調用子類的特有方法
					Cat c=(Cat)a;
					c.catchMouse();
				}
				else if (a instanceof Dog)
				{
					Dog d=(Dog)a;
					d.kanJia();
				}
			}
		}
-----------------------------------------------------------------------------------
內部類
當內部類定義在成員位置上時
1
、定義
將一個類定義在另一個類裏面,對裏面的那個類就成爲就成爲內部類(內置類、嵌套類)
2、特點
第一,內部類可以直接訪問外部類中的成員,包括私有。之所以可以訪問外部類的成員
是因爲內部類中持有了一個外部類的引用。
第二,外部類要訪問內部類,必須建立內部類對象。
3、訪問格式:
當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他的類中,可以直接
建立內部類對象。
格式:Outer.Inner in=new Outer().new Inner();
4、當內部類在成員位置上,就可以被成員修飾符所修飾。比如,private,static。當
被private修飾,則將內部類在外部類中進行封裝;當被static所修飾時,內部類就
具備了static的特性。當內部類被static修飾後,只能直接訪問外部類中的static
成員,出現了訪問侷限。
5、在外部其他類中,如何直接訪問static內部類的非靜態成員呢?
利用建立內部類對象來訪問,
建立內部類對象格式爲:new 外部類名.內部類名()
則也可直接建立了對象之後直接調用此方法:new 外部類名.內部類名().function();
即 new Outer.Inner().function();
6、在外部其他類中,如何直接訪問static內部類的靜態成員?
直接寫成:Outer.Inner.function();
7、注意:
第一,當內部類定義了靜態成員,該內部類也必須是static的;
第二,當外部類的靜態方法訪問內部類時,內部類也必須是靜態的。
例子:

class Outer
		{
			private int x=3;
			//內部類
			class Inner
			{
				void function()
				{
					System.out.println("inner:"+x);//即本身是Outer.this.x即省略了Outer.this
				}
			}
			void method()
			{
				Inner in=new Inner();//外部類要想訪問內部類方法,則必須創建內部類對象。
				in.function();
			}
		}
		class InnerClassDemo 
		{
			public static void main(String[] args) 
			{
				Outer ou=new Outer();
				ou.method();//通過調用方法method來訪問內部類的方法
			}
		}
}
內部類定義在局部時
特點:
第一,不可被成員修飾符修飾,eg private,static
第二,可以直接訪問外部類中的成員,因爲持有外部類中的引用。但是不可以訪問
它所在的局部中的變量,只能訪問被final修飾的局部變量。
例子:

class Outer
		{
			private int x=3;
			//內部類
			void method()
			{
				//內部類在局部位置上
				class Inner
				{
					void function()
					{
						System.out.println("inner:"+x);//即本身是Outer.this.x即省略了Outer.this
					}
				}
				new Inner().function();
			}
		}
		class InnerClassDemo 
		{
			public static void main(String[] args) 
			{
				Outer ou=new Outer();
				ou.method();//通過調用方法method來訪問內部類的方法
			}
		}
-----------------------------------------------------------------------------------
匿名內部類
特點
:
第一,匿名內部類其實就是內部類的簡寫格式
第二,定義匿名內部類的前提:內部類必須是繼承一個類或者實現一個接口
第三,匿名內部類的格式:new 父類或者接口(){定義子類內容}
第四,其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖,即帶內容的對象
第五,匿名內部類中定義的方法最好不要超過三個。
例子:

需求:根據main函數中給的形式來寫其他的程序代碼。利用匿名內部類。
第一個方式:
interface Inner
{
	public abstract void method();
}
class Test
{
	public static Inner function()
	{
		//利用匿名內部類
		return new Inner()
		{
			public void method()
			{
				System.out.println("內部類");
			}
		};
	}
}
class InnerDemo 
{
	public static void main(String[] args) 
	{
		Test.function().method();//看到此類直接調用的function()說明此方法爲靜態的
		//而且又調用了方法method,則說明function方法返回一個對象
	}
}
第二個方式
interface Inner
{
	public abstract void method();
}
class B
{
	public void show(Inner in)
	{
		in.method();
	}
}
class InnerDemo
{
	public static void main(String[] args)
	{
		B b=new B();
		//利用匿名內部類來傳入此參數。
		b.show(new Inner()
		{
			public void method()
			{
				System.out.println("黑馬程序員");
			}
		});
	
	}
}

 

-------------------------ASP.Net+Unity開發、.Net培訓、期待與您交流!--------------------------


詳情請查看:http://edu.csdn.net



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