天天看點

黑馬程式員——java基礎--面向對象(篇二)

------ Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------

第一章

1、多态              2、類型轉換   3、多态核心思想        4、綁定              5、接口

第二章

1、内部類        2、異常              3、異常報告不準确的問題   4、模版設計

第三章

1、分層思想        2、子父類異常

第一章

1、多态

同一事物具有多種形态,java中指對象。同一對象可以有多種引用。

函數也具有多态性:重載和覆寫。

多态的出現大大提高了程式的擴充性。

擴充性:包括體系内部的擴充 和 外部體系擴充。

多态十分體系内部擴充(定義接口,擴充子類)

前提:

有繼承或者實作關系;

通常,還存在覆寫。

弊端:

隻能使用父類的引用通路父類中存在的成員。

代碼示範:

/*
繼承中多态
*/
class Fu
{
	String name="fu";
}

class Zi extends Fu
{
	String name="zi";
}

class Test
{
public static void main(String[] args)	
{
  Fu o =new Zi();
  System.out.println(o.name);
}

}
           

2、類型轉換

向上轉型===類型自動提升

向下轉型===強制轉換(本來就是這種對象)

多态自始至終都是子類做着變化。

關鍵字:instanceof  xx是否是yy執行個體的引用 。

3、多态核心思想

代碼向上抽取,形成大類,建立工具類,利用多态的思想,通過用工具類操作大類來操作小類,然後在main中調用工具類即可

實作步驟:

1.建立體系:大類和工具類

2.調用:主函數調用工具類

成員函數在多态調用中,編譯看左邊,運作看右邊;

注意:成員變量在多态調用中,編譯運作都看左邊(????多态運用中,成員變量無重寫特性);

靜态成員變量在多态的調用中,編譯運作都看左邊  (因為它是随類加載的,不依賴對象)。

代碼示範:

/*
建立體系
1.建立具有基本功能的基類
2.建立操作該基類的工具類
*/
abstract class Student
{
	public abstract void study();
	public abstract void eat();
}

class StudenntTool
{
	public  void doo(Student stu){
		stu.study();
		stu.eat();
	}


}
/*
後期增加的子功能類

*/

//基礎班學生
class BaseStudent extends Student
{
	public void eat()
	{
		 System.out.println("基礎班的學生在吃飯");
	}

	public void study()
	{
		System.out.println("基礎班的學生在學習");
	}
}
//進階班學生
class AdvStudent extends Student
{
	public void eat()
	{
		 System.out.println("進階班的學生在吃飯");
	}

	public void study()
	{
		System.out.println("進階班的學生在學習");
	}
}


class Test
{
	public static void main(String[] args)
	{
		StudenntTool st=new StudenntTool();
		st.doo(new BaseStudent() );
		st.doo(new AdvStudent() );
	}

}
           

4、綁定

方法區中,存在靜态區和非靜态區。

靜态綁定:靜态成員綁定在類上的;

動态綁定:非靜态成員是綁定在對象上的。

5、接口

 (1)總結

interface:降低耦合性,提高擴充性,定義規則;

多态:提高程式擴充性。

(2)接口設計

在程式設計 前,一定要進行結構設計,使用好接口,牢記功能擴充。

(3)代碼示範

/*
電腦的運作需要主機闆
在主機闆上需要不斷的擴充功能

思路:
1。建立主機闆
2,在主機闆上預留接口,該接口可以進行多中功能的擴充
3,實作擴充功能

*/
//定義主機闆
class MainBoard
{
	public void run()
	{
		System.out.println("主機闆運作");
	}

	public void stop()
	{
		System.out.println("主機闆停止運作");
	}

	public void userPCI( PCI p)
	{
		
			p.open();
			p.close();
	}
}

//定義接口
interface PCI
{
	public void open();
	public void close();
}


//後期功能擴充
//接入網卡
class NetCard implements PCI
{
	public void open()
	{
		System.out.println("開啟網卡");
	}
	public void close()
	{
		System.out.println("關閉網卡");
	}
}
//接入聲霸卡
class SoundCard implements PCI
{
	public void open()
	{
		System.out.println("開啟聲霸卡");
	}
	public void close()
	{
		System.out.println("關閉聲霸卡");
	}
}


//用電腦:
class Test
{
	public static void main(String[] args)
	{
		MainBoard mb=new MainBoard();
		mb.run();
		mb.userPCI( new NetCard() );
		mb.userPCI( new SoundCard() );
		mb.stop();
	}
}
           

第二章

1、内部類

(1)簡介

屬于類的成員,可以直接通路類的其他成員

外部類通路它的格式:outer.inner(兩者均為對象)

内部類為什麼能直接通路外部類成員?

:是因為内部類持有外部類的一個引用,格式:Outer.this.x

(2)内部類的設計

當事物中内部事物需要通路外部事物的成員時,建立内部類

匿名内部子類對象:是内部子類的簡寫格式

                                實質是一個對象,這個對象有點胖

前提:匿名内部子類對象必須繼承父類或者實作接口

基本格式:

void  function()
{
        new Object()
       {
                void  method(){
                    System.out.println(“……………….”);
               }
       }
}
           

(3)匿名内部類 的局限性

            a.隻能一次性調用;

            b.建立父類或者接口引用,也隻能調用父類或接口中存在的方法。

    事實上,一般為了友善,也不會建立自己特有的方法。

(4)代碼示範:

class Outer
{
	public  int age=10;
	//成員位置上的内部類

	public  class Inner
	{
		//public int age=20;

		public void function(){
			System.out.println("age="+age);

		}
	}

	public void function(){
		/*//局部内部類
		class C
		{
			void print(){
				System.out.print("我是局部内部類");
			}
		}
		new C().print();
		*/
		//匿名内部類
		
	}
}

class Test
{
	public static void main(String [] args)

	{
		Outer o=new Outer();
		Outer.Inner i=new Outer().new Inner();

		//System.out.println(o.age);
		//System.out.println(i.age);
		//i.function();
		o.function();
		System.out.println();

		new Object(){
			void function(){
			System.out.println("匿名内部類");
				
			
			}
		}.function();
	}	
}
           

2、異常

(1)簡介

          問題也是一種事物,java中的問題分error(不可治愈)和Exception(可治愈)兩大類,把共性的部分不斷地向上抽取,形成了一個體系,這個父類是Rhrowable。

(2)異常處理

    a,throw抛出;

    b,try…catch。

異常聲明:經可能詳細,可聲明多個,用多個catch處理,之間若有繼承關系,父類往後放。

一般不列印,用日志檔案記錄異常,便于開發人員排查問題。

(3)自定義異常

a.繼承exception

b.抛異常+聲明異常

c.處理異常

d.可以建立自己特有的函數

(4)throw與throws差別

throw:用在函數内,後面跟函數對象

throws:用在函數上,後面跟函數名

(5)RunTimeException

RunTimeException該類及其子類很特殊,在函數内抛異常不需聲明,這是因為:jvm不希望操作這處理,而希望程式停掉,修正代碼。

(6)代碼示範:

/*
老師用電腦講課

電腦出問題:
1.藍屏了
2冒煙了

電腦問題引起老師的問題
*/
class Compt
{
	private int state=3;
	public void run() throws MaoYan,LanPin
	{
		if(state==1)
			System.out.println("電腦運作");
		if(state==2)
			throw new LanPin();
		if(state==3)
			throw new MaoYan();
	}

	public void reset(){
		state=1;
		System.out.println("電腦重新開機");
	
	}	
}

class Teacher
{
	private String name;
 	private Compt compt;

	public Teacher(String name){
		
		this.name=name;
		compt=new Compt();
	}

	public void jiangKe() throws Jihua
	{
		try{
			compt.run();

		}catch(LanPin  e){
			compt.reset();
		}catch(MaoYan  e){
			throw new Jihua("冒煙了");
		}
		  System.out.println("老師講課");
	}
}


class MaoYan extends Exception
{
	public MaoYan(){
		super();
	}

}

class LanPin extends Exception
{
	
	public LanPin(){
		super();
	}
}

class Jihua extends Exception
{
	
	public Jihua(String message){
		super(message);
	}
}


class Test
{
	public static void main(String [] args){
		try
		{
			Teacher t=new Teacher("zhuyutao");
			t.jiangKe();
		}
		catch(Jihua e)
		{
			System.out.println("換老師或放假"+e);
		
		}
		
	}
}
           

3、異常報告不準确的問題

a,異常又分為編譯異常和運作異常

編譯以異常:需要聲明

運作異常:不需要聲明

b,在日常中發現:

異常是層層抛出的,在功能函數上聲明,在功能函數内部抛出,在調用時處理,處理分兩種情況:能處理則處理、不能處理則轉換抛出。

轉化抛出,提供了解決之策,但也隐瞞了真實錯誤。(了解這一點,十分有利于排除異常)

練習題:

需求:擷取一段程式運作的時間。

原理:擷取程式開始和結束的時間并相減即可。

擷取時間,System.currentTimeMillis();

當代碼完成優化後,就可以解決這類問題。

這種方式,模版方法設計模式。

4,模版設計

在定義功能時,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分。那麼這時就将不确定的部分暴露出去。由該類的子類去完成。

第三章

1、分層思想

實質是資料封裝,對象封裝

如:異常的層層外抛,如果一個問題決解不了,先封裝再抛出

小知識點:

Finally,肯定會執行的代碼塊(exit除外)。通常用來關閉資源。

Return 後面不能有語句。

throw封裝在函數中 時後面可以有語句,不在函數中時後面不能有語句。

2、異常補充

Try{

             throw new     xxException ("列印資訊");

}catch(xxException e){

}

上述,寫法是可以的,隻要問題解決了,不用聲明

Try{

             throw new xxException();

}catch(xxException e){

               throw e;

}

這種情況,編譯不能通過,問題抛出沒有解決,就得聲明。

3、子父類異常

子父類異常:

子類隻能抛繼承的異常或者繼承異常的子類;

子類特有的異常,必須處理。

異常分為:

編譯時異常和運作時異常。

代碼示範:

package pack;
/*
求圖形的面積

過程中發生的問題,分裝成異常對象

正常流程代碼  應該和異常代碼分開,提高閱讀性

體系内基本功能用calss
體系外功能擴充用interface
以下,我們用接口

*/

interface Areaa
{
	 void getArea();
} 

class Rec implements Areaa
{	
	private int width;
	private int height;

	Rec(int width,int height){

		if(width<=0 || height<=0)
			throw new NoException("出錯了");

		this.width=width;
		this.height=height;
	}

	public void getArea()
	{
		System.out.println(width*height);
	}

}

class Circle implements Areaa
{	
	private int radius;
	public static final double PI=3.14;

	Circle(int radius){

		if(radius<=0 )
			throw new NoException("出錯了");

		this.radius=radius;

	}

	public void getArea()
	{
		System.out.println(radius*radius*PI);
	}

}

class NoException extends RuntimeException
{
	NoException(String msg){
		super(msg);
	}
}

class Test
{
	public static void main(String[] args)
	{
		try{
			new Rec(3,4).getArea();
			new Circle(-3).getArea();
		}catch(NoException e){
			System.out.println(e);
		}
	}
}
           

有錯漏之處,歡迎指正!

 ------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------