Java面試基礎:面向對象(2)

1. 接口里可以定義哪些方法

抽象方法:抽象方法是接口的核心部分,所有實現接口的類都必須實現這些方法。抽象方法默認是 publicabstract 修飾,這些修飾符可以省略。

public interface Animal {void Sound();
}

默認方法:默認方法是在Java8中引入的,允許接口提供具體的實現。實現類可以重寫默認方法。

public interface Animal {void Sound();default void eat() {System.out.println("Eating...")}
}

靜態方法:靜態方法也是中Java8中引入的,屬于接口本身,可以通過接口名來直接調用,不需要實現類的對象。

public interface Animal {void Sound();static void staticMethod() {System.out.println("Static method...")}
}

私有方法:私有方法是在Java9中引入的,用于在接口中為默認方法或其他私有方法提供輔助功能。這些方法不能被實現類訪問,而是只能在接口內部使用。

public interface Animal {void Sound();default void eat() {System.out.println("Eating...")}private void sleep() {System.out.println("Sleeping...")}
}

2. 接口可以包含構造函數嗎

在接口中,不可以有構造方法,在接口里寫入構造方法時,編譯器會提示:Interface cannot have constructors,因為接口不會有自己的實例,所以不需要有構造函數。

主要原因是構造函數就是初始化 class 的屬性或者方法,在 new 的瞬間自動調用,接口都不能 new 實例化,所以就無法調用,因此沒有構造函數。

3. 解釋Java中的靜態變量和靜態方法

在Java中靜態變量和靜態方法是與類本身關聯的,而不是與類的實例 (對象) 關聯。

它們在內存中只存在一份,可以被類的所有實例共享。

靜態變量

靜態變量 (也稱為類變量) 是在類中使用 static 關鍵字聲明的變量。它們屬于類而不是任何具體的對象。主要的特點有 :

  • 共享性: 所有該類的實例共享同一個靜態變量。如果一個實例修改了靜態變量的值,其他實例也會看到這個更改。
  • 初始化: 靜態變量在類被加載時初始化,只會對其進行一次分配內存。
  • 訪問方式: 靜態變量可以直接通過類名訪問,也可以通過實例訪問,但推薦使用類名。
public class Myclass {// 靜態變量static int staval = 0;public Myclass() {// 每創建一個對象,靜態變量自增staval++;}public static void printStaVal() {System.out.println("Static Val:" + staval);}
}// 示例:
MyClass a1 = new MyClass();
MyClass a2 = new MyClass();
MyClass.printStaVal(); // 輸出 Static Val: 2

靜態方法

靜態方法是在類中使用 static 關鍵字聲明的方法。類似于靜態變量,靜態方法也屬于類,而不是任何具體的對象。主要的特點:

  • 無實例依賴: 靜態方法可以在沒有創建類實例的情況下調用。對于靜態方法來說,不能直接訪問非靜態的成員變量或方法,因為靜態方法沒有上下文的實例。
  • 訪問靜態成員: 靜態方法可以直接調用其他靜態變量和靜態方法,但不能直接訪問非靜態成員。
  • 多態性: 靜態方法不支持重寫 (Override),但可以被隱藏 (Hide)。
public class Myclass {// 靜態變量static int staval = 0;// 靜態方法public static void stavalIncrement() {staval++;}// 靜態方法public static void printStaVal() {System.out.println("Static Val:" + staval);}
}// 示例:
MyClass.stavalIncrement();
MyClass.printStaVal(); // 輸出 Static Val: 1

使用場景

  • 靜態變量: 常用于需要在所有對象間共享的數據,如計數器、常量等。
  • 靜態方法: 常用于助手方法 (utility methods)、獲取類級別的信息或者是沒有依賴于實例的數據處理。

4. 非靜態內部類和靜態內部類的區別

  • 非靜態內部類依賴于外部類的實例,而靜態內部類不依賴于外部類的實例。
  • 非靜態內部類可以訪問外部類的實例變量和方法,而靜態內部類只能訪問外部類的靜態成員。
  • 非靜態內部類不能定義靜態成員,而靜態內部類可以定義靜態成員。
  • 非靜態內部類在外部類實例化后才能實例化,而靜態內部類可以獨立實例化。
  • 非靜態內部類可以訪問外部類的私有成員,而靜態內部類不能直接訪問外部類的私有成員,需要通過實例化外部類來訪問。

5. 非靜態內部類可以直接訪問外部方法,編譯器是怎么做到的

非靜態內部類可以直接訪問外部方法是因為編譯器在生成字節碼時會為非靜態內部類維護一個指向外部類實例的引用
這個引用使得非靜態內部類能夠訪問外部類的實例變量和方法。編譯器會在生成非靜態內部類的構造方法時,將外部類實例作為參數傳入,并在內部類的實例化過程中建立外部類實例與內部類實例之間的聯系從而實現直接訪問外部方法的功能。

6. Java中 final 的作用是什么

final 關鍵字在Java中主要有三個方面的作用:修飾類、修飾方法、修飾變量。

修飾類:當 final 修飾一個類是,表示這個類不能被繼承,是類繼承體系中的最終形態。

例如:Java中的 String 類就是用 final 修飾的,這保證了 String 類的不可變性和安全性,可以防止其他類通過繼承來改變 String 類的行為和特性。

修飾方法:用 final 修飾的方法不能在子類中被重寫。

例如:?java.lang.object 類中的 getClass方法就是 final 的,因為這個方法的行為是由 Java 虛擬機底層實現來保證的,不應該被子類修改。

修飾變量:當用 final 修飾基本數據類型的變量時,一旦該變量被賦值就不能再改變。對于引用數據類型,final 修飾意味著這個引用變量不能再指向其他對象。

例如:這里的 num 是一個常量,就不能再對其進行賦值操作,否則會編譯報錯。

final int num = 10;

例如:這里?str 不能再指向其他 StringBuilder 對象,但可以通過 str.append() 來修改字符串內容。

final StringBuilder str = new StringBuilder("Hello");

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88857.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

有哪些更加簡潔的for循環?循環語句?

目錄 簡潔的for循環 循環過程修改循環變量 循環語句 不同編程語言支持的循環語句 foreach 無限循環 for循環歷史 break和continue 循環判斷結束值 循環標簽 循環語句優化 循環表達式返回值 簡潔的for循環 如果需要快速枚舉一個集合的元素,盡管C語言可以…

RK3568/3588 Android 12 源碼默認使用藍牙mic錄音

遇到客戶一個需求,如果連接了帶mic的藍牙耳機,默認所有的錄音要走藍牙mic通道。這個功能搞了好久,終于搞定了。1. 向RK尋求幫助,先打通 bt sco能力。此時,還無法默認就切換到藍牙 mic通道,接下來我們需求默…

解鎖HTTP:從理論到實戰的奇妙之旅

目錄一、HTTP 協議基礎入門1.1 HTTP 協議是什么1.2 HTTP 協議的特點1.3 HTTP 請求與響應的結構二、HTTP 應用場景大揭秘2.1 網頁瀏覽2.2 API 調用2.3 文件傳輸2.4 內容分發網絡(CDN)2.5 流媒體服務三、HTTP 應用實例深度剖析3.1 使用 JavaScript 的 fetc…

uvm_config_db examples

通過uvm_config_db類訪問的UVM配置數據庫,是在多個測試平臺組件之間傳遞不同對象的絕佳方式。 methods 有兩個主要函數用于從數據庫中放入和檢索項目,分別是 set() 和 get()。 static function void set ( uvm_component cntxt,string inst_name,string …

(C++)任務管理系統(文件存儲)(正式版)(迭代器)(list列表基礎教程)(STL基礎知識)

目錄 前言: 源代碼: 代碼解析: 一.頭文件和命名空間 1. #include - 輸入輸出功能2. #include - 鏈表容器3. #include - 字符串處理4. using namespace std; - 命名空間 可視化比喻:建造房子 🏠 二.menu()函數 …

Java 中的異步編程詳解

前言 在現代軟件開發中,異步編程(Asynchronous Programming) 已經成為構建高性能、高并發應用程序的關鍵技術之一。Java 作為一門廣泛應用于后端服務開發的語言,在其發展過程中不斷引入和優化異步編程的支持。從最初的 Thread 和…

MySQL邏輯刪除與唯一索引沖突解決

問題背景 在MySQL數據庫設計中,邏輯刪除(軟刪除)是一種常見的實踐,它通過設置標志位(如is_delete)來標記記錄被"刪除",而不是實際刪除數據。然而,當表中存在唯一約束時&am…

php命名空間用正斜杠還是反斜杠?

在PHP中,命名空間使用反斜杠(\)作為分隔符,這是PHP語言規范明確規定的。反斜杠在命名空間中扮演路徑分隔的角色,用于區分不同層級的命名空間。 具體說明:語法規則 PHP命名空間使用反斜杠(\&…

《從依賴糾纏到接口協作:ASP.NET Core注入式開發指南》

在C#的ASP.NET Core開發中,依賴注入絕非簡單的技術技巧,而是重構代碼關系的底層邏輯。它像一套隱形的神經網絡,讓程序模塊擺脫硬編碼的束縛,在運行時實現動態連接,從而為系統注入可測試、可進化的核心生命力。理解其深…

星云ERP本地環境搭建筆記

看到星云ERP兩個比較實用的功能,編號規則和打印模板,如下圖所示,于是本地跑起來學習學習。開發環境必備:1. JDK 1.82. MySQL 5.73. Redis 44. RabbitMQ 3.12.45. nodejs 206. pnpm 9.7.1 (npm install -g pnpm9.7.1)其他開發工具&…

RedisJSON 的 `JSON.ARRAPPEND`一行命令讓數組動態生長

1 、 為什么選擇 JSON.ARRAPPEND 在傳統的鍵值模型里,若要往數組尾部追加元素,通常需要 取→改→寫 三步: GET 整個 JSON;在應用層把元素 push 進數組;SET 回 Redis。 一條 JSON.ARRAPPEND 則可一次完成,具…

14:00開始面試,14:08就出來了,問的問題有點變態。。。

從小廠出來,沒想到在另一家公司又寄了。 到這家公司開始上班,加班是每天必不可少的,看在錢給的比較多的份上,就不太計較了。沒想到4月一紙通知,所有人不準加班,加班費不僅沒有了,薪資還要降40%…

Unity物理系統由淺入深第四節:物理約束求解與穩定性

Unity物理系統由淺入深第一節:Unity 物理系統基礎與應用 Unity物理系統由淺入深第二節:物理系統高級特性與優化 Unity物理系統由淺入深第三節:物理引擎底層原理剖析 Unity物理系統由淺入深第四節:物理約束求解與穩定性 物理引擎的…

深入淺出Kafka Consumer源碼解析:設計哲學與實現藝術

一、Kafka Consumer全景架構 1.1 核心組件交互圖 #mermaid-svg-JDEEOd2M5PzLkYa6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JDEEOd2M5PzLkYa6 .error-icon{fill:#552222;}#mermaid-svg-JDEEOd2M5PzLkYa6 .erro…

Matplotlib(一)- 數據可視化與Matplotlib

文章目錄一、數據可視化1. 數據可視化的概念2. 數據可視化流程3. 數據可視化目的4. 常見的可視化圖表4.1 折線圖4.2 柱形圖4.3 條形圖4.4 堆積圖4.4.1 堆積面積圖4.4.2 堆積柱形圖和堆積條形圖4.5 直方圖4.6 箱形圖4.7 餅圖4.8 散點圖4.9 氣泡圖4.10 誤差棒圖4.11 雷達圖二、Py…

傳輸層協議UDP原理

端口號回顧端口號的作用類似pid,用來標識進程的唯一性。只是為了與系統解耦,所以有了端口號。通過ip來確定唯一主機,再通過端口號找到指定的進程。就可以讓全網內唯一的兩個進程通信了。所以一個完整的報文至少要攜帶ip和端口號,i…

【牛客刷題】小紅的數字刪除

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述:1.3 輸出描述:1.4 示例11.5 示例2二、解題思路2.1 核心觀察2.2 關鍵問題處理三、算法實現四、算法分析4.1 算法流程圖4.2 為什么這么設計算法?4.3 算法復雜度五、模擬演練數據示例1: "103252"示例2: "333&quo…

《大數據技術原理與應用》實驗報告三 熟悉HBase常用操作

目 錄 一、實驗目的 二、實驗環境 三、實驗內容與完成情況 3.1 用Hadoop提供的HBase Shell命令完成以下任務 3.2 現有以下關系型數據庫中的表和數據,要求將其轉換為適合于HBase存儲的表并插入數據: 四、問題和解決方法 五、心得體會 一、實驗目的…

微服務初步入門

服務拆分原則 單一職責原則 單一職責原則原本是面向對象設計的一個基本原則,是指一個類應該專注于單一的功能,不要存在多于一個導致類變更的原因 在微服務架構中,是指一個微服務只負責一個功能或者業務領域,每個服務應該由清晰的定…

Liunx操作系統筆記5

用戶管理命令: useradd命令: useradd命令的功能是創建并設置用戶信息。使用useradd命令可以自動完成用戶信息、基本組、家目錄等的創建工作,并在創建過程中對用戶初始信息進行定制。語法格式:useradd 參數 用戶名常用參數: -M 不建立用…