【從零開始java學習|第十篇】面向對象

目錄

一、面向對象介紹

二、類和對象

1. 類(Class):對象的模板

2. 對象(Object):類的實例

三、封裝

1. 封裝的概念

2. 封裝的優勢

四、就近原則和 this 關鍵字

1. 就近原則

2. this 關鍵字

五、構造方法

1. 構造方法的作用

2. 構造方法的特點

3. 默認構造方法

六、標準的 JavaBean 類

七、對象內存圖(三種情況)

1. 單個對象的內存圖

2. 兩個對象的內存圖

3. 兩個引用指向同一對象

八、基本數據類型和引用數據類型(面向對象視角)

九、this 的內存原理

十、成員變量和局部變量

總結


一、面向對象介紹

面向對象編程(OOP)是一種以 "對象" 為核心的編程思想,它將現實世界中的事物抽象為程序中的 "對象",通過對象之間的交互完成功能。

與面向過程的區別

  • 面向過程:關注 "步驟",如 "先做什么,再做什么"(例:按步驟實現登錄功能)
  • 面向對象:關注 "對象",如 "用戶對象"" 登錄界面對象 ",通過對象協作完成功能

面向對象三大特征

  • 封裝:隱藏對象內部細節,只暴露必要接口
  • 繼承:實現類之間的代碼復用
  • 多態:同一行為的不同表現形式

優勢:代碼更易維護、擴展,更符合人類對現實世界的認知。

二、類和對象

1. 類(Class):對象的模板

類是對同一類事物的抽象描述,包含這類事物的屬性(數據)和方法(行為)。

// 類的定義:描述"學生"這類事物
public class Student {// 屬性(成員變量):學生的特征String name;int age;// 方法:學生的行為public void study() {System.out.println(name + "正在學習");}
}

2. 對象(Object):類的實例

對象是類的具體 "實例",是真實存在的個體。通過new關鍵字創建對象。

public class Test {public static void main(String[] args) {// 創建對象:類名 對象名 = new 類名();Student stu1 = new Student();// 給對象的屬性賦值stu1.name = "張三";stu1.age = 18;// 調用對象的方法stu1.study(); // 輸出:張三正在學習// 再創建一個對象(另一個實例)Student stu2 = new Student();stu2.name = "李四";stu2.study(); // 輸出:李四正在學習}
}

類與對象的關系:類是模板,對象是根據模板創建的具體實例(如 "汽車圖紙" 與 "具體的汽車")。

三、封裝

封裝是面向對象的三大特征之一,此外還有繼承和多態。封裝的作用是在拿到一個需求之后,告訴我們如何正確的設計對象的屬性和方法。

1. 封裝的概念

封裝是指隱藏對象的內部細節(如屬性值),只通過公共方法對外提供訪問和修改的接口。

實現方式

  • private修飾屬性(私有屬性,僅本類可見)
  • 提供publicgetter(獲取屬性值)和setter(修改屬性值)方法
public class Person {// 私有屬性:外部不能直接訪問private String name;private int age;// getter:獲取namepublic String getName() {return name;}// setter:修改namepublic void setName(String n) {name = n; // 可在此處添加驗證邏輯}// getter:獲取agepublic int getAge() {return age;}// setter:修改age,添加合法性驗證public void setAge(int a) {if (a > 0 && a < 150) { // 年齡必須在合理范圍age = a;} else {System.out.println("年齡不合法");}}
}

2. 封裝的優勢

  • 保護數據安全(如限制年齡范圍)
  • 隱藏實現細節(外部無需知道屬性如何存儲)
  • 便于修改內部實現(不影響外部調用)

3. private關鍵字

  • 是一個權限修飾符
  • 可以修飾成員(成員變量和成員方法
  • 被private修飾的成員只能在本類中才能訪問

示例:

四、就近原則和 this 關鍵字

1.局部變量與成員變量

(1). 成員變量(Member Variable)

  • 定義位置:直接在類體中聲明,但在任何方法、構造器或代碼塊之外。

  • 生命周期:隨著對象的創建而創建,隨著對象的銷毀而銷毀。

  • 存儲位置:存在于堆內存的對象內部。

  • 作用域:整個類內部都可見(受訪問修飾符限制)。

  • 默認值:系統會自動賦予默認值(如 int 默認為 0,引用類型默認為 null)。

  • 示例

    public class Dog {String name = "旺財"; // 成員變量
    }

(2). 局部變量(Local Variable)

  • 定義位置:在方法、構造器、代碼塊或方法的參數列表中聲明。

  • 生命周期:從聲明處開始,到所在代碼塊執行結束時銷毀。

  • 存儲位置:存在于棧內存中。

  • 作用域:僅在聲明它的代碼塊(方法、循環、條件語句等)內部可見。

  • 默認值:沒有默認值,必須顯式初始化后才能使用。

  • 示例

    public void bark() {String name = "小白"; // 局部變量
    }
特性成員變量局部變量
定義位置類中方法外方法、構造器或代碼塊內
生命周期與對象相同與方法/代碼塊相同
存儲位置堆內存棧內存
作用域整個類(受訪問控制修飾符限制)聲明它的代碼塊內
默認值有(系統自動賦值)無(必須手動初始化)
命名沖突處理被局部變量覆蓋(就近原則)優先使用局部變量

2. 就近原則

當方法中出現局部變量與成員變量同名時,優先使用局部變量(離引用位置更近)。

因為當局部變量與成員變量同名時,在局部變量的作用域內,局部變量會“遮蔽”成員變量。若需訪問被遮蔽的成員變量,需使用 this 關鍵字。

public class Dog {String name = "旺財"; // 成員變量public void bark() {String name = "小白"; // 局部變量System.out.println(name + "在叫"); // 輸出:小白在叫(就近使用局部變量)}
}

3. this 關鍵字

this代表當前對象的引用,用于:

  • 區分同名的局部變量和成員變量
  • 調用本類的其他方法或構造方法
public class Cat {String name; // 成員變量// 用this區分局部變量和成員變量public void setName(String name) {this.name = name; // this.name指成員變量,name指局部變量}public void eat() {System.out.println(this.name + "在吃"); // this可省略(無同名局部變量時)}
}

五、構造方法

1. 構造方法的作用

初始化對象(給對象的屬性賦初始值),在創建對象時自動調用。

2. 構造方法的特點

  • 方法名與類名完全相同
  • 沒有返回值類型(連void都不能寫)
  • 不能被staticfinal等修飾
public class Book {String title;double price;// 無參構造方法public Book() {System.out.println("創建了一本書");}// 帶參構造方法:初始化時直接賦值public Book(String t, double p) {title = t;price = p;}
}// 調用構造方法
public class Test {public static void main(String[] args) {Book b1 = new Book(); // 調用無參構造Book b2 = new Book("Java編程", 59.9); // 調用帶參構造}
}

3. 默認構造方法

  • 如果類中沒有定義任何構造方法,編譯器會自動生成一個無參構造方法
  • 如果手動定義了構造方法,默認無參構造會失效(如需使用需手動添加)

六、標準的 JavaBean 類

JavaBean 是一種規范的類,用于封裝數據,遵循以下規則:

  1. 成員變量私有(private
  2. 提供無參構造方法
  3. 提供gettersetter方法
  4. 可根據需要重寫toString()(方便打印對象信息)
public class User {// 1. 私有成員變量private String username;private String password;private int age;// 2. 無參構造public User() {}// 3. 帶參構造(可選)public User(String username, String password, int age) {this.username = username;this.password = password;this.age = age;}// 4. getter和setterpublic String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}// 5. 重寫toString()(可選)@Overridepublic String toString() {return "User{username='" + username + "', age=" + age + "}";}
}

七、對象內存圖(三種情況)

1. 單個對象的內存圖

棧內存                 堆內存
+----------+          +----------------+
| 引用變量 |          | 對象(User)   |
| u ------+----------> username: null |
+----------+          | password: null|| age: 0        |+----------------+
  • 引用變量(u)存于棧中,指向堆中的對象
  • 對象的屬性在堆中,有默認值(引用類型為null,基本類型為對應默認值)

2. 兩個對象的內存圖

棧內存                 堆內存
+----------+          +----------------+
| u1 ------+----------> username: "張三"|
+----------+          | age: 18        |
| u2 ------+----------+----------------+
+----------+          | username: "李四"|| age: 20        |+----------------+
  • 兩個引用變量指向堆中不同對象,屬性各自獨立

3. 兩個引用指向同一對象

棧內存                 堆內存
+----------+          +----------------+
| u1 ------+----------> username: "張三"|
+----------+          | age: 18        |
| u2 ------+----------+----------------+
+----------+          
  • u1u2指向同一對象,修改u1的屬性會影響u2

八、基本數據類型和引用數據類型(面向對象視角)

類型存儲方式在對象中的表現
基本數據類型棧中直接存值對象的屬性值直接存在堆中
引用數據類型棧中存地址,堆中存值對象的屬性存地址,指向另一對象
public class Person {int age; // 基本類型:值直接存在Person對象中String name; // 引用類型:存地址,指向堆中的字符串對象
}

九、this 的內存原理

this當前對象的引用,本質上是方法的一個隱藏參數,在創建對象時自動綁定到該對象。

public class Car {String color;public void setColor(String color) {this.color = color; // this指向調用該方法的對象}
}// 調用時
Car c = new Car();
c.setColor("紅色"); // 實際執行:setColor(c, "紅色"),this就是c

內存中this與對象的引用變量(如c)存儲相同的地址,指向堆中的同一個對象。

十、成員變量和局部變量

區別成員變量局部變量
定義位置類中,方法外方法內、方法參數、代碼塊中
作用域整個類僅在定義的方法 / 代碼塊中
默認值有默認值(如 int 為 0,對象為 null)無默認值,必須初始化后使用
內存位置堆內存(對象中)棧內存(方法棧幀中)
生命周期隨對象創建而存在,隨對象銷毀而消失隨方法調用而存在,隨方法結束而消失
public class VariableDemo {int memberVar = 10; // 成員變量public void method() {int localVar = 20; // 局部變量System.out.println(memberVar + localVar);}
}

總結

面向對象編程是 Java 的核心思想,其核心是類和對象:類是模板,對象是實例。通過封裝保護數據,利用構造方法初始化對象,遵循JavaBean 規范實現標準化封裝。

理解this關鍵字、成員與局部變量的區別、數據類型的存儲差異,以及對象在內存中的表現,是掌握面向對象編程的基礎。這些概念為后續學習繼承和多態奠定了重要基礎。

如果我的內容對你有幫助,請點贊,評論,收藏。接下來我將繼續更新相關內容!

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

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

相關文章

Spark算子調優

Spark中可用下面的算子對數據計算進行優化處理&#xff0c;包括&#xff1a; mapPartition&#xff1a;一次處理一個分區數據&#xff0c;能夠使用mapPartition的盡量使用&#xff0c;但是使用時會一次性讀取整個分區數據到內存&#xff0c;占內存很大&#xff0c;同理還有fore…

碼農特供版《消費者權益保護法》逆向工程指北——附源碼級注釋與異常處理方案

尊敬的審核&#xff1a; 本人文章《碼農特供版〈消費者權益保護法〉逆向工程指北——附源碼級注釋與異常處理方案》 1. 純屬技術交流&#xff0c;無任何違法內容 2. 所有法律引用均來自公開條文 3. 請依據《網絡安全法》第12條“不得無故刪除合法內容”處理 附&#xff1a;本文…

MQTT 連接建立與斷開流程詳解(二)

三、核心機制與最佳實踐&#xff08;一&#xff09;會話管理與 QoS 保障Clean Session vs 持久會話&#xff1a;在 MQTT 連接中&#xff0c;會話管理是一個重要的概念&#xff0c;其中 Clean Session 和持久會話是兩種不同的會話模式。Clean Session&#xff0c;當設置為 1 時&…

[光學原理與應用-332]:ZEMAX - 序列模式與非序列模式的本質、比較

序列模式&#xff08;Sequential Mode&#xff09;與非序列模式&#xff08;Non-Sequential Mode&#xff09;是ZEMAX光學設計軟件中的兩種核心設計模式&#xff0c;二者在光路定義、分析工具、應用場景等方面存在本質差異。以下是兩者的詳細比較&#xff1a;一、本質差異光路定…

WeakAuras Lua Script (My Version)

分享下我的WA的簡約配置&#xff0c;大多數都是團隊框架高亮&#xff0c;輔助大腳DBM監控 表格&#xff1a; WeakAuras Lua Script &#xff1c;BiaoGe&#xff1e;_wa拍賣字符串-CSDN博客 ICC 監控&#xff0c;只要團隊框架監控 WeakAuras Lua Script ICC &#xff08;Barne…

【Python+requests】解決Python requests中的ProxyError:SSL版本錯誤問題詳解

解決Python requests中的ProxyError&#xff1a;SSL版本錯誤問題詳解 在使用Python進行網絡請求時&#xff0c;很多人都會用到requests庫配合代理服務器進行調試或抓包。但有時會遇到令人困惑的ProxyError&#xff0c;尤其是伴隨SSLError: [SSL: WRONG_VERSION_NUMBER]這樣的錯…

基于deepseek的Spring boot入門

一次跟著deepseek記筆記的嘗試&#xff0c;由于CSDN沒有思維導圖&#xff0c;只能按層級記錄提問 如果我想知道一個springboot項目的基本結構&#xff0c;比如用到了哪些組件&#xff0c;入口在哪&#xff0c;數據庫配置是怎樣的 應該從哪里開始 springboot有哪些常用注解 一個…

macOS 15.6 ARM golang debug 問題

前言 最近使用macmini m4在使用golang debug發現一些奇怪的問題&#xff0c;debug到c代碼&#xff0c;莫名其妙&#xff0c;而且不知道什么原因&#xff0c;知道搜索查詢&#xff0c;才發現是蘋果的Command Line Tools 的鍋&#xff0c;macOS 15果然是一堆bug&#xff0c;畢竟…

有個需求:切換車隊身份實現Fragment的Tab隱藏顯示(車隊不顯示獎賞)

核心實現&#xff1a; 1使用mmkv保存切換的身份 2借助eventbus實現通知Fragment的tab更新private void switchFleet(boolean isMore, EnterpriseInfo enterpriseInfo) {if (isMore) {tvSwitchFleetTitle.setText(getText(R.string.switch_to_other_accounts));} else {tvSwitch…

在 Android Studio 中修改 APK 啟動圖標(2025826)

在 Android Studio 中修改 Android 12 應用圖標可以按照以下步驟進行&#xff1a;1、準備圖標資源準備一個啟動圖標&#xff08;建議使用 SVG 格式或高分辨率 PNG&#xff0c;推薦尺寸為 512x512 像素&#xff09;圖標應符合 Android 12 的設計規范&#xff08;自適應圖標&…

Linux三劍客grep-sed-awk

linux三劍客-grep、sed、awk 文章目錄linux三劍客-grep、sed、awk1.正則表達式1.1正則表達式&#xff1f;1.2應用場景&#xff1f;-誰可以用&#xff1f;1.3正則注意事項&#xff08;避免90%以上的坑&#xff09;1.4正則符號1.5正則VS通配符2.基礎正則2.1 ^ 以...開頭的行2.2 $…

給某個conda環境安裝CUDA 12.4版本 全局CUDA不變

文章目錄&#x1f3af; 正確的安裝命令&#x1f4cb; 為什么這個命令安全&#xff1f;?? 重要說明&#x1f527; 安裝后環境配置方法一&#xff1a;在虛擬環境中設置方法二&#xff1a;使用conda環境變量&#x1f9ea; 驗證安裝&#x1f4ca; 版本共存確認&#x1f4a1; 額外…

【C++】日期類實現詳解:代碼解析與復用優化

代碼總覽與總結// 實現一個完善的日期類 class Date { public:int GetMonthDay(int year, int month){int monthDays[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };// 閏年2月if (month 2 && ((year % 4 0 && year % 100 ! 0) || year % 400 0))return …

零基礎json入門教程(基于vscode的json配置文件)

一、什么是 JSON&#xff1f;—— 最核心的概念JSON&#xff08;JavaScript Object Notation&#xff09;是一種輕量級的數據交換格式&#xff0c;長得像鍵值對的集合&#xff0c;用途是存儲和傳遞數據。在 VS Code 中&#xff0c;它常被用來寫配置文件&#xff08;比如調試配置…

深入對比分析SpringCloud和Dubbo兩大微服務框架的核心架構與特性。

1 微服務架構演進與核心概念1.1 微服務架構的本質微服務架構是一種將單一應用程序劃分為一組小型服務的方法&#xff0c;每個服務運行在自己的進程中&#xff0c;服務之間通過輕量級的通信機制進行協作。這些服務圍繞業務能力構建&#xff0c;并能夠獨立部署到生產環境中。微服…

鴻蒙ArkTS 核心篇-14-條件表達式(三目運算符)

目錄 根據邏輯條件結果&#xff0c;執行不同的表達式&#xff0c;得到不同結果 DevEco Studio代碼實戰 ctrl s 日志輸出 總結 根據邏輯條件結果&#xff0c;執行不同的表達式&#xff0c;得到不同結果 DevEco Studio代碼實戰 let num1: number 100 let num2: number 20l…

CDH集成LDAP進行身份驗證

前言&#xff1a;在內網環境中部署LDAP并在CDH的hive和impala中集成&#xff0c;其中配置的端口&#xff0c;鏡像名&#xff0c;密碼等需要根據自己情況進行更改 1、鏡像下載 在有網絡的服務器上下載鏡像或直接下載&#xff0c;這里需要自行配置下docker鏡像下載地址 # 下載…

并發編程:Java中的多線程與線程池!

全文目錄&#xff1a;開篇語線程的基礎概念線程生命周期線程調度線程安全線程池&#xff1a;Executor框架、線程池的管理與調優Executor框架線程池的管理與調優并發工具類&#xff1a;ReentrantLock、CountDownLatch、CyclicBarrier等ReentrantLockCountDownLatchCyclicBarrier…

語義分割一站式到底怎么玩?

語義分割模型&#xff0c;復現或改進、對比實驗&#xff0c;&#xff0c;歡迎交流&#xff0c;完爆各種詳細需求1、可以接以下語義分割模型dai做 DeepLabV3、PSPnet、HRnet、Segformer、Unet、u2net、cenet、erfnet、hcanet、hiformer、uiunet、nnunet、saunet、unext、dscnet、…

由于不對稱GND過孔配置,差分信號過孔上的差模到共模轉換

本文研究了靠近高速差分信號過孔的接地過孔的影響以及由此產生的差模到共模的轉換。該工作顯示了接地 &#xff08;GND&#xff09; 過孔和差分信號之間距離的影響 &#xff08;Diff. SIG.&#xff09;;GND過孔不對稱配置的影響;介電厚度和平面之間躍遷次數的影響。 印刷電路板…