⭐️ ⭐️上篇文章-《我要進大廠》- Java基礎奪命連環18問,你能堅持到第幾問?

文章目錄
- 1、面向對象和面向過程的差別
- 2、成員變量與局部變量的差別
- 3、建立一個對象用什麼運算符?對象實體與對象引用有何不同?
- 4、對象的相等和引用相等的差別
- 5、類的構造方法的作用是什麼?
- 6、如果一個類沒有聲明構造方法,該程式能正确執行嗎?
- 7、構造方法有哪些特點?是否可被 override?
- 8、面向對象三大特征
- 封裝
- 繼承
- 多态
- 9、接口和抽象類有什麼共同點和差別?
- 10、深拷貝和淺拷貝差別了解嗎?什麼是引用拷貝?
- 總結
1、面向對象和面向過程的差別
兩者的主要差別在于解決問題的方式不同:
- 面向過程把解決問題的過程拆成一個個方法,通過一個個方法的執行解決問題。
- 面向對象會先抽象出對象,然後用對象執行方法的方式解決問題。
另外,面向對象開發的程式一般更易維護、易複用、易擴充。
相關 issue : 面向過程 :面向過程性能比面向對象高??
2、成員變量與局部變量的差別
- 文法形式:從文法形式上看,成員變量是屬于類的,而局部變量是在代碼塊或方法中定義的變量或是方法的參數;成員變量可以被
,public
,private
等修飾符所修飾,而局部變量不能被通路控制修飾符及static
所修飾;但是,成員變量和局部變量都能被static
所修飾。final
- 存儲方式:從變量在記憶體中的存儲方式來看,如果成員變量是使用
修飾的,那麼這個成員變量是屬于類的,如果沒有使用static
修飾,這個成員變量是屬于執行個體的。而對象存在于堆記憶體,局部變量則存在于棧記憶體。static
- 生存時間:從變量在記憶體中的生存時間上看,成員變量是對象的一部分,它随着對象的建立而存在,而局部變量随着方法的調用而自動生成,随着方法的調用結束而消亡。
- 預設值:從變量是否有預設值來看,成員變量如果沒有被賦初始值,則會自動以類型的預設值而指派(一種情況例外:被
修飾的成員變量也必須顯式地指派),而局部變量則不會自動指派。final
3、建立一個對象用什麼運算符?對象實體與對象引用有何不同?
new 運算符,new 建立對象執行個體(對象執行個體在堆記憶體中),對象引用指向對象執行個體(對象引用存放在棧記憶體中)。
一個對象引用可以指向 0 個或 1 個對象(一根繩子可以不系氣球,也可以系一個氣球);一個對象可以有 n 個引用指向它(可以用 n 條繩子系住一個氣球)。
4、對象的相等和引用相等的差別
- 對象的相等一般比較的是記憶體中存放的内容是否相等。
- 引用相等一般比較的是他們指向的記憶體位址是否相等。
5、類的構造方法的作用是什麼?
構造方法是一種特殊的方法,主要作用是完成對象的初始化工作。
6、如果一個類沒有聲明構造方法,該程式能正确執行嗎?
如果一個類沒有聲明構造方法,也可以執行!因為一個類即使沒有聲明構造方法也會有預設的不帶參數的構造方法。如果我們自己添加了類的構造方法(無論是否有參),Java 就不會再添加預設的無參數的構造方法了,這時候,就不能直接 new 一個對象而不傳遞參數了,是以我們一直在不知不覺地使用構造方法,這也是為什麼我們在建立對象的時候後面要加一個括号(因為要調用無參的構造方法)。如果我們重載了有參的構造方法,記得都要把無參的構造方法也寫出來(無論是否用到),因為這可以幫助我們在建立對象的時候少踩坑。
7、構造方法有哪些特點?是否可被 override?
構造方法特點如下:
- 名字與類名相同。
- 沒有傳回值,但不能用 void 聲明構造函數。
- 生成類的對象時自動執行,無需調用。
構造方法不能被 override(重寫),但是可以 overload(重載),是以你可以看到一個類中有多個構造函數的情況。
8、面向對象三大特征
封裝
封裝是指把一個對象的狀态資訊(也就是屬性)隐藏在對象内部,不允許外部對象直接通路對象的内部資訊。但是可以提供一些可以被外界通路的方法來操作屬性。就好像我們看不到挂在牆上的空調的内部的零件資訊(也就是屬性),但是可以通過遙控器(方法)來控制空調。如果屬性不想被外界通路,我們大可不必提供方法給外界通路。但是如果一個類沒有提供給外界通路的方法,那麼這個類也沒有什麼意義了。就好像如果沒有空調遙控器,那麼我們就無法操控空凋制冷,空調本身就沒有意義了(當然現在還有很多其他方法 ,這裡隻是為了舉例子)。
public class Student {
private int id;//id屬性私有化
private String name;//name屬性私有化
//擷取id的方法
public int getId() {
return id;
}
//設定id的方法
public void setId(int id) {
this.id = id;
}
//擷取name的方法
public String getName() {
return name;
}
//設定name的方法
public void setName(String name) {
this.name = name;
}
}
繼承
不同類型的對象,互相之間經常有一定數量的共同點。例如,小明同學、小紅同學、小李同學,都共享學生的特性(班級、學号等)。同時,每一個對象還定義了額外的特性使得他們與衆不同。例如小明的數學比較好,小紅的性格惹人喜愛;小李的力氣比較大。繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承,可以快速地建立新的類,可以提高代碼的重用,程式的可維護性,節省大量建立新類的時間 ,提高我們的開發效率。
關于繼承如下 3 點請記住:
- 子類擁有父類對象所有的屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法子類是無法通路,隻是擁有。
- 子類可以擁有自己屬性和方法,即子類可以對父類進行擴充。
- 子類可以用自己的方式實作父類的方法。(以後介紹)。
多态
多态,顧名思義,表示一個對象具有多種的狀态,具體表現為父類的引用指向子類的執行個體。
多态的特點:
- 對象類型和引用類型之間具有繼承(類)/實作(接口)的關系;
- 引用類型變量發出的方法調用的到底是哪個類中的方法,必須在程式運作期間才能确定;
- 多态不能調用“隻在子類存在但在父類不存在”的方法;
- 如果子類重寫了父類的方法,真正執行的是子類覆寫的方法,如果子類沒有覆寫父類的方法,執行的是父類的方法。
9、接口和抽象類有什麼共同點和差別?
共同點 :
- 都不能被執行個體化。
- 都可以包含抽象方法。
- 都可以有預設實作的方法(Java 8 可以用
關鍵在接口中定義預設方法)。default
差別 :
- 接口主要用于對類的行為進行限制,你實作了某個接口就具有了對應的行為。抽象類主要用于代碼複用,強調的是所屬關系(比如說我們抽象了一個發送短信的抽象類,)。
- 一個類隻能繼承一個類,但是可以實作多個接口。
- 接口中的成員變量隻能是
類型的,不能被修改且必須有初始值,而抽象類的成員變量預設 default,可在子類中被重新定義,也可被重新指派。public static final
10、深拷貝和淺拷貝差別了解嗎?什麼是引用拷貝?
關于深拷貝和淺拷貝差別,我這裡先給結論:
- 淺拷貝:淺拷貝會在堆上建立一個新的對象(差別于引用拷貝的一點),不過,如果原對象内部的屬性是引用類型的話,淺拷貝會直接複制内部對象的引用位址,也就是說拷貝對象和原對象共用同一個内部對象。
- 深拷貝:深拷貝會完全複制整個對象,包括這個對象所包含的内部對象。
上面的結論沒有完全了解的話也沒關系,我們來看一個具體的案例!
淺拷貝
淺拷貝的示例代碼如下,我們這裡實作了
Cloneable
接口,并重寫了
clone()
方法。
clone()
方法的實作很簡單,直接調用的是父類
Object
的
clone()
方法。
public class Address implements Cloneable{
private String name;
// 省略構造函數、Getter&Setter方法
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
public class Person implements Cloneable {
private Address address;
// 省略構造函數、Getter&Setter方法
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
測試 :
Person person1 = new Person(new Address("武漢"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());
從輸出結構就可以看出,
person1
的克隆對象和
person1
使用的仍然是同一個
Address
對象。
深拷貝
這裡我們簡單對
Person
類的
clone()
方法進行修改,連帶着要把
Person
對象内部的
Address
對象一起複制。
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
測試 :
Person person1 = new Person(new Address("武漢"));
Person person1Copy = person1.clone();
// false
System.out.println(person1.getAddress() == person1Copy.getAddress());
從輸出結構就可以看出,雖然
person1
的克隆對象和
person1
包含的
Address
對象已經是不同的了。
那什麼是引用拷貝呢? 簡單來說,引用拷貝就是兩個不同的引用指向同一個對象。
我專門畫了一張圖來描述淺拷貝、深拷貝、引用拷貝:
總結
OK,今天關于面向對象的總結就到這裡的,希望本篇文章能夠幫助到大家,同時也希望大家看後能學有所獲!!!