您好,登錄后才能下訂單哦!
這篇文章主要介紹了java的三大特性怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇java的三大特性怎么使用文章都會有所收獲,下面我們一起來看看吧。
java的三大特性是:1、封裝,就是將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。2、繼承,就是子類擁有父類的所有屬性和方法,從而實現了實現代碼的復用。3、多態,就是父類引用指向子類對象,從而產生多種形態。
面向對象三大特性:封裝、繼承、多態。
封裝:
將類的某些信息隱藏在類內部,不允許外部程序直接訪問,而是通過該類提供的方法來實現對隱藏信息的操作和訪問。
繼承:
子類擁有父類的所有屬性和方法(除了private修飾的屬性不能擁有),從而實現了實現代碼的復用;
多態:
使用父類引用接受,不同的子類的對象實例,父類引用調用相同的方法,根據子類不同的實例,產生不同的結果
1、封裝
概念:盡可能隱藏對象的內部實現細節,控制對象的修改及訪問的權限。
訪問修飾符:private (可將屬性修飾為私有,僅本類可見)
以訪問方法的形式,進而完成賦值與取值操作。
問題:依舊沒有解決到非法數據錄入!
提供公共訪問方法,以保證數據的正常錄入。
命名規范:
賦值:setXXX() //使用方法參數實現賦值
取值:getXXX() //使用方法返回值實現取值
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;
}
在公共的訪問方法內部,添加邏輯判斷,進而過濾掉非法數據,以保證數據安全。
get/set方法是外界訪問對象私有屬性的唯一通道,方法內部可對數據進行檢測和過濾。
2、繼承
程序中的繼承,是類與類之間特征和行為的一種贈與或獲得。
兩個類之間的繼承關系,必須滿足“is a”的關系。
現實生活中,很多類別之間都存在著繼承關系,都滿足“is a”的關系。
狗是一種動物、狗是一種生物、狗是一種物質。
多個類別都可作為“狗”的父類,需要從中選擇出最適合的父類。
功能越精細,重合點越多,越接近直接父類。
功能越粗略,重合點越少,越接近Object類。(萬物皆對象的概念)
語法:class 子類 extends 父類{ } //定義子類時,顯示繼承父類
public class 子類名 extends 父類名{
//代碼塊
}
應用:產生繼承關系之后,子類可以使用父類中的屬性和方法,也可定義子類獨有的屬性和方法。
好處:既提高代碼的復用性,又提高代碼的可擴展性。
Java為單繼承,一個類只能有一個直接父類,但可以多級繼承,屬性和方法逐級疊加。
構造方法:類中的構造方法,只負責創建本類對象,不可繼承。
private修飾的屬性和方法:訪問修飾符的一種,僅本類可見。
父子類不在同一個package中時,default修飾的屬性和方法:訪問修飾符的一種,僅同包可見。
3、方法重寫
方法重寫原則:
方法名稱、參數列表與父類相同。
返回值類型必須與父類相同或其子類
訪問修飾符可與父類相同或是比父類更寬泛。
方法重寫的執行:
子類重寫父類方法后,調用時優先執行子類重寫后的方法。
方法重寫的特性:
子類重寫父類方法時子類方法會覆蓋父類方法。
子類重寫父類方法,訪問級別不能嚴于父類方法。
子類重寫方法名和類型與父類一樣。
父類的構造方法無法重寫,只能被覆蓋。
示例:
//父類
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();
}
}
運行輸出:
相同點:方法名相同
不同點:
重載:參數列表不同,返回值與訪問修飾符無關
重寫:參數列表相同,返回值相同或其子類,訪問修飾符不能比父類更嚴
4、super關鍵字
super關鍵字可在子類中訪問父類的方法。
使用”super.”的形式訪問父類的方法,進而完成在子類中的復用;
再疊加額外的功能代碼,組成新的功能。
super():表示調用父類無參構造方法。如果沒有顯示書寫,隱式存在于子類構造方法的首行。
super():表示調用父類無參構造方法。
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、多態
概念:父類引用指向子類對象,從而產生多種形態。
二者具有直接或間接的繼承關系時,父類引用可指向子類對象,即形成多態。
父類引用僅可調用父類所聲明的屬性和方法,不可調用子類獨有的屬性和方法。
方法重載可以解決接收不同對象參數的問題,但其缺點也比較明顯。
首先,隨著子類的增加,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();
}
}
運行結果:
動態綁定
:即為重寫/覆蓋,方法的重寫
動態綁定也叫后期綁定,在運行時,虛擬機根據具體對象實例的類型進行綁定,或者說是只有對象在虛擬機中運行創建了之后,才能確定方法屬于哪一個對象實例的
根據實際對象是什么,就去找相應對象方法去執行。
動態綁定是在運行時才會執行(例如重寫的方法)。
靜態綁定
:即為重載,方法的重載
一個方法的參數在編譯階段常被靜態地綁定,它是根據參數列表的不同來區分不同的函數,通過編輯之后會變成兩個不同的函數
根據類型找相應的屬性或者靜態變量。
靜態綁定是在編譯時執行(如成員變量,靜態方法)。
關于“java的三大特性怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“java的三大特性怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。