您好,登錄后才能下訂單哦!
這篇文章主要介紹了java有哪三大特性,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
java三大特性:1、封裝,是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式;2、繼承,從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力;3、多態(tài),一個(gè)方法可以有多種實(shí)現(xiàn)版本,即“一種定義, 多種實(shí)現(xiàn)”。
Java 三大特性,算是Java獨(dú)特的表現(xiàn),提到Java 的三大特性, 我們都會(huì)想到封裝, 繼承和多態(tài) 這是我們Java 最重要的特性。
封裝:是指隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式。
好處:
將變化隔離。
便于使用。
提高重用性。
提高安全性。
封裝原則:
將不需要對(duì)外提供的內(nèi)容都隱藏起來(lái)。
把屬性都隱藏,提供公共方法對(duì)其訪問(wèn) 。
private關(guān)鍵字:
是一個(gè)權(quán)限修飾符。
用于修飾成員(成員變量和成員函數(shù))
被私有化的成員只在本類中有效。
常用之一:
將成員變量私有化,對(duì)外提供對(duì)應(yīng)的set , get方法對(duì)其進(jìn)行訪問(wèn)。提高對(duì)數(shù)據(jù)訪問(wèn)的安全性。
舉個(gè)栗子:
我們常說(shuō)的失血模型
public class Demo { private String name; private String sex ; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
構(gòu)造代碼塊和構(gòu)造方法(Construct):
構(gòu)造方法:
用于給對(duì)象進(jìn)行初始化,是給與之對(duì)應(yīng)的對(duì)象進(jìn)行初始化,它具有針對(duì)性,函數(shù)中的一種。
特點(diǎn):
構(gòu)造函數(shù)的定義格式: 修飾符 函數(shù)名(形式參數(shù)){ 函數(shù)體; } 修飾符 函數(shù)名(){ 函數(shù)體;}
構(gòu)造方法與普通方法的區(qū)別:
(1)返回值類型的區(qū)別:
①構(gòu)造函數(shù)是沒(méi)有返回值類型的,如果加上void或者別的返回值類型,就變成一個(gè)普通的函數(shù),就需要我們手動(dòng)去調(diào)用。
②普通函數(shù)是有返回值類型的,即使函數(shù)沒(méi)有返回值,返回值類型也要寫(xiě)上void。
(2)函數(shù)名的區(qū)別:
①構(gòu)造函數(shù)的函數(shù)名必須要與類名一致。
②普通函數(shù)的函數(shù)名只要符合標(biāo)識(shí)符的命名規(guī)則即可。
(3)調(diào)用方式的區(qū)別:
①構(gòu)造函數(shù)是在創(chuàng)建對(duì)象的時(shí)候由JVM調(diào)用的。
②普通函數(shù)是由我們使用對(duì)象調(diào)用的,一個(gè)對(duì)象可以調(diào)用多次普通的函數(shù)。
(4)作用上的區(qū)別:
①構(gòu)造函數(shù)的作用用于初始化一個(gè)對(duì)象。每創(chuàng)建一個(gè)對(duì)象就會(huì)有一個(gè)初始值。
②普通函數(shù)是用于描述一類事物的公共行為的。
注意事項(xiàng):
(1)Java編譯器添加的無(wú)參的構(gòu)造方法的權(quán)限修飾符與類的權(quán)限修飾符是一致的。
(2)構(gòu)造函數(shù)是創(chuàng)建對(duì)象的時(shí)候調(diào)用的,所以就可以把屬性值傳到構(gòu)造函數(shù)中,在構(gòu)造函數(shù)中設(shè)置參數(shù)接收屬性值。
(3)JVM和Java編譯器是不同的,Java編譯器編譯生成的.class文件是給JVM看的,所以經(jīng)過(guò)編譯后的class類打開(kāi)后會(huì)是亂碼,我們可以通過(guò)反編譯來(lái)查看。
構(gòu)造代碼塊:
1.構(gòu)造代碼塊的作用與構(gòu)造函數(shù)的作用的對(duì)比:
(1)構(gòu)造代碼塊的作用:給所有對(duì)象進(jìn)行統(tǒng)一的初始化,對(duì)象一建立就運(yùn)行并且優(yōu)先于構(gòu)造函數(shù),比如所有的嬰兒出生都會(huì)哭。
(2)構(gòu)造函數(shù)的作用:給對(duì)應(yīng)的對(duì)象(new )進(jìn)行初始化。
構(gòu)造代碼塊的格式: { 構(gòu)造代碼塊; } 注意:構(gòu)造代碼塊的大括號(hào)必須位于成員的位置上。
代碼塊的類別:
(1)構(gòu)造代碼塊:在工作中經(jīng)常會(huì)用到。
(2)局部代碼塊:大括號(hào)位于方法之內(nèi),基本上寫(xiě)不寫(xiě)沒(méi)什么區(qū)別,現(xiàn)實(shí)開(kāi)發(fā)中也很少會(huì)用到。它的作用是縮短局部變量的生命周期,節(jié)省一點(diǎn)點(diǎn)內(nèi)存。
(3)靜態(tài)代碼塊:使用static修飾的代碼塊。
注意的事項(xiàng):
(1)Java編譯器在編譯一個(gè)Java源文件的時(shí)候,會(huì)把成員變量的聲明語(yǔ)句提前至一個(gè)類的最前端。
(2)成員變量的初始化工作其實(shí)都是在構(gòu)造函數(shù)中執(zhí)行的。
(3)一旦經(jīng)過(guò)Java編譯器編譯后,那么構(gòu)造代碼塊的代碼就會(huì)被移動(dòng)到構(gòu)造函數(shù)中執(zhí)行,構(gòu)造代碼塊的代碼是在構(gòu)造函數(shù)之前執(zhí)行的,構(gòu)造函數(shù)中的代碼是最后執(zhí)行的。
(4)成員變量的顯示初始化與構(gòu)造代碼塊的代碼是按照當(dāng)前代碼的順序執(zhí)行的。
繼承是面向?qū)ο笞铒@著的一個(gè)特性。 繼承是從已有的類中派生出新的類, 新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
在JAVA中, 被繼承的類叫父類(parent class)或超類(superclass), 繼承父類的類叫子類(subclass)或派生類(derivedclass)。 因此, 子類是父類的一個(gè)專門(mén)用途的版本, 它繼承了父類中定義的所有實(shí)例變量和方法, 并且增加了獨(dú)特的元素 。
繼承的結(jié)構(gòu):
繼承的使用 :
關(guān)鍵字:extends。
使用繼承 – 編寫(xiě)父類 – 編寫(xiě)子類, 繼承父類 class Animal { //公共的屬性和方法 } class Chicken extends Animal{ //子類特有的屬性和方法 } class Duck extends Animal { }
基本語(yǔ)法:
class Chicken extends Animal{ }
上述代碼表示Chicken類繼承Animal類,使用extends關(guān)鍵詞將Animal類(父類/超類)和Chicken類(子類)連接接起來(lái);
在繼承關(guān)系下,Chicken類將擁有Animal類所有的非私有的方法和屬性,Chicken類還可以擁有自己獨(dú)有的方法和屬性;
聲明Animal類,實(shí)例化Chicken類時(shí), Chicken類會(huì)自動(dòng)向上轉(zhuǎn)型為Animal類;
舉個(gè)栗子:
//創(chuàng)建動(dòng)物類 public class Animal { private String type; private String skin; private int legCount; public void eat(){ System.out.println("動(dòng)物正在吃東西"); } public void breath(){ System.out.println("動(dòng)物正在呼吸"); } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getSkin() { return skin; } public void setSkin(String skin) { this.skin = skin; } public int getLegCount() { return legCount; } public void setLegCount(int legCount) { this.legCount = legCount; } } //雞類 public class Chicken extends Animal { public void eat(){ System.out.println(“雞正在吃東西”); } public void run(){ System.out.println(“雞在跑"); } } //鴨類 public class Duck extends Animal { public void eat(){ System.out.println(“鴨正在吃東西”); } public void run(){ System.out.println(“鴨在跑"); } } //測(cè)試類 public class Test { public static void main(String[] args){ Chicken chicken=new Chicken (); chicken.eat(); chicken.setType(“雞”); chicken.setSkin(“金色"); chicken.setLegCount(2); System.out.println("動(dòng)物品種是: "+chicken.getType()+", 膚色是: "+chicken.getSkin()+", 腿數(shù)"+t.getLegCount()); chicken.run(); Duck duck =new Duck (); duck.eat(); duck.fight(); } }
繼承執(zhí)行的順序:
java中, new一個(gè)類的對(duì)象, 類里面的靜態(tài)代碼塊、 非靜態(tài)代碼塊、無(wú)參構(gòu)造方法、 有參構(gòu)造方法、 類的一般方法等部分, 它們的執(zhí)行順序相對(duì)比較簡(jiǎn)單, 例如:
public class FatherTest{ private String name; public FatherTest(){ System.out.println(“--父類的無(wú)參數(shù)構(gòu)造方法--”); } public FatherTest(String name){ System.out.println(“--父類的有參數(shù)構(gòu)造方法--”+this.name); } static{ System.out.println(“--父類的靜態(tài)代碼塊--”); } { System.out.println(“--父類的非靜態(tài)代碼塊--”); } public void speak(){ System.out.println(“--父類的方法--”); } } public static void main(String[] args){ System.out.println(“--父類主程序--”); FatherTest father = new FatherTest(“父親的名字”); father.speak(); } 執(zhí)行結(jié)果為: --父類的靜態(tài)代碼塊-- --父類主程序-- --父類的非靜態(tài)代碼塊-- --父類的有參構(gòu)造函數(shù)--父親的名字 --父類的方法-- 執(zhí)行順序總結(jié): 靜態(tài)代碼塊—>主程序—>非靜態(tài)代碼塊—>構(gòu)造函數(shù)—>一般方法
加入子類繼承后的執(zhí)行順序, 例如 :
public class SonTest extends FatherTest{ private String name; static{ System.out.println("--子類的靜態(tài)代碼塊--"); } { System.out.println("--子類的非靜態(tài)代碼塊--"); } public SonTest(){ System.out.println("--子類的無(wú)參構(gòu)造方法--"); } public SonTest(String name){ System.out.println("--子類的有參構(gòu)造方法--"+name); } @Override public void speak() { System.out.println("--子類重寫(xiě)了父類的方法--"); } } public static void main(String[] args) { System.out.println("--子類主程序--"); FatherTest father=new FatherTest("父親的名字"); father.speak(); SonTest son=new SonTest("兒子的名字"); son.speak(); } 執(zhí)行結(jié)果為: --父類的靜態(tài)代碼塊-- --子類的靜態(tài)代碼塊-- --子類主程序-- --父類的非靜態(tài)代碼塊-- --父類的有參構(gòu)造函數(shù)--父親的名字 --父類的方法-- --父類的非靜態(tài)代碼塊-- --父類的無(wú)參構(gòu)造函數(shù)-- --子類的非靜態(tài)代碼塊-- --子類的有參構(gòu)造方法--兒子的名字 --子類重寫(xiě)了父類的方法--
方法的重寫(xiě):
方法重寫(xiě)是在繼承關(guān)系下, 子類擁有與父類方法名、 參數(shù)(個(gè)數(shù)、順序、 類型)、 返回值類型完全相同, 訪問(wèn)修飾符只能擴(kuò)大或相等, 不可縮小, 但實(shí)現(xiàn)過(guò)程與父類不同的方法。 方法重寫(xiě)也是多態(tài)的一種變現(xiàn)形式。
重寫(xiě)必須滿足以下幾個(gè)條件:
在子類中可以根據(jù)需要對(duì)從基類中繼承來(lái)的方法進(jìn)行重寫(xiě);
重寫(xiě)的方法和被重寫(xiě)的方法必須具有相同方法名稱、 參數(shù)列表和返回類型;
重寫(xiě)方法不能使用比被重寫(xiě)的方法更嚴(yán)格的訪問(wèn)權(quán)限 ;
舉個(gè)栗子:
//雞類 class Chicken extends Animal { public void eat(){ System.out.println(“雞正在吃東西”);//對(duì)父類Animal中的eat方法進(jìn) 行重寫(xiě) } public void run(){ System.out.println(“雞在跑");//可以添加新的方法 } }
Super關(guān)鍵字:
super關(guān)鍵字是一個(gè)特殊的變量, 它提供了對(duì)父類的方法。 可以用super主動(dòng)調(diào)用父類的構(gòu)造方法、 訪問(wèn)父類中的成員。
super調(diào)用父類的構(gòu)造方法:
public class Duck extends Animal { public Duck(String name){ super(name);//主動(dòng)調(diào)用父類的構(gòu)造方法 } }
super訪問(wèn)父類的成員:
在子類方法中使用super訪問(wèn)父類中隱藏的成員, 訪問(wèn)形式是:
super.變量;
super.方法名(參數(shù));
public class Duck extends Animal { @Override public void eat() { System.out.println(); } public void quack(){ System.out.println(super.name);//使用super調(diào)用父類的屬性 eat(); super.eat();//使用super調(diào)用父類的eat()方法 } public static void main(String[] args) { new Duck().quack();//創(chuàng)建Duck類對(duì)象并調(diào)用quack方法 } }
final 關(guān)鍵字:
“final”關(guān)鍵字用來(lái)修飾類、 方法和變量, 其含義“不可改變的、 最終的”。
修飾類 聲明為final的類不能派生子類,即此類不能被繼承; public final class Person{ } 修飾變量 表示它為一個(gè)常量,變量一旦初始化,將不能改變; final int COUNT = 5; 修飾方法 表示向編譯器表明子類不能重寫(xiě)此方法; public final void eat(){ }
在面向?qū)ο笳Z(yǔ)言中, 多態(tài)性是指一個(gè)方法可以有多種實(shí)現(xiàn)版本,即“一種定義, 多種實(shí)現(xiàn)”。 利用多態(tài)可以設(shè)計(jì)和實(shí)現(xiàn)可擴(kuò)展的系統(tǒng), 只要新類也在繼承層次中。 新的類對(duì)程序的通用部分只需進(jìn)行很少的修改, 或不做修改。 類的多態(tài)性表現(xiàn)為方法的多態(tài)性,方法的多態(tài)性主要有方法的重載和方法的覆蓋。
重載:
方法重載(overload)是指在同一個(gè)類中的多個(gè)方法可以同名但參數(shù)列表必須不同。 重載表現(xiàn)為同一個(gè)類中方法的多態(tài)性。
class Chicken { public void eat(){ System.out.println(“雞正在吃東西”); } public void eat(String food){ System.out.println(“雞在吃"+food);//重載eat方法 } }
方法重寫(xiě)(override)是指子類沖定義了父類中同名的方法。 重寫(xiě)表現(xiàn)為父子與子類之間方法的多態(tài)性。
//雞類 class Chicken extends Animal { public void eat(){ System.out.println(“雞正在吃東西”);//對(duì)父類Animal中的eat方法進(jìn) 行重寫(xiě) } }
對(duì)象類型轉(zhuǎn)換:
基本類型的數(shù)據(jù)可以轉(zhuǎn)換類型, 當(dāng)轉(zhuǎn)換類型較高時(shí)可以自動(dòng)轉(zhuǎn)換, 當(dāng)轉(zhuǎn)換類型較低時(shí)需要強(qiáng)制轉(zhuǎn)換。 對(duì)象類型也允許轉(zhuǎn)換, 這個(gè)轉(zhuǎn)換只限于java類層次結(jié)構(gòu)圖上的一根枝干上, 即父類和子類之間。 枝干上離Object較近的為上, 相反較遠(yuǎn)的為下, 由此對(duì)象的類型轉(zhuǎn)換分為“向上轉(zhuǎn)型”和“向下轉(zhuǎn)型”兩種。
public class Duck extends Animal { @Override public void eat() { System.out.println(); } public void quack(){ System.out.println("嘎嘎嘎"); } public static void main(String[] args) { Animal a1 = new Animal();//實(shí)例化過(guò)程 Animal a2 = new Duck();//向上轉(zhuǎn)型 a1.eat(); a2.eat(); //a2.quack();//去除注釋會(huì)怎樣? } }
向下轉(zhuǎn)型:只能針對(duì)指向子類對(duì)象的基類對(duì)象引用進(jìn)行 。
public class Duck extends Animal { @Override public void eat() { System.out.println(); } public void quack(){ System.out.println("嘎嘎嘎"); } public static void main(String[] args) { Animal a = new Duck();//向上轉(zhuǎn)型 Duck b = (Duck) a;//向下轉(zhuǎn)型 a.eat(); b.eat(); b.quack(); } }
Instanceof 關(guān)鍵字 :
instanceof關(guān)鍵字是用來(lái)判斷其左邊對(duì)象是否為其右邊的實(shí)例, 返回boolean類型的數(shù)據(jù) .
boolean result = Object instanceof class
同時(shí), 也可以用來(lái)判斷繼承中的子類的實(shí)例是否為父類的實(shí)現(xiàn)。
..... public static void main(String[] args) { Animal a = new Duck();//向上轉(zhuǎn)型 if(a instanceof Duck){ ((Duck) a).quack(); } } .....
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享java有哪三大特性內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。