究Java三大特性之封裝、繼承、多態(tài))
Java SE基礎(chǔ)文章目錄Java SE基礎(chǔ)1. Java特性和優(yōu)勢(shì)2. Java的三大版本3. JDK、JRE、JVM三者關(guān)系JDKJava Development KitJava開(kāi)發(fā)者工具包JREJava Runtime EnvironmentJava運(yùn)行時(shí)環(huán)境JVMJava Virtual MachineJava虛擬機(jī)4.Java 三大特性以及其JavaSE重要基礎(chǔ)知識(shí)4.1.封裝4.1.1封裝的好處4.2.繼承4.2.1概念4.2.2 super講解4.2.2.1super的主要用法4.2.3 方法重寫1.實(shí)現(xiàn)子類的特定行為2.支持多態(tài)性4.3.多態(tài)4.3.1 多態(tài)定義4.3.11.多態(tài)性的體現(xiàn)4.3.2.2.代碼的通用性和可擴(kuò)展性4.3.2多態(tài)的注意事項(xiàng)1. Java特性和優(yōu)勢(shì)Java作為一種廣泛使用的編程語(yǔ)言擁有以下特性和優(yōu)勢(shì)簡(jiǎn)單性Java的語(yǔ)法設(shè)計(jì)簡(jiǎn)潔明了易于學(xué)習(xí)和使用。它去除了C中的一些復(fù)雜特性例如指針操作和多重繼承使得開(kāi)發(fā)者能夠更專注于邏輯實(shí)現(xiàn)??梢浦残圆幌奁脚_(tái)Java通過(guò)“一次編寫到處運(yùn)行”Write Once, Run Anywhere的理念實(shí)現(xiàn)了跨平臺(tái)特性。只要目標(biāo)設(shè)備支持Java虛擬機(jī)JVMJava程序無(wú)需修改即可運(yùn)行。動(dòng)態(tài)性反射Java支持運(yùn)行時(shí)反射機(jī)制允許程序在運(yùn)行時(shí)動(dòng)態(tài)檢查類、方法和屬性甚至修改自身行為。這種特性在框架開(kāi)發(fā)如Spring中尤為重要。分布式Java內(nèi)置了對(duì)網(wǎng)絡(luò)編程的支持如Socket、RMI等使得開(kāi)發(fā)分布式應(yīng)用程序如跨服務(wù)器通信的系統(tǒng)更加簡(jiǎn)單和高效。多線程Java提供了強(qiáng)大的多線程支持開(kāi)發(fā)者可以通過(guò)線程類或Runnable接口輕松實(shí)現(xiàn)并發(fā)任務(wù)提高程序的執(zhí)行效率。面向?qū)ο驤ava是一種純粹的面向?qū)ο笳Z(yǔ)言支持封裝、繼承和多態(tài)等特性有助于編寫結(jié)構(gòu)化、可重用的代碼。健壯性Java通過(guò)強(qiáng)類型檢查、異常處理機(jī)制和自動(dòng)垃圾回收功能減少了程序出錯(cuò)的可能性提高了代碼的穩(wěn)定性。安全性Java內(nèi)置了多層次的安全機(jī)制例如字節(jié)碼驗(yàn)證、類加載器和安全管理器有效防止惡意代碼的執(zhí)行。2. Java的三大版本Java根據(jù)應(yīng)用場(chǎng)景的不同分為以下三大版本**Java SEStandard Edition標(biāo)準(zhǔn)版**這是Java的核心版本主要用于開(kāi)發(fā)桌面應(yīng)用程序如Swing界面程序、控制臺(tái)應(yīng)用程序以及簡(jiǎn)單的服務(wù)器程序。它包含了Java的基礎(chǔ)API和功能是其他版本的基礎(chǔ)。**Java MEMicro Edition微型版**專為資源受限的嵌入式設(shè)備設(shè)計(jì)例如早期功能手機(jī)、PDA以及小型家電。它是Java SE的精簡(jiǎn)版適用于低功耗、低內(nèi)存的場(chǎng)景。**Java EEEnterprise Edition企業(yè)版**企業(yè)版基于Java SE擴(kuò)展專注于大規(guī)模、分布式、多層的企業(yè)級(jí)應(yīng)用開(kāi)發(fā)。它提供了豐富的API如Servlet、JSP、EJB等廣泛用于Web開(kāi)發(fā)、服務(wù)器端應(yīng)用和企業(yè)系統(tǒng)。3. JDK、JRE、JVM三者關(guān)系這三個(gè)是Java生態(tài)系統(tǒng)中不可或缺的組成部分以下是它們的詳細(xì)解釋JDKJava Development KitJava開(kāi)發(fā)者工具包JDK是面向開(kāi)發(fā)者的完整工具集包含了編寫、編譯和調(diào)試Java程序所需的一切。它包括編譯器javac將Java源代碼編譯為字節(jié)碼。Java API提供豐富的類庫(kù)供開(kāi)發(fā)者調(diào)用。調(diào)試工具和其他實(shí)用程序。 JDK還包含了JRE因此安裝JDK后即可運(yùn)行Java程序。JREJava Runtime EnvironmentJava運(yùn)行時(shí)環(huán)境JRE是運(yùn)行Java程序的最小環(huán)境適合只需要執(zhí)行Java應(yīng)用而無(wú)需開(kāi)發(fā)的普通用戶。它包括Java虛擬機(jī)JVM負(fù)責(zé)執(zhí)行字節(jié)碼。Java核心類庫(kù)提供運(yùn)行時(shí)所需的基本功能如I/O、集合框架等。Java命令行工具如java命令。 JRE不包含開(kāi)發(fā)工具因此無(wú)法編譯Java代碼。JVMJava Virtual MachineJava虛擬機(jī)JVM是Java跨平臺(tái)特性的核心。它是一個(gè)虛擬化的運(yùn)行環(huán)境負(fù)責(zé)將Java字節(jié)碼.class文件解釋或編譯為本地機(jī)器碼。管理內(nèi)存包括垃圾回收。提供硬件和操作系統(tǒng)的抽象層。 每個(gè)Java程序運(yùn)行時(shí)都會(huì)啟動(dòng)一個(gè)JVM實(shí)例。如下圖清晰展示三者的關(guān)系4.Java 三大特性以及其JavaSE重要基礎(chǔ)知識(shí)4.1.封裝? 口訣【 屬性私有g(shù)et/set】。當(dāng)我們需要獲取元素時(shí)使用get/set方法獲取元素。? 屬性內(nèi)可添加對(duì)數(shù)據(jù)添加的要求。樣例代碼importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);Stringnamesc.nextLine();intagesc.nextInt();PersonxiaomingnewPerson();xiaoming.setName(name);xiaoming.setAge(age);xiaoming.study();}}publicclassPerson{privateStringname;privateintage;Person(){}//無(wú)參構(gòu)造方法Person(Stringname,intage){this.namename;this.ageage;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){if(age0||age100){System.out.println(您輸入的年齡有誤);}else{this.ageage;}}publicvoidstudy(){System.out.println(this.name is studying );}}在此案例中我們將name與age私有后就需要通過(guò)get/set方法修改或獲取name/age元素4.1.1封裝的好處1.提高程序的安全性保護(hù)數(shù)據(jù)2.隱藏代碼的實(shí)現(xiàn)細(xì)節(jié)3.統(tǒng)一接口4.提高系統(tǒng)可維護(hù)性4.2.繼承4.2.1概念使用關(guān)鍵字extends繼承的本質(zhì)是對(duì)某一批類的抽象從而實(shí)現(xiàn)對(duì)現(xiàn)實(shí)世界更好的建模。在java只有單繼承沒(méi)有多繼承。在java中所有類繼承與Object類4.2.2 super講解簡(jiǎn)單來(lái)說(shuō)super的作用即是調(diào)用或引用父類。使用注意點(diǎn)調(diào)用父類的構(gòu)造方法必須只能出現(xiàn)在子類的方法或者構(gòu)造方法中super和this 不能同時(shí)調(diào)用構(gòu)造方法在子類的無(wú)參方法中系統(tǒng)自動(dòng)調(diào)用父類的無(wú)參構(gòu)造方法 4.2.2.1super的主要用法訪問(wèn)父類的成員變量使用super關(guān)鍵字可以在子類中訪問(wèn)父類中的成員變量。這對(duì)于在子類中有相同名字的成員變量時(shí)很有用以便明確指定你想要訪問(wèn)的是父類的成員變量。packagecom.sky.test;classParent{intx10;}classChildextendsParent{intx20;voiddisplay(){System.out.println(super.x);// 訪問(wèn)父類的x變量 10System.out.println(this.x);// 訪問(wèn)子類的x變量 20}}publicclassMain{publicstaticvoidmain(String[]args){ChildchildnewChild();child.display();}}調(diào)用父類中的構(gòu)造方法在子類的構(gòu)造函數(shù)中使用super關(guān)鍵字可以調(diào)用父類的構(gòu)造函數(shù)。這通常用于初始化父類的成員變量或執(zhí)行父類構(gòu)造函數(shù)的邏輯。經(jīng)常用在下面這種情況類中有些變量是子類繼承父類的 利用super可調(diào)用父類的構(gòu)造方法將其賦值代碼案例classParent{intx;Parent(intx){this.xx;}}classChildextendsParent{inty;Child(intx,inty){super(x);// 調(diào)用父類構(gòu)造函數(shù) 將x賦值this.yy;}// Override 不理解也沒(méi)事不帶上這個(gè)注解一樣能正常運(yùn)行Override// java中的注解 此處的意思是表明此方法是重寫過(guò)的方法publicStringtoString(){// 返回帶上child的成員變量值的字符串 x和yreturnChild{yy, xx};}}publicclassMain{publicstaticvoidmain(String[]args){ChildchildnewChild(10,20);System.out.println(child.toString());}}調(diào)用父類中的方法使用super關(guān)鍵字可以在子類中顯式調(diào)用父類的方法。這在子類重寫父類的方法時(shí)特別有用以便在子類中可以調(diào)用父類的版本。代碼案例classParent{voidprint(){System.out.println(Parents print method);}}classChildextendsParent{Overridevoidprint(){super.print();// 調(diào)用父類的print方法System.out.println(Childs print method);}}publicclassMain{publicstaticvoidmain(String[]args){ChildchildnewChild();child.print();}}4.2.3 方法重寫重寫條件需要有繼承關(guān)系子類重寫父類的方法方法名必須相同參數(shù)列表必須相同修飾符范圍可以擴(kuò)大 publicprotecteddefaultprivate拋出的異常范圍可以被縮小但不能擴(kuò)大思考為什么需要重寫1.實(shí)現(xiàn)子類的特定行為父類定義的方法可能只提供通用的實(shí)現(xiàn)但子類需要根據(jù)自己的特性提供特定的實(shí)現(xiàn)。通過(guò)重寫方法子類可以覆蓋父類的方法邏輯以適應(yīng)自己的需求。classAnimal{voidsound(){System.out.println(Some generic animal sound);}}classDogextendsAnimal{Overridevoidsound(){System.out.println(Woof);// 子類提供具體實(shí)現(xiàn)}}2.支持多態(tài)性重寫方法允許在運(yùn)行時(shí)根據(jù)對(duì)象的實(shí)際類型調(diào)用相應(yīng)的方法實(shí)現(xiàn)動(dòng)態(tài)綁定。這使得代碼更靈活可以通過(guò)父類引用調(diào)用子類的特定行為。AnimalmyDognewDog();myDog.sound();// 輸出 Woof調(diào)用的是Dog的重寫方法4.3.多態(tài)4.3.1 多態(tài)定義同一方法可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式對(duì)象能執(zhí)行哪些方法主要看對(duì)象左邊的類型和右邊關(guān)系不大若方法被子類重寫則執(zhí)行子類的方法例如下面的案例是根據(jù)貓和狗叫的動(dòng)作的不同而實(shí)現(xiàn)的多態(tài)classAnimal{publicvoidsound(){System.out.println(動(dòng)物發(fā)出聲音);}}classDogextendsAnimal{Overridepublicvoidsound(){System.out.println(狗發(fā)出汪汪聲);}}classCatextendsAnimal{Overridepublicvoidsound(){System.out.println(貓發(fā)出喵喵聲);}}publicclassMain{publicstaticvoidmain(String[]args){Animalanimal1newDog();// 父類引用指向子類對(duì)象Animalanimal2newCat();// 父類引用指向子類對(duì)象animal1.sound();// 輸出狗發(fā)出汪汪聲animal2.sound();// 輸出貓發(fā)出喵喵聲}}在這個(gè)示例中Animal類是父類Dog和Cat類是它的子類。通過(guò)將父類的引用變量分別指向子類對(duì)象實(shí)現(xiàn)了多態(tài)性。在運(yùn)行時(shí)根據(jù)引用變量的實(shí)際類型來(lái)調(diào)用相應(yīng)的子類方法從而輸出不同的聲音。思考為什么使用 Animal animal1 new Dog() 而不是 Dog dog new Dog()是為了利用 多態(tài)性Polymorphism的特性。以下是具體原因和分析4.3.11.多態(tài)性的體現(xiàn)當(dāng)你使用父類引用Animal指向子類對(duì)象Dog 或 Cat時(shí)Java 在運(yùn)行時(shí)會(huì)根據(jù)對(duì)象的實(shí)際類型Dog 或 Cat調(diào)用對(duì)應(yīng)的重寫方法**sound()**。這種行為稱為 動(dòng)態(tài)綁定 或 運(yùn)行時(shí)多態(tài)。Animalanimal1newDog();animal1.sound();// 輸出 狗發(fā)出汪汪聲調(diào)用的是 Dog 類的 sound 方法這里animal1是Animal類型的引用但實(shí)際對(duì)象是 Dog因此運(yùn)行時(shí)會(huì)調(diào)用 Dog 的 sound() 方法。如果直接使用 **Dog dog new Dog()**雖然也能調(diào)用 dog.sound() 得到相同的結(jié)果但你失去了多態(tài)的靈活性因?yàn)?dog 只能引用 Dog 類型的對(duì)象無(wú)法引用其他子類如 Cat。4.3.2.2.代碼的通用性和可擴(kuò)展性使用父類引用如 Animal可以讓代碼更通用適用于處理多種子類對(duì)象。例如你可以將 Dog 和 Cat 放入一個(gè) Animal 類型的數(shù)組或集合中Animal[]animals{newDog(),newCat()};for(Animalanimal:animals){animal.sound();// 自動(dòng)調(diào)用對(duì)應(yīng)子類的 sound 方法}這允許你以統(tǒng)一的方式處理不同類型的子類對(duì)象而無(wú)需為每種子類寫單獨(dú)的代碼。如果用Dog dog new Dog()你就只能處理Dog類型的對(duì)象無(wú)法直接處理Cat或其他Animal的子類代碼的靈活性和可擴(kuò)展性會(huì)降低。4.3.2多態(tài)的注意事項(xiàng)1.多態(tài)是方法的多態(tài)屬性沒(méi)有多態(tài)2.父類和子類有聯(lián)系必要時(shí)需要類型轉(zhuǎn)換包含以下關(guān)鍵字無(wú)法被重寫的方法staticfinalprivate這就是JavaSE中三大特性的基本介紹包含用法和注意事項(xiàng)筆者編寫不易如果您有任何想法或者文章中哪里有不足的地方歡迎評(píng)論區(qū)交流