java有哪三大特性

2023-01-06 18:00:45

java的三大特性是:1、封裝,就是將類的某些資訊隱藏在類內部,不允許外部程式直接存取,而是通過該類提供的方法來實現對隱藏資訊的操作和存取。2、繼承,就是子類擁有父類別的所有屬性和方法,從而實現了實現程式碼的複用。3、多型,就是父類別參照指向子類物件,從而產生多種形態。

本教學操作環境:windows7系統、java8版、DELL G3電腦。

Java的三大特性

物件導向三大特性:封裝、繼承、多型。

封裝:

  • 將類的某些資訊隱藏在類內部,不允許外部程式直接存取,而是通過該類提供的方法來實現對隱藏資訊的操作和存取。

繼承:

  • 子類擁有父類別的所有屬性和方法(除了private修飾的屬性不能擁有),從而實現了實現程式碼的複用;

多型:

  • 使用父類別參照接受,不同的子類的物件範例,父類別參照呼叫相同的方法,根據子類不同的範例,產生不同的結果

1、封裝

1)什麼是封裝

概念:儘可能隱藏物件的內部實現細節,控制物件的修改及存取的許可權。

存取修飾符:private (可將屬性修飾為私有,僅本類可見)

2)公共存取方法

以存取方法的形式,進而完成賦值與取值操作。

問題:依舊沒有解決到非法資料錄入!

  • 提供公共存取方法,以保證資料的正常錄入。
  • 命名規範:
  • 賦值:setXXX() //使用方法引數實現賦值
  • 取值:getXXX() //使用方法返回值實現取值

3)範例

public static void main(String[] args) {
		int a;
		Num num = new Num();
//		傳入值100
		num.setNum(100);
		System.out.println(num.getNum());
	}
登入後複製
private int a;

//	在呼叫get方法時,返回本類a的值
	public int getNum() {
		return a;
	}

//	接受傳入的值100,並賦值給本類的a
	public void setNum(int num) {
		this.a = num;
	}
登入後複製

4)過濾有效資料

在公共的存取方法內部,新增邏輯判斷,進而過濾掉非法資料,以保證資料安全。

5)總結

get/set方法是外界存取物件私有屬性的唯一通道,方法內部可對資料進行檢測和過濾。

2、繼承

1)程式中的繼承

  • 程式中的繼承,是類與類之間特徵和行為的一種贈與或獲得。
  • 兩個類之間的繼承關係,必須滿足「is a」的關係。

2)父類別的選擇

  • 現實生活中,很多類別之間都存在著繼承關係,都滿足「is a」的關係。

  • 狗是一種動物、狗是一種生物、狗是一種物質。

  • 多個類別都可作為「狗」的父類別,需要從中選擇出最適合的父類別。

  • 功能越精細,重合點越多,越接近直接父類別。

  • 功能越粗略,重合點越少,越接近Object類。(萬物皆物件的概念)

3)繼承

語法:class 子類 extends 父類別{ } //定義子類時,顯示繼承父類別

public class 子類名 extends 父類別名{
	
	//程式碼塊
	}
登入後複製

應用:產生繼承關係之後,子類可以使用父類別中的屬性和方法,也可定義子類獨有的屬性和方法。

好處:既提高程式碼的複用性,又提高程式碼的可延伸性。

4)繼承的特點

Java為單繼承,一個類只能有一個直接父類別,但可以多級繼承,屬性和方法逐級疊加。

5)不可繼承

構造方法:類中的構造方法,只負責建立本類物件,不可繼承。

private修飾的屬性和方法:存取修飾符的一種,僅本類可見。

父子類不在同一個package中時,default修飾的屬性和方法:存取修飾符的一種,僅同包可見。

3、方法重寫

1)方法的重寫/覆蓋

方法重寫原則:

  • 方法名稱、參數列與父類別相同。
  • 返回值型別必須與父類別相同或其子類
  • 存取修飾符可與父類別相同或是比父類別更寬泛。

方法重寫的執行:

  • 子類重寫父類別方法後,呼叫時優先執行子類重寫後的方法。

  • 方法重寫的特性:

    子類重寫父類別方法時子類方法會覆蓋父類別方法。

    子類重寫父類別方法,存取級別不能嚴於父類別方法。

    子類重寫方法名和型別與父類別一樣。

    父類別的構造方法無法重寫,只能被覆蓋。

範例:

//父類別
public class Animal {
//	父類別中吃的方法會輸出「玩玩玩」
	public void play() {
		System.out.println("玩玩玩");
	}

//	父類別中睡的方法會輸出「睡睡睡」
	public void sleep() {
		System.out.println("睡睡睡");
	}

}
登入後複製
/**
 * 狗類繼承 父類別
 */
public class Dog extends Animal {

//	進行方法重寫,將方法重寫輸出為「狗玩飛碟」
	public void play() {
		System.out.println("狗玩飛碟");
	}
}
登入後複製
public class Test {

	public static void main(String[] args) {
		// 範例化寵物物件
		Dog d = new Dog();
		d.play();
		d.sleep();
	}

}
登入後複製

執行輸出:

在這裡插入圖片描述

2)方法重寫與方法過載的區別

相同點:方法名相同
不同點:
過載:參數列不同,返回值與存取修飾符無關
重寫:參數列相同,返回值相同或其子類,存取修飾符不能比父類別更嚴

4、super關鍵字

1)super關鍵字

super關鍵字可在子類中存取父類別的方法。

  • 使用」super.」的形式存取父類別的方法,進而完成在子類中的複用;
  • 再疊加額外的功能程式碼,組成新的功能。

2)super呼叫父類別無參構造

super():表示呼叫父類別無參構造方法。如果沒有顯示書寫,隱式存在於子類構造方法的首行。

3)super呼叫父類別有參構造

super():表示呼叫父類別無參構造方法。

super(實參):表示呼叫父類別有參構造方法。
參構造被執行

4)this與super

this或super使用在構造方法中時,都要求在首行。
當子類構造中使用了this()或this(實參),即不可再同時書寫super()或super(實參),會由this()指向構造方法完成super()呼叫。

class A{
		public A(){
		System.out.println(( "A-無參構造"));
		}
		public A(int value) {
		System.out.println(("A-有參構造")); 
		}
		}
		class B extends A{
		public B(){
		super();
		System.out.println( "B-無參構造");
		}
		public B(int value) {
//		super();這兩貨不能跟同時存在
		this();
		System.out.println(("B-有參構造"));
		}
		}
登入後複製

5、多型

概念:父類別參照指向子類物件,從而產生多種形態。

二者具有直接或間接的繼承關係時,父類別參照可指向子類物件,即形成多型。

父類別參照僅可呼叫父類別所宣告的屬性和方法,不可呼叫子類獨有的屬性和方法。

1)多型的應用

方法過載可以解決接收不同物件引數的問題,但其缺點也比較明顯。

  • 首先,隨著子類的增加,Master類需要繼續提供大量的方法過載,多次修改並重新編譯原始檔。
  • 其次,每一個feed方法與某一種具體型別形成了密不可分的關係,耦合太高。

場景一:使用父類別作為方法形參實現多型,使方法引數的型別更為寬泛。

public class Animal {
//		父類別中吃的方法會輸出「玩玩玩」
	public void play() {
		System.out.println("玩玩玩");
	}

//	父類別中睡的方法會輸出「睡睡睡」
	public void sleep() {
		System.out.println("睡睡睡");
	}

}
登入後複製
/**
 * 狗類繼承 父類別
 * 
 * 
 *
 */
public class Dog extends Animal {

//	狗類特有的方法「狗吃狗糧」
	public void eat() {
		System.out.println("狗吃狗糧");
	}

}
登入後複製
public class Test {

	public static void main(String[] args) {
		// 範例化寵物物件
		Animal d = new Dog();
		d.play();
		d.sleep();
//		The method eat() is undefined for the type Animal
//		對於型別動物,eat()方法未定義
//		當我們去呼叫子類物件的特有方法時,就會爆出上面的錯誤提示
//		如果想要實現子類特有方法,就必須要強轉
//		d.eat();
		((Dog) d).eat();
	}

}
登入後複製

執行輸出:

在這裡插入圖片描述

場景二:使用父類別作為方法返回值實現多型,使方法可以返回不同子類物件。

範例:

//動物類  父類別
public class Animal {
	public void food() {
		System.out.println("...");
	}
}
登入後複製
//用extends關鍵字,繼承父類別屬性
public class Dog extends Animal {

	public void food() {
		System.out.println("狗吃狗糧");
	}

	public void runing() {
		System.out.println("一直跑跑跳跳");
	}
}
登入後複製
//用extends關鍵字,繼承父類別屬性
public class Fish extends Animal {
	public void food() {
		System.out.println("大魚吃小魚,小魚吃蝦米");
	}

	public void swimming() {
		System.out.println("小魚兒,一直遊");
	}
}
登入後複製
public class Master {
//	傳入你的動物,並去給它餵食
	public void food(Animal animal) {
		System.out.println("餵食");
		animal.food();
	}
}
登入後複製
import java.util.Scanner;

public class Shopping {
//	你沒有動物,所以animal為空
	Animal animal = null;

//	判斷你要購買的寵物,並返回寵物類(狗、魚)
	public Animal shopping(int a) {
		if (a == 1) {
			animal = new Dog();
		} else if (a == 2) {
			animal = new Fish();
		}
//		this.animal=animal;
		return animal;
	}

	public void showMenu() {
		Scanner input = new Scanner(System.in);
		System.out.println("歡迎來到一隻寵物寵物店");
		System.out.println("請選擇喜歡的寵物:");
		System.out.println("1.狗 2.魚 ");
		int a = input.nextInt();
		Animal animal = shopping(a);
		Master mm = new Master();
		mm.food(animal);
//		用instanceof判斷你買的是狗還是魚。
//		狗就執行狗的屬性和方法,魚就執行魚的屬性和方法
		if (animal instanceof Dog) {
			Dog d = (Dog) animal;
			d.runing();
		} else if (animal instanceof Fish) {
			Fish f = (Fish) animal;
			f.swimming();
		}

	}
}
登入後複製
//測試類
public class text {
	public static void main(String[] args) {
		Shopping shop = new Shopping();
		shop.showMenu();
	}
}
登入後複製

執行結果:

在這裡插入圖片描述

2)多型的靜態和動態實現

動態繫結:即為重寫/覆蓋,方法的重寫

動態繫結也叫後期繫結,在執行時,虛擬機器器根據具體物件範例的型別進行繫結,或者說是隻有物件在虛擬機器器中執行建立了之後,才能確定方法屬於哪一個物件範例的

  • 根據實際物件是什麼,就去找相應物件方法去執行。
  • 動態繫結是在執行時才會執行(例如重寫的方法)。

靜態繫結:即為過載,方法的過載

一個方法的引數在編譯階段常被靜態地繫結,它是根據參數列的不同來區分不同的函數,通過編輯之後會變成兩個不同的函數

  • 根據型別找相應的屬性或者靜態變數。
  • 靜態繫結是在編譯時執行(如成員變數,靜態方法)。

更多程式設計相關知識,請存取:!!

以上就是java有哪三大特性的詳細內容,更多請關注TW511.COM其它相關文章!