Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
693
2022-05-29
文章目錄
@[toc] Java 面向?qū)ο笾R(shí)結(jié)構(gòu)
面向?qū)ο蠛兔嫦蜻^(guò)程
Java 有沒(méi)有 goto?
關(guān)鍵字 switch
抽象類(lèi)(abstract class)和接口(interface)
Java 創(chuàng)建對(duì)象的方式有哪些?
面向?qū)ο蟮奶卣饔心男?/p>
override(重寫(xiě),覆蓋)和 overload(重載,過(guò)載)
什么是不可變對(duì)象?
Java 面向?qū)ο蟮膬?nèi)容很多,而且不像 jdk 那樣成體系,可以粗略地分為兩部分:
Java 語(yǔ)法及關(guān)鍵字,屬于形而下的語(yǔ)言規(guī)范,如接口與類(lèi)、內(nèi)部類(lèi),final/finally/finalize,throw/throws,域訪問(wèn)符權(quán)限等;
Java 面向?qū)ο笏枷爰绑w系,屬于形而上的設(shè)計(jì)思想。
面向?qū)ο蠛兔嫦蜻^(guò)程
就是先分解過(guò)程步驟:
Java 有沒(méi)有 goto?
參-:
goto 是 Java 中的保留字,在目前版本的 Java 中沒(méi)有使用。
Java 中跳出多重循環(huán)有三種方式:
1、break + 標(biāo)簽。在最外層循環(huán)前加一個(gè)標(biāo)簽如 label,然后在最里層的循環(huán)使用用 break label。
public static void main(String[] args) { label: //標(biāo)記 for (int i = 0 ; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i = " + i + ", j = " + j); if(j == 5) { //滿中一定條件跳到某個(gè)標(biāo)記 break label; } } } }
1
2
3
4
5
6
7
8
9
10
11
2、通過(guò)捕獲異常。
public static void main(String[] args) { try { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i = " + i + ", j = " + j); if (j == 5) {// 滿足一定條件拋異常 throw new RuntimeException("test exception for j = 5"); } } } } catch (RuntimeException e) { //循環(huán)外層捕獲異常 e.printStackTrace(); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3、通過(guò)標(biāo)置變量。
public static void main(String[] args) { boolean flag = false; //初始化標(biāo)置變量 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i = " + i + ", j = " + j); if (j == 5) { //滿足一定條件進(jìn)行設(shè)置標(biāo)置變量 flag = true; } if (flag) { //內(nèi)層循環(huán)判斷標(biāo)置變量 break; } } if (flag) {//外層循環(huán)判斷標(biāo)置變量 break; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
點(diǎn)評(píng):
該問(wèn)題屬于 Java 語(yǔ)法中的關(guān)鍵字考察。
James Gosling(Java 之父)編寫(xiě)的《The Java Programming Language》一書(shū)的附錄中給出了一個(gè) Java 關(guān)鍵字列表,
其中有 goto 和 const,但是這兩個(gè)是目前無(wú)法使用的關(guān)鍵字,
因此有些地方將其稱(chēng)之為保留字,其實(shí)保留字這個(gè)詞應(yīng)該有更廣泛的意義,因?yàn)槭煜?C 語(yǔ)言的程序員都知道,在系統(tǒng)類(lèi)庫(kù)中使用過(guò)的有特殊意義的單詞或單詞的組合都被視為保留字。
Java 中支持帶標(biāo)簽的 break 和 continue 語(yǔ)句,作用有點(diǎn)類(lèi)似于 C 和 C++ 中的 goto 語(yǔ)句,但是正因?yàn)槿缤苊馐褂?goto 一樣,應(yīng)該避免使用帶標(biāo)簽的 break 和 continue,因?yàn)樗粫?huì)讓你的程序變得更優(yōu)雅,很多時(shí)候甚至有相反的作用。
所以可以在答案的最后加上一些自己的看法,比如說(shuō):goto 會(huì)破壞程序的可讀性,java 中沒(méi)有大范圍使用 goto 反而是好事,而且還應(yīng)該避免使用帶標(biāo)簽的 break 語(yǔ)句。
關(guān)鍵字 switch
switch可作用于char byte short int
switch可作用于char byte short int對(duì)應(yīng)的包裝類(lèi)
switch不可作用于long double float boolean,包括他們的包裝類(lèi)
switch中可以是字符串類(lèi)型,String(jdk1.7之后才可以作用在string上)
switch中可以是枚舉類(lèi)型
抽象類(lèi)(abstract class)和接口(interface)
參-:
相同點(diǎn):
(1)不能直接實(shí)例化。如果要實(shí)例化,抽象類(lèi)變量必須實(shí)現(xiàn)所有抽象方法,接口變量必須實(shí)現(xiàn)所有接口未實(shí)現(xiàn)的方法。
(2)都可以有實(shí)現(xiàn)方法(Java8 以前的接口不能有實(shí)現(xiàn)方法)。
(3)都可以不需要實(shí)現(xiàn)類(lèi)或者繼承者去實(shí)現(xiàn)所有方法(Java8 以前的接口,Java8 及以后的接口中可以包括默認(rèn)方法,不需要實(shí)現(xiàn)者實(shí)現(xiàn))。
不同點(diǎn):
Java 創(chuàng)建對(duì)象的方式有哪些?
(1)使用 new 關(guān)鍵字;
(2)反射,使用 java.lang.Class 類(lèi)的 newInstance 方法。
這種方式會(huì)調(diào)用無(wú)參的構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象,有兩種實(shí)現(xiàn)方式。
//方式一,使用全路徑包名 User user = (User)Class.forName("com.imooc.interview.demo.User").newInstance(); //方法二,使用class類(lèi) User user = User.class.newInstance();
1
2
3
4
(3)反射,使用 java.lang.reflect.Constructor 類(lèi)的 newInstance 方法。
Constructor
1
2
(4)使用 clone 方法。
public class User implements Cloneable { /** 構(gòu)造方法 */ public User(Integer age) { this.age = age; } public Integer getAge() { return age; } private Integer age; // 重寫(xiě)(Overriding)Object的clone方法 @Override protected User clone() throws CloneNotSupportedException { return (User) super.clone(); } public static void main(String[] args) throws Exception { User person = new User(new Integer(200)); User clone = person.clone(); System.out.println("person == clone, result = " + (person == clone)); // false,拷貝都是生成新對(duì)象 System.out.println("person.age == clone.age, result = " + (person.getAge() == clone.getAge())); // true,淺拷貝的成員變量引用仍然指向原對(duì)象的變量引用 } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
首先需要明確兩個(gè)概念:淺拷貝和深拷貝。
淺拷貝:被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,對(duì)拷貝后對(duì)象的引用仍然指向原來(lái)的對(duì)象。
深拷貝:不僅要復(fù)制對(duì)象的所有非引用成員變量值,還要為引用類(lèi)型的成員變量創(chuàng)建新的實(shí)例,并且初始化為形式參數(shù)實(shí)例值。
其他需要注意的是,clone () 是 Object 的 native 方法,但如果要標(biāo)注某個(gè)類(lèi)是可以調(diào)用 clone (),該類(lèi)需要實(shí)現(xiàn)空接口 Cloneable。
(5)使用反序列化。【深拷貝】
為了序列化 / 反序列化一個(gè)對(duì)象,需要該類(lèi)實(shí)現(xiàn)空接口 Serializable。
序列化時(shí)首先創(chuàng)建一個(gè)輸出流對(duì)象 oos, 使用 oos 的 writeObject () 方法將 p 對(duì)象寫(xiě)入 oos 對(duì)象中去。使用反序列化創(chuàng)建對(duì)象時(shí),首先創(chuàng)建一個(gè)輸入流對(duì)象 ois,使用輸入流對(duì)象 ois 的 readObject () 方法將序列化存入的對(duì)象讀出,重新創(chuàng)建一個(gè)對(duì)象。
java 中繼承類(lèi)用 extends,繼承接口用關(guān)鍵字 implements。都是繼承,為什么要用兩個(gè)關(guān)鍵字呢?
面向?qū)ο蟮奶卣饔心男?/p>
1.抽象:
抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問(wèn)題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。抽象包括兩個(gè)方面,一是過(guò)程抽象,二是數(shù)據(jù)抽象。
2.繼承:
繼承是一種聯(lián)結(jié)類(lèi)的層次模型,并且允許和鼓勵(lì)類(lèi)的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類(lèi)可以從現(xiàn)有的類(lèi)中派生,這個(gè)過(guò)程稱(chēng)為類(lèi)繼承。新類(lèi)繼承了原始類(lèi)的特性,新類(lèi)稱(chēng)為原始類(lèi)的派生類(lèi)(子類(lèi)),而原始類(lèi)稱(chēng)為新類(lèi)的基類(lèi)(父類(lèi))。派生類(lèi)可以從它的基類(lèi)那里繼承方法和實(shí)例變量,并且類(lèi)可以修改或增加新的方法使之更適合特殊的需要。
3.封裝:
封裝是把過(guò)程和數(shù)據(jù)包圍起來(lái),對(duì)數(shù)據(jù)的訪問(wèn)只能通過(guò)已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象,這些對(duì)象通過(guò)一個(gè)受保護(hù)的接口訪問(wèn)其他對(duì)象。
4.多態(tài)性:
多態(tài)性是指允許不同類(lèi)的對(duì)象對(duì)同一消息作出響應(yīng)。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問(wèn)題。
override(重寫(xiě),覆蓋)和 overload(重載,過(guò)載)
重寫(xiě)(Override)也稱(chēng)覆蓋,它是父類(lèi)與子類(lèi)之間多態(tài)性的一種表現(xiàn),而重載(Overload)是一個(gè)類(lèi)中多態(tài)性的一種表現(xiàn)。
什么是不可變對(duì)象?
參-:
不可變對(duì)象指對(duì)象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如 String、Integer及其它包裝類(lèi)。
Java 面向?qū)ο缶幊?/p>
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。