1. 程式人生 > >第10天----類的三大關係,Object,內部類,異常的簡介

第10天----類的三大關係,Object,內部類,異常的簡介

* 昨天知識總結:

  • 1.abstract
    • 抽象類
    • 抽象方法
  • 2.interface
    • 比較介面與抽象類
      • 介面可以實現多繼承
      • 抽象類除了抽象方法還可以有普通方法—可以有方法的呼叫
    • 介面的定義
    • 介面的構成
    • 介面的注意點
    • 介面中的新特性—正在jdk1.7後,介面中允許有static或default標註的方法可以存方法體
  • 3.多型
    • 多型的基礎
    • 多型的優點
    • 多型的向上轉型和向下轉型
    • 多型的instanceof
    • 多型成員使用

類與類的三種關係

  • 類與類之間產生關係的三種方式:
  • 傳參:
  • 繼承:當可以使用誰是誰描述
  • 組合:當可以使用誰擁有誰描述
  • 傳參的耦合性更低,內聚性更高

Object常用的方法

  • Object是的根類/父類

equals

  • 使用equals方法實現比較
  • equals預設比較的是兩個物件的地址
  • 我們經常會重寫equals方法,按照自己的比較規則比較物件

hashCode

  • hashCode:返回的是雜湊碼值,可以作為物件的唯一標識(身份證)

toString

  • 預設返回的是物件的包名+類名[email protected]+雜湊碼值的十六進位制形式
  • 輸出類的時候,預設呼叫的是toString方法
public class Test {
	public static void main(String[] args) {
		//根據輪子的個數比較兩輛車
		Car car1 =
new Car(5); Car car2 = new Car(4); boolean b = car1.comWithWheels(car2); System.out.println(b); //使用equals方法實現比較 //equals預設比較的是兩個物件的地址 //我們經常會重寫equals方法,按照自己的比較規則比較物件 boolean b1 = car1.equals(car2); System.out.println(b1); //hashCode:返回的是雜湊碼值,可以作為物件的唯一標識(身份證) System.out.println(car1.
hashCode() == car2.hashCode()); int value = car1.hashCode(); System.out.println(value);//雜湊碼值:2018699554 ,他是一個十進位制的數 //雜湊碼值的十六進位制形似 System.out.println(Integer.toHexString(car1.hashCode())); //7852e922雜湊碼值的十六進位制形式 //toString()方法:預設返回的是物件的包名+類名[email protected]+雜湊碼值的十六進位制形式 System.out.println(car1.toString());//[email protected] //後期會經常重寫toString //這裡預設呼叫toString System.out.println(car1); //getClass :瞭解內容 //作用:獲取當前物件的位元組碼檔案-----物件對應的型別是Class Class class1 = car1.getClass(); System.out.println(class1);//class com.qianfeng.test.Car:位元組碼檔案的表示形式 //自己拼接toString方法的預設方法 System.out.println(class1.getName()+"@"+Integer.toHexString(car1.hashCode()));//[email protected] } } class Car{ int wheelNumber; public Car(int wheelNumber) { super(); this.wheelNumber = wheelNumber; } public boolean comWithWheels(Car car) { return this.wheelNumber > car.wheelNumber; } //通過重寫equels方法可以及自主制定比較規則 /* * 問題:能不能將引數改成Car * 答:不能,改完之後,這裡就不是重寫方法了,能夠實現功能,因為這個方法作為Car裡面一個獨立的方法被調出來了,與父類方法無關 */ public boolean equals(Object obj) { //容錯處理 if(!(obj instanceof Car)){ System.out.println("當前物件不是車類"); System.exit(0); } //向下轉型 Car car = (Car)obj; return this.wheelNumber > car.wheelNumber; } //重寫toString:可以更加方便的檢視物件的屬性資訊 @Override public String toString() { return "Car [wheelNumber=" + wheelNumber + ", getClass()=" + getClass() + ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]"; } }

內部類

  • 內部類:定義在A類內部的B類就是內部類,B類在A類內的地位相同,可以互相呼叫
  • 內部類的作用
    • 1.間接實現了多繼承
    • 2.方便定義
    • 3.只有外部類可以訪問建立的內部類的屬性和方法,包括私有方法
    • 4.同一個包中其他類不可見,有了很好的封裝性
class Outer{
	int age;
	class Inner{//內部類
		int height;
		
		
		public void play() {
			System.out.println("Inner-play");
		}
	}
	public void show() {
		//在外部類的方法中呼叫內部類
		Inner inner = new Inner();
		System.out.println("show");
	}
}

建立內部類的兩種方式

  • 第一種方法:藉助於外部類的方法呼叫,實現內部類的呼叫
public class Test {
	public static void main(String[] args) {
		//第一種方法:藉助於外部類的方法呼叫,實現內部類的呼叫
		Outer outer = new Outer();
		outer.show();
	}
}
  • 第二種方式:直接實現內部類
  • 建立內部類物件的方式:外部類的物件.new 內部類的構造方法
  • Outer.Inner:獲取內部類的方式
public class Test {

	public static void main(String[] args) {
		Outer outer = new Outer();
		//第二種方式:直接實現內部類
		//建立內部類物件的方式:外部類的物件.new 內部類的構造方法
		//Outer.Inner:獲取內部類的方式
		Outer.Inner inner = outer.new Inner();
		inner.play();
	}
}

區域性內部類

  • 區域性內部類:定義在一個類方法中的類
  • 作用範圍:從定義區域性內部類開始到show方法結束
  • 作用:對於當前的區域性內部類所在的方法,相當於將他的一部分功能面向物件了,形成了區域性內部類,這樣既保證了程式碼的私有化你,又對程式碼進行了重新的整理,增加了程式碼的可讀性,可操作性,簡化程式碼,增加了複用性。
  • 例項 :要求將兩個功能變成play的私有功能
  • 我們通過區域性內部類實現了功能私有化,並對方法內部的程式碼進行了整理,增強了程式碼的可讀性和可操作性
public class Demo5 {
	public void play() {
   	class Inner{
   		//因為方法的定義之間是不能巢狀的,所以必須通過區域性內部類實現
   		public void gongneng1() {
   			System.out.println("gongneng1");
   		}
   		public void gongneng2() {
   			System.out.println("gongneng2");
   		}
   	}
   	Inner inner = new Inner();
   	inner.gongneng1();
   	inner.gongneng2();
   }
   public void show() {
   	//無法呼叫,因為這兩個方法是play方法的區域性內部類的方法
//		gongneng1();
//		gongneng2();
   }
}
  • 靜態內部類
  • 注意點
  • 1.靜態內部類中可以沒有靜態成員
  • 2.有靜態成員的一定是靜態內部類
  • 靜態內部類的物件的建立
    • 注意:要保證內部類本身是靜態的
    • 構成:new 外部類,內部類的構造方法
public class Demo7 {
public static void main(String[] args) {
	//工作
	//靜態的物件
	//注意:要保證內部類本身是靜態的
	//構成:new 外部類,內部類的構造方法
	Outer3.Inner inner = new Outer3.Inner();
	
	//呼叫方法
	inner.play();
	inner.show();
	Outer3.Inner.show();
	
}
}
class Outer3{
	static class Inner{//靜態內部類
		//非靜態的方法
		public void play() {
			System.out.println("非靜態的方法:play");
		}
		//靜態的方法
		public static void show() {
			System.out.println("靜態的方法-show");
	}
	}
}

匿名內部類

  • 匿名內部類(物件):定義在一個類的方法中的匿名子類物件,屬於區域性內部類
  • 1.匿名子類物件
  • 2.匿名的內部類物件
  • 建立匿名內部類物件注意點1.匿名內部類必須有父類或父介面
  • 匿名內部類物件的作用
    • 1.當只用到當前子類的一個例項物件的時候,定義好馬上使用
    • 2.當不好起的名字的時候
    • 3.可以更好的定義執行時的回撥(知道即可)
public class Text{
	public static void main(String[] args) {
		Out out = new Out();
		out.show();
		out.testCanshu1();
		out.testCanshu2();
		Tests tests1 = out.testFanhuizhi();
		System.out.println(tests1);
		Tests tests2 = out.testFanhuizhi2();
		tests2.testMethod();
//		tests2.play;
		System.out.println(tests2);
	}
}
//研究匿名內部類
class Tests{
	public void testMethod() {
		System.out.println("Tests-testMethod");
	}	
}

class Out{
	public void show() {
		new Tests() {//匿名內部類
			public void testMethod() {
				System.out.println("沒有名字-testMethod");
				play();
			}
			//自己的方法
			public void play() {
				System.out.println("沒有名字-play");
			}
		}.testMethod();
	}
	
	//普通的匿名物件充當方法
	public void testCanshu1() {
		System.out.println(new Tests());
	}
	//使用匿名的子類物件充當引數
	public void testCanshu2() {
		System.out.println(new Tests() {
			public void testMethod() {
				System.out.println("沒有名字-testMethod");
				play();
			}
			//自己的方法
			public void play() {
				System.out.println("沒有名字-play");
			}
			
		}
		);
	}
	//普通的匿名物件作返回值
	public Tests testFanhuizhi(){
		return new Tests();
	}
	//使用匿名的內部類充當返回值
	public Tests testFanhuizhi2(){
		return new Tests() {
			public void testMethod() {
				System.out.println("沒有名字-testMethod");
				play();
			}
			//自己的方法
			public void play() {
				System.out.println("沒有名字-play");
			}
		};
	}
	//練習:建立介面的匿名內部類
}

異常簡介

  • 異常:程式中出現的不正常情況,
  • 異常:程式在執行過程中不正常的情況,程式將他進行了屬性和行為(異常的位置,原因,名字等)的抽象,提取,形成了物件。
  • 形成了各種異常類
  • 異常的分類:
    • throwable(異常類)
      • 1.error:叫錯誤,程式執行過程中出現的嚴重問題,我們不需要去修改
      • 2.Exception:我們平時稱的異常,程式在執行過程中出現的不嚴重的問題,我們可以去修改
    • Exception分類:
      • 第一種分類方式:編譯異常:在編譯階段丟擲異常,處理異常
      • 執行時異常:在執行階段丟擲異常,處理異常
      • 第二種分類方式:系統異常:系統提前定義好的,我們直接拿來使用
      • 自定義異常:需要我們自定義的
  • 異常的正常處理
public class Demo9 {
	public static void main(String[] args) {//4.這裡也沒有處理異常的能力,將異常物件向上拋,拋給JVM(Java虛擬機器)
											//JVM的處理方法:呼叫異常物件的列印方法,將異常資訊列印到控制檯
		Math math = new Math();
		int value = math.div(3,0);//3.這裡也沒有處理異常的能力,將異常物件向上拋
		System.out.println(value);
	}
}
class Math{
	public int div(int a,int b) {//2.這裡也沒有處理異常的能力,將異常物件向上拋
		return a/b;//1.建立除數為零的異常物件(ArithmeticException()),
					//這裡沒有處理異常的能力,將異常物件向上拋,拋給他所在的方法
	}
	
}