Java類和對(duì)象超詳細(xì)講解(看這一篇就夠了!)
?? 類和對(duì)象是 Java 面向?qū)ο缶幊痰暮诵母拍?/p>
理解了類和對(duì)象,就理解了 Java 的靈魂
前言
本文將系統(tǒng)講解 Java 面向?qū)ο缶幊痰幕A(chǔ):類 和 對(duì)象 的概念、定義、使用,以及構(gòu)造方法、this 關(guān)鍵字、封裝等核心知識(shí)點(diǎn)。適合 Java 初學(xué)者閱讀
什么是面向?qū)ο?/h2>
1.1 面向?qū)ο?vs 面向過程
| 特點(diǎn) | 面向過程 | 面向?qū)ο?/th> |
|---|---|---|
| 關(guān)注點(diǎn) | 過程、步驟 | 對(duì)象、實(shí)體 |
| 思維方式 | 「怎么做」 | 「誰來做」 |
| 代碼組織 | 函數(shù)為單位 | 類為單位 |
| 典型語(yǔ)言 | C | Java、C++、Python |
舉個(gè)栗子:洗衣服
- 面向過程:拿衣服 → 放盆里 → 加水 → 加洗衣粉 → 搓洗 → 晾干
- 面向?qū)ο?/strong>:找洗衣機(jī) → 放衣服 → 按按鈕 → 等待 → 晾干
?? 面向?qū)ο蟀褟?fù)雜的問題拆分成多個(gè)對(duì)象,每個(gè)對(duì)象負(fù)責(zé)自己的事情,降低耦合,提高復(fù)用
類和對(duì)象的基本概念
2.1 什么是類?
類(Class) 是對(duì)一類事物的抽象描述,是創(chuàng)建對(duì)象的模板
比如:「學(xué)生」是一個(gè)類,它有屬性(姓名、年齡)和行為(學(xué)習(xí)、吃飯)
// 定義一個(gè)學(xué)生類
public class Student {
// 屬性(成員變量)
String name; // 姓名
int age; // 年齡
// 行為(成員方法)
public void study() {
System.out.println(name + "正在學(xué)習(xí)");
}
public void eat() {
System.out.println(name + "正在吃飯");
}
}
2.2 什么是對(duì)象?
對(duì)象(Object) 是類的具體實(shí)例,是類的具體化/實(shí)例化
比如:「張三」是學(xué)生類的一個(gè)對(duì)象,「李四」是另一個(gè)對(duì)象
public class Test {
public static void main(String[] args) {
// 創(chuàng)建對(duì)象
Student s1 = new Student();
s1.name = "張三";
s1.age = 18;
s1.study(); // 張三正在學(xué)習(xí)
Student s2 = new Student();
s2.name = "李四";
s2.age = 20;
s2.study(); // 李四正在學(xué)習(xí)
}
}
2.3 類與對(duì)象的關(guān)系

類的定義
3.1 類的完整結(jié)構(gòu)
[訪問修飾符] class 類名 {
// 1. 成員變量(屬性)
數(shù)據(jù)類型 變量名;
// 2. 構(gòu)造方法
[訪問修飾符] 類名(參數(shù)列表) {
// 初始化代碼
}
// 3. 成員方法(行為)
[訪問修飾符] 返回值類型 方法名(參數(shù)列表) {
// 方法體
}
}
3.2 實(shí)例:定義一個(gè) Person 類
public class Person {
// 成員變量
String name; // 姓名
int age; // 年齡
String gender; // 性別
// 無參構(gòu)造方法
public Person() {
System.out.println("創(chuàng)建了一個(gè)Person對(duì)象");
}
// 有參構(gòu)造方法
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
// 成員方法
public void introduce() {
System.out.println("我是" + name + ",今年" + age + "歲,性別" + gender);
}
public void eat(String food) {
System.out.println(name + "正在吃" + food);
}
}
對(duì)象的創(chuàng)建和使用
4.1 創(chuàng)建對(duì)象的語(yǔ)法
類名 對(duì)象名 = new 類名(參數(shù));
public class Test {
public static void main(String[] args) {
// 使用無參構(gòu)造創(chuàng)建對(duì)象
Person p1 = new Person();
p1.name = "張三";
p1.age = 18;
p1.gender = "男";
p1.introduce(); // 我是張三,今年18歲,性別男
// 使用有參構(gòu)造創(chuàng)建對(duì)象
Person p2 = new Person("李四", 20, "女");
p2.introduce(); // 我是李四,今年20歲,性別女
p2.eat("火鍋"); // 李四正在吃火鍋
}
}
4.2 對(duì)象內(nèi)存分析
Person p = new Person();
內(nèi)存結(jié)構(gòu):

?? 內(nèi)存要點(diǎn):
p存儲(chǔ)在棧中,保存對(duì)象的地址new Person()創(chuàng)建的對(duì)象在堆中- 成員變量有默認(rèn)值:
int→ 0,boolean→ false,引用類型 → null
成員變量 vs 局部變量
5.1 區(qū)別對(duì)比
| 對(duì)比項(xiàng) | 成員變量 | 局部變量 |
|---|---|---|
| 定義位置 | 類中,方法外 | 方法內(nèi)、參數(shù)、代碼塊 |
| 默認(rèn)值 | 有默認(rèn)值 | 無默認(rèn)值,必須先賦值 |
| 作用范圍 | 整個(gè)類 | 定義它的代碼塊 |
| 生命周期 | 對(duì)象創(chuàng)建到銷毀 | 方法調(diào)用到結(jié)束 |
| 存儲(chǔ)位置 | 堆內(nèi)存 | 棧內(nèi)存 |
5.2 示例說明
public class Demo {
// 成員變量:有默認(rèn)值
int a; // 默認(rèn) 0
String name; // 默認(rèn) null
boolean flag; // 默認(rèn) false
public void test() {
// 局部變量:必須初始化
int b; // 編譯錯(cuò)誤!使用前必須賦值
b = 10; // 初始化后才能使用
// 同名情況:就近原則
int a = 100; // 局部變量 a
System.out.println(a); // 100(局部變量)
System.out.println(this.a); // 0(成員變量)
}
}
構(gòu)造方法
6.1 什么是構(gòu)造方法?
構(gòu)造方法(Constructor) 用于創(chuàng)建對(duì)象并初始化成員變量。
[訪問修飾符] 類名(參數(shù)列表) {
// 初始化代碼
}
6.2 構(gòu)造方法的特點(diǎn)
| 特點(diǎn) | 說明 |
|---|---|
| 方法名與類名相同 | 必須完全一致 |
| 沒有返回值類型 | 連 void 都沒有 |
| 自動(dòng)調(diào)用 | 創(chuàng)建對(duì)象時(shí)自動(dòng)執(zhí)行 |
| 可以重載 | 可以定義多個(gè)構(gòu)造方法 |
6.3 默認(rèn)構(gòu)造方法
?? 如果沒有定義任何構(gòu)造方法,編譯器會(huì)自動(dòng)生成一個(gè)無參構(gòu)造方法。
如果已定義構(gòu)造方法,編譯器不再提供默認(rèn)構(gòu)造。
public class Dog {
String name;
// 手動(dòng)定義了有參構(gòu)造,無參構(gòu)造不再自動(dòng)生成
public Dog(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
Dog d1 = new Dog("旺財(cái)"); // 正確
Dog d2 = new Dog(); // 編譯錯(cuò)誤!沒有無參構(gòu)造
}
}
6.4 構(gòu)造方法重載
public class Book {
String name;
String author;
double price;
// 無參構(gòu)造
public Book() {
System.out.println("創(chuàng)建了一本書");
}
// 一個(gè)參數(shù)
public Book(String name) {
this.name = name;
}
// 兩個(gè)參數(shù)
public Book(String name, String author) {
this.name = name;
this.author = author;
}
// 三個(gè)參數(shù)
public Book(String name, String author, double price) {
this.name = name;
this.author = author;
this.price = price;
}
}
this 關(guān)鍵字
7.1 this 的作用
this 代表當(dāng)前對(duì)象的引用,用于區(qū)分成員變量和局部變量。
public class Student {
String name;
int age;
public Student(String name, int age) {
this.name = name; // this.name 是成員變量,name 是參數(shù)
this.age = age;
}
public void introduce() {
System.out.println("我是" + this.name + ",今年" + this.age + "歲");
}
}
7.2 this 的三種用法
| 用法 | 示例 | 說明 |
|---|---|---|
| 訪問成員變量 | this.name | 區(qū)分同名變量 |
| 調(diào)用成員方法 | this.introduce() | 調(diào)用本類的方法 |
| 調(diào)用其他構(gòu)造 | this(參數(shù)) | 必須在構(gòu)造方法第一行 |
7.3 this 調(diào)用其他構(gòu)造方法
public class Employee {
String name;
int age;
double salary;
// 無參構(gòu)造 → 調(diào)用三參構(gòu)造
public Employee() {
this("未知", 0, 0.0); // 必須在第一行
}
// 兩參構(gòu)造 → 調(diào)用三參構(gòu)造
public Employee(String name, int age) {
this(name, age, 3000.0); // 默認(rèn)工資
}
// 三參構(gòu)造(最終初始化)
public Employee(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
}
??
this()調(diào)用必須放在構(gòu)造方法的第一行,否則編譯錯(cuò)誤。
封裝
8.1 什么是封裝?
封裝:隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),只提供公共訪問方式。
好處:
- 提高安全性(防止非法賦值)
- 提高復(fù)用性
- 降低耦合度
8.2 封裝的實(shí)現(xiàn)步驟
1. 屬性私有化(private) 2. 提供公共的 getter 方法(取值) 3. 提供公共的 setter 方法(賦值)
8.3 封裝示例
public class BankAccount {
// 1. 私有化屬性
private String owner;
private double balance;
// 2. 無參構(gòu)造
public BankAccount() {}
// 3. 有參構(gòu)造
public BankAccount(String owner, double balance) {
this.owner = owner;
this.balance = balance;
}
// 4. getter 方法
public String getOwner() {
return owner;
}
public double getBalance() {
return balance;
}
// 5. setter 方法(帶驗(yàn)證邏輯)
public void setOwner(String owner) {
this.owner = owner;
}
public void setBalance(double balance) {
if (balance >= 0) {
this.balance = balance;
} else {
System.out.println("余額不能為負(fù)數(shù)!");
}
}
// 6. 業(yè)務(wù)方法
public void deposit(double amount) {
if (amount > 0) {
balance += amount;
System.out.println("存款成功,當(dāng)前余額:" + balance);
}
}
public void withdraw(double amount) {
if (amount > 0 && amount <= balance) {
balance -= amount;
System.out.println("取款成功,當(dāng)前余額:" + balance);
} else {
System.out.println("取款失敗,余額不足!");
}
}
}
訪問修飾符
9.1 四種訪問權(quán)限
| 修飾符 | 本類 | 同包 | 子類(不同包) | 其他 |
|---|---|---|---|---|
public | ? | ? | ? | ? |
protected | ? | ? | ? | ? |
| 默認(rèn)(無修飾符) | ? | ? | ? | ? |
private | ? | ? | ? | ? |
9.2 使用建議
[!TIP]
?? 設(shè)計(jì)原則:
- 屬性:一般用
private(封裝)- 方法:一般用
public(對(duì)外提供服務(wù))- 構(gòu)造方法:一般用
public- 常量:用
public static final
public class Student {
// 私有屬性
private String name;
private int age;
// 公共常量
public static final String SCHOOL = "清華大學(xué)";
// 公共方法
public void study() { }
// 私有方法:輔助方法
private void helper() { }
}
static 關(guān)鍵字
10.1 什么是 static?
static(靜態(tài)):屬于類本身,不屬于任何對(duì)象,被所有對(duì)象共享。
public class Student {
// 實(shí)例變量:每個(gè)對(duì)象獨(dú)有
String name;
int age;
// 靜態(tài)變量:所有對(duì)象共享
static String school = "清華大學(xué)";
static int count = 0; // 統(tǒng)計(jì)創(chuàng)建了多少學(xué)生
public Student(String name, int age) {
this.name = name;
this.age = age;
count++; // 每創(chuàng)建一個(gè)對(duì)象,count+1
}
}
10.2 static 的特點(diǎn)
| 特點(diǎn) | 說明 |
|---|---|
| 屬于類 | 隨類加載而加載,早于對(duì)象創(chuàng)建 |
| 共享 | 被所有對(duì)象共享 |
| 訪問方式 | 類名.靜態(tài)成員(推薦)或 對(duì)象名.靜態(tài)成員 |
10.3 static 的使用場(chǎng)景
public class Demo {
// 1. 靜態(tài)變量:共享數(shù)據(jù)
static int count = 0;
// 2. 靜態(tài)方法:工具方法,不依賴對(duì)象
public static int add(int a, int b) {
return a + b;
}
// 3. 靜態(tài)代碼塊:類加載時(shí)執(zhí)行一次
static {
System.out.println("類加載了");
}
}
// 使用
public class Test {
public static void main(String[] args) {
// 靜態(tài)成員通過類名訪問
System.out.println(Demo.count);
System.out.println(Demo.add(1, 2));
}
}
10.4 static 注意事項(xiàng)
?? 靜態(tài)方法只能訪問靜態(tài)成員,不能直接訪問實(shí)例成員。
因?yàn)殪o態(tài)方法屬于類,不依賴對(duì)象,而實(shí)例成員屬于對(duì)象。
public class Demo {
int a = 10; // 實(shí)例變量
static int b = 20; // 靜態(tài)變量
public static void test() {
// System.out.println(a); // 編譯錯(cuò)誤!
System.out.println(b); // 正確
// 如果要訪問實(shí)例變量,需要?jiǎng)?chuàng)建對(duì)象
Demo d = new Demo();
System.out.println(d.a); // 正確
}
}
代碼塊
11.1 代碼塊的分類
| 類型 | 位置 | 執(zhí)行時(shí)機(jī) | 作用 |
|---|---|---|---|
| 普通代碼塊 | 方法中 | 方法調(diào)用時(shí)執(zhí)行 | 控制變量作用域 |
| 實(shí)例代碼塊 | 類中,方法外 | 每次創(chuàng)建對(duì)象時(shí)執(zhí)行 | 初始化實(shí)例成員 |
| 靜態(tài)代碼塊 | 類中,方法外,加 static | 類加載時(shí)執(zhí)行一次 | 初始化靜態(tài)成員 |
| 同步代碼塊 | 方法中,加 synchronized | 方法調(diào)用時(shí)執(zhí)行 | 線程同步(多線程部分講) |
11.2 普通代碼塊
public class Demo {
public void test() {
// 普通代碼塊:控制變量作用域
{
int x = 10;
System.out.println("普通代碼塊:" + x);
}
// System.out.println(x); // 編譯錯(cuò)誤,x 已超出作用域
}
}
11.3 實(shí)例代碼塊(構(gòu)造代碼塊)
public class Student {
String name;
int age;
// 實(shí)例代碼塊:每次創(chuàng)建對(duì)象時(shí)執(zhí)行,先于構(gòu)造方法
{
System.out.println("實(shí)例代碼塊執(zhí)行");
age = 18; // 默認(rèn)年齡
}
public Student(String name) {
this.name = name;
System.out.println("構(gòu)造方法執(zhí)行");
}
}
// 測(cè)試
public class Test {
public static void main(String[] args) {
Student s1 = new Student("張三");
/* 輸出:
實(shí)例代碼塊執(zhí)行
構(gòu)造方法執(zhí)行
*/
Student s2 = new Student("李四");
/* 輸出:
實(shí)例代碼塊執(zhí)行
構(gòu)造方法執(zhí)行
*/
}
}
11.4 靜態(tài)代碼塊
public class Student {
String name;
static String school;
// 靜態(tài)代碼塊:類加載時(shí)執(zhí)行一次,只執(zhí)行一次
static {
System.out.println("靜態(tài)代碼塊執(zhí)行");
school = "清華大學(xué)";
}
// 實(shí)例代碼塊
{
System.out.println("實(shí)例代碼塊執(zhí)行");
}
public Student(String name) {
this.name = name;
System.out.println("構(gòu)造方法執(zhí)行");
}
}
// 測(cè)試
public class Test {
public static void main(String[] args) {
Student s1 = new Student("張三");
/* 輸出:
靜態(tài)代碼塊執(zhí)行
實(shí)例代碼塊執(zhí)行
構(gòu)造方法執(zhí)行
*/
Student s2 = new Student("李四");
/* 輸出:
實(shí)例代碼塊執(zhí)行
構(gòu)造方法執(zhí)行
*/
}
}
11.5 執(zhí)行順序總結(jié)
?? 執(zhí)行順序:
靜態(tài)代碼塊 → 實(shí)例代碼塊 → 構(gòu)造方法
靜態(tài)代碼塊只執(zhí)行一次,實(shí)例代碼塊和構(gòu)造方法每次創(chuàng)建對(duì)象時(shí)都執(zhí)行。
public class Demo {
static { System.out.println("1. 靜態(tài)代碼塊"); }
{ System.out.println("2. 實(shí)例代碼塊"); }
public Demo() { System.out.println("3. 構(gòu)造方法"); }
public static void main(String[] args) {
new Demo();
System.out.println("---");
new Demo();
}
}
/* 輸出:
1. 靜態(tài)代碼塊
2. 實(shí)例代碼塊
3. 構(gòu)造方法
---
2. 實(shí)例代碼塊
3. 構(gòu)造方法
*/
11.6 同步代碼塊
?? 同步代碼塊用于多線程編程,確保線程安全。
將在 多線程 部分詳細(xì)講解。
// 預(yù)覽(多線程部分再講)
synchronized (對(duì)象鎖) {
// 需要同步的代碼
}
toString 方法
10.1 默認(rèn)的 toString
所有類都繼承自 Object 類,Object 類有 toString() 方法。
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.name = "張三";
s.age = 18;
System.out.println(s); // Student@15db9742(默認(rèn):類名@地址)
System.out.println(s.toString()); // 同上
}
}
10.2 重寫 toString
public class Student {
private String name;
private int age;
// 構(gòu)造方法省略...
@Override
public String toString() {
return "Student{name='" + name + "', age=" + age + "}";
}
}
// 使用
Student s = new Student("張三", 18);
System.out.println(s); // Student{name='張三', age=18}
?? 在 IDEA 中,可以使用快捷鍵
Alt + Insert→toString()自動(dòng)生成。
對(duì)象數(shù)組
11.1 什么是對(duì)象數(shù)組?
數(shù)組存儲(chǔ)的是對(duì)象引用,而不是對(duì)象本身。
public class Test {
public static void main(String[] args) {
// 聲明對(duì)象數(shù)組
Student[] students = new Student[3];
// 創(chuàng)建對(duì)象并賦值
students[0] = new Student("張三", 18);
students[1] = new Student("李四", 19);
students[2] = new Student("王五", 20);
// 遍歷對(duì)象數(shù)組
for (Student s : students) {
System.out.println(s);
}
}
}
11.2 內(nèi)存圖解

小結(jié)
| 知識(shí)點(diǎn) | 核心內(nèi)容 |
|---|---|
| 類與對(duì)象 | 類是模板,對(duì)象是實(shí)例 |
| 構(gòu)造方法 | 初始化對(duì)象,可重載,可互相調(diào)用 |
| this 關(guān)鍵字 | 當(dāng)前對(duì)象引用,區(qū)分變量,調(diào)用構(gòu)造 |
| 成員 vs 局部變量 | 作用范圍、默認(rèn)值、存儲(chǔ)位置不同 |
| 封裝 | private + getter/setter,提高安全性 |
| 訪問修飾符 | public > protected > 默認(rèn) > private |
| static 關(guān)鍵字 | 屬于類,被所有對(duì)象共享 |
| 代碼塊 | 普通/實(shí)例/靜態(tài)/同步(多線程) |
| toString | 重寫以返回有意義的字符串表示 |
寫在最后
類和對(duì)象是 Java 面向?qū)ο缶幊痰幕?。下一篇我們將講解 繼承 —— 如何復(fù)用代碼、建立類之間的關(guān)系!
到此這篇關(guān)于Java類和對(duì)象超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Java類和對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的鎖與鎖的狀態(tài)升級(jí)詳細(xì)解讀
這篇文章主要介紹了Java中的鎖與鎖的狀態(tài)升級(jí)詳細(xì)解讀,Java 1.6以后官方針對(duì)鎖的優(yōu)化,主要是增加了兩種新的鎖:偏向鎖和輕量級(jí)鎖,再加上本身重量級(jí)鎖,那么鎖基本上可以大致分為這三種,它們之間的區(qū)別主要是體現(xiàn)在等待時(shí)間上面,需要的朋友可以參考下2024-01-01
Spring Boot中使用JDBC Templet的方法教程
這篇文章主要給大家介紹了關(guān)于在Spring Boot中使用JDBC Templet的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
SpringBoot如何使用Undertow做服務(wù)器
這篇文章主要介紹了SpringBoot如何使用Undertow做服務(wù)器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot項(xiàng)目中如何解決跨域問題的最新方案?
跨域問題是瀏覽器為了保護(hù)用戶的信息安全,實(shí)施了同源策略(Same-Origin Policy),即只允許頁(yè)面請(qǐng)求同源(相同協(xié)議、域名和端口)的資源,當(dāng) JavaScript 發(fā)起的請(qǐng)求跨越了同源策略,即請(qǐng)求的目標(biāo)與當(dāng)前頁(yè)面的域名、端口、協(xié)議不一致時(shí),瀏覽器會(huì)阻止請(qǐng)求的發(fā)送或接收2025-03-03
Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐
本文主要介紹了Java 遞歸查詢部門樹形結(jié)構(gòu)數(shù)據(jù)的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
GraalVM系列Native?Image?Basics靜態(tài)分析
這篇文章主要為大家介紹了GraalVM系列Native?Image?Basics靜態(tài)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java.lang.InterruptedException被中止異常的原因及解決方案
Java.lang.InterruptedException是線程被中斷時(shí)拋出的異常,用于協(xié)作停止執(zhí)行,常見于阻塞操作,原因包括中斷請(qǐng)求未處理,解決方法包括檢查中斷狀態(tài)、捕獲異常并重新設(shè)置中斷,避免忽略中斷,本文介紹Java.lang.InterruptedException被中止異常解決方案,感興趣的朋友一起看看吧2025-07-07
SpringBoot文件上傳接口并發(fā)性能調(diào)優(yōu)
在一個(gè)項(xiàng)目現(xiàn)場(chǎng),文件上傳接口(文件500K)QPS只有30,這個(gè)并發(fā)性能確實(shí)堪憂,此文記錄出坑過程,文中通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-06-06

