做百度手機網(wǎng)站優(yōu)化成都seo網(wǎng)絡優(yōu)化公司
目錄
- 1.Java 的優(yōu)勢是什么?
- 2.什么是 Java 的多態(tài)特性?
- 3.Java 中的參數(shù)傳遞是按值還是按引用?
- 4.為什么 Java 不支持多重繼承?
- 5.什么是 Java 中的不可變類?
- 總結
題目
來自面試鴨刷題神器
1.Java 的優(yōu)勢是什么?
Java 的跨平臺性、垃圾回收機制以及其強大的生態(tài)是其成為業(yè)界廣泛使用的語言的關鍵因素。
-
跨平臺性(Write Once, Run Anywhere,WORA):
Java 的這一特性得益于 JVM(Java 虛擬機),它作為運行 Java 字節(jié)碼的中間層,允許 Java 程序在任何安裝了 JVM 的平臺上運行。這種平臺無關性極大地簡化了開發(fā)和部署過程,減少了為不同操作系統(tǒng)編寫和維護不同版本代碼的需要。 -
垃圾回收機制(Garbage Collection):
Java 的垃圾回收(GC)機制自動管理內(nèi)存,這意味著開發(fā)者無需手動分配和釋放內(nèi)存,從而減少了內(nèi)存泄漏和其他內(nèi)存管理錯誤的風險。雖然這可能會導致一些運行時的性能開銷,尤其是在 GC 進行時,但對于大多數(shù)應用程序而言,這種開銷被自動內(nèi)存管理帶來的開發(fā)效率提升和減少錯誤的便利所抵消。 -
豐富的生態(tài)系統(tǒng):
Java 擁有一個龐大且活躍的開發(fā)者社區(qū),這導致了大量第三方庫、框架和工具的產(chǎn)生,覆蓋了從企業(yè)級應用開發(fā)到移動應用開發(fā)的廣泛領域。Spring、Hibernate、Struts 等框架極大地簡化了企業(yè)級應用的開發(fā),而 Android 開發(fā)主要使用 Java,進一步擴大了 Java 的應用范圍。此外,豐富的文檔和在線資源使得學習和解決問題更加容易。
綜上所述,Java 的跨平臺性、自動垃圾回收和強大的生態(tài)系統(tǒng),使其成為開發(fā)高效、可移植和可維護軟件的理想選擇,特別是在企業(yè)級應用、Web 開發(fā)和移動應用開發(fā)等領域。這些特性共同促進了 Java 的廣泛應用和持續(xù)的流行。
2.什么是 Java 的多態(tài)特性?
多態(tài)是面向對象編程中的一個核心概念,它允許子類對象被當作其父類類型來使用,從而提高了代碼的靈活性和擴展性。多態(tài)在 Java 中主要通過繼承和接口實現(xiàn),它允許我們編寫更加通用和可重用的代碼。
在你提到的例子中,Person
是一個父類(或接口),Student
是 Person
的一個子類。Person
類中定義了一個 work()
方法,而 Student
類重寫了這個方法,使其具有特定的實現(xiàn),例如 “上學”。當我們聲明 Person
類型的變量 person
并將其初始化為 Student
類的對象時:
Person person = new Student();
盡管 person
的類型是 Person
,但它實際上引用的是 Student
對象。當我們調(diào)用 person.work()
方法時,實際上調(diào)用的是 Student
類中的 work()
方法,即 “上學”。這就是多態(tài)的體現(xiàn),即 Person
類型的引用可以調(diào)用 Student
類中特定的實現(xiàn)。
多態(tài)的另一個常見應用場景是方法重載(overloading)和方法重寫(overriding)。方法重載是在同一類中使用相同方法名但參數(shù)列表不同的多個方法,而方法重寫是在子類中提供與父類方法相同簽名但不同實現(xiàn)的方法。
多態(tài)的好處在于:
- 代碼復用性:子類可以繼承父類的屬性和方法,同時可以重寫父類的方法以提供特定的實現(xiàn)。
- 靈活性:使用父類類型的引用可以調(diào)用任何子類的方法,這使得我們可以編寫更加通用的代碼,而不需要關心具體實現(xiàn)。
- 擴展性:如果需要添加新的子類,只需實現(xiàn)父類或接口的方法即可,無需修改使用這些類的現(xiàn)有代碼。
綜上所述,多態(tài)是 Java 面向對象編程中一個非常強大的特性,它允許我們編寫更加靈活、可擴展和可重用的代碼。
3.Java 中的參數(shù)傳遞是按值還是按引用?
jvm內(nèi)存有劃分為棧和堆,局部變量和方法參數(shù)是在棧上分配的,
參數(shù)傳遞確實遵循“按值傳遞”的原則,這一點對于基本數(shù)據(jù)類型和引用類型都適用。但理解這一點的關鍵在于認識到“值”的含義在兩種類型中有所不同。
-
基本數(shù)據(jù)類型:當我們將基本數(shù)據(jù)類型的變量作為參數(shù)傳遞給方法時,實際上傳遞的是該變量的值的副本。這意味著在方法中對參數(shù)的修改不會影響到原始變量的值。這是因為基本數(shù)據(jù)類型(如
int
、double
等)直接存儲在棧中,而方法調(diào)用時傳遞的是這些值的副本。 -
引用類型:對于引用類型的變量(如對象的引用),情況略有不同。雖然 Java 中的參數(shù)傳遞仍然是按值傳遞,但這里“值”指的是對象在堆中的引用,而不是對象本身。因此,當我們傳遞一個引用類型的參數(shù)時,實際上傳遞的是指向堆中對象的引用的副本。這意味著如果在方法中修改了對象的屬性(而不是修改引用本身),這些改變會反映在原始對象上,因為方法中和原始代碼中使用的是指向同一堆中對象的引用。
例如,考慮以下代碼:
class Point {int x, y;Point(int x, int y) {this.x = x;this.y = y;}
}public class Test {public static void main(String[] args) {Point p1 = new Point(10, 20);changePoint(p1);System.out.println(p1.x + ", " + p1.y); // 輸出:100, 200}public static void changePoint(Point p) {p.x = 100;p.y = 200;}
}
在這個例子中,changePoint
方法接收一個 Point
類型的參數(shù) p
。雖然傳遞的是 p1
引用的副本,但是對 p
對象屬性的修改(p.x
和 p.y
)會反映在原始的 p1
對象上,因為 p
和 p1
都指向堆中同一 Point
對象。
總結來說,Java 中無論是基本類型還是引用類型,參數(shù)傳遞都是按值傳遞。但對于引用類型,值是指向堆中對象的引用,而不是對象本身。因此,方法內(nèi)部對對象的修改會影響原始對象,但對引用的重新賦值(如 p = new Point(0, 0);
)則不會影響到方法外部的原始引用。
4.為什么 Java 不支持多重繼承?
Java 語言設計者決定不支持多重繼承(multiple inheritance)主要是為了避免一些復雜性和潛在的問題。下面是一些主要原因:
-
鉆石問題:這是多重繼承中最著名的沖突之一。當一個類從兩個或多個父類繼承,并且這些父類又有一個共同的父類時,就會出現(xiàn)這個問題。這會導致類的實例不知道使用哪個版本的方法或屬性,從而產(chǎn)生歧義。
-
命名沖突:如果一個類從兩個不同的類繼承了同名的方法或變量,那么該類將無法確定使用哪一個定義。
-
復雜的依賴關系:多重繼承可能導致復雜的類層次結構和難以追蹤的依賴關系,這增加了理解和維護代碼的難度。
-
設計哲學:Java 的設計者們希望保持語言簡單、一致并且易于學習。多重繼承可能會使語言變得過于復雜。
為了應對這些問題并仍然提供類似多重繼承的功能,Java 引入了接口(interface)。接口可以包含方法聲明但不能包含方法實現(xiàn)(在 Java 8 之后,接口可以包含默認方法和靜態(tài)方法),類可以實現(xiàn)多個接口來獲得多重繼承的一些好處,同時避免上述提到的問題。
此外,Java 還通過使用內(nèi)部類、匿名類和 lambda 表達式等特性提供了其他方式來實現(xiàn)代碼復用和模塊化。這些機制有助于解決單一繼承帶來的限制,同時保持語言的簡潔性。
5.什么是 Java 中的不可變類?
在 Java 中,不可變類(Immutable Class)是指一旦創(chuàng)建了一個類的實例(對象),其狀態(tài)(成員變量的值)就不能再被改變的類。不可變類的主要特點包括:
-
成員變量不可更改:所有的成員變量都應該聲明為
final
,以確保它們只能在構造函數(shù)中被初始化一次,并且之后不能被修改。 -
沒有 setter 方法:不可變類通常不提供任何方法來修改其成員變量的值。
-
只讀訪問:提供 getter 方法來獲取成員變量的值,但如果是可變對象,則返回該對象的不可變副本或防御性副本,以防止外部修改。
-
線程安全性:由于不可變對象的狀態(tài)不會改變,它們自然具備線程安全性。多個線程可以共享同一個不可變對象實例,而不用擔心數(shù)據(jù)競爭或同步問題。
-
哈希碼一致性:不可變對象的
hashCode()
和equals(Object obj)
方法實現(xiàn)必須保證即使在多次調(diào)用時也始終返回相同的值。這是因為不可變對象的值不會改變,所以它們的哈希碼也不應該改變。
Java 中常見的不可變類包括:
String
:字符串一旦創(chuàng)建后,其內(nèi)容就不可更改。- 包裝類如
Integer
、Long
、Double
等:這些類封裝了基本數(shù)據(jù)類型,并且一旦創(chuàng)建,其值就不能改變。 BigInteger
和BigDecimal
:這兩個類處理大整數(shù)和高精度數(shù)值,也是不可變的。
創(chuàng)建不可變類的一般步驟如下:
- 將所有字段聲明為
private
和final
。 - 提供一個構造函數(shù),在其中初始化這些
final
字段。 - 不提供任何可以修改這些字段的方法(即不提供 setter 方法)。
- 如果類中包含可變對象,那么提供這些對象的不可變視圖或副本。
- 實現(xiàn)
equals
和hashCode
方法,確保對象的相等性和哈希碼的一致性。
不可變類在并發(fā)編程中非常有用,因為它們不需要額外的同步措施就可以在多線程環(huán)境中安全地共享。
總結
面試題目比較友好,可以去看看。