首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 面向對象核心筆記:從類與對象到內存模型全景圖

     編輯:Java 綜合教學

Java OOP 基石:概念、代碼、內存、實戰一次講透

面向對象(OOP)是 Java 的靈魂。本文系統梳理類/對象、構造器、方法重載、變量分類、靜態與實例、內存分配(棧/堆/方法區),配合「人遛狗被咬」「開車撞人」等生動案例與內存圖解,助你建立扎實的對象思維。

一、核心概念速覽

術語定義現實類比
類同類事物的抽象模板(屬性+方法)「狗」這個概念
對象類的具體實例「大黃」這條具體的狗
成員變量描述狀態(屬性)名字、年齡、顏色
方法描述行為(功能)叫、跑、咬人
構造器初始化對象的特殊方法出生時賦予名字、屬性

二、代碼實戰:人狗大戰 & 開車撞人

案例 1:張三遛狗遇大黃

// Dog.java
public class Dog {
    String name;
    public void bite(Person p) { System.out.println(name + "咬了" + p.name); }
    public void run() { System.out.println(name + "跑了..."); }
}

// Person.java
public class Person {
    String name;
    public void walk() { System.out.println(name + "在街上散步"); }
    public void meet(Dog d) { System.out.println(name + "遇到" + d.name); }
    public void beat(Dog d) { System.out.println(name + "打了" + d.name); }
}

// Main.java
public class DogAndPerson {
    public static void main(String[] args) {
        Person p = new Person(); p.name = "張三";
        Dog d = new Dog(); d.name = "大黃";
        p.walk(); p.meet(d); d.bite(p); p.beat(d); d.run();
    }
}

案例 2:張三開寶馬撞李四

// Car.java
public class Car {
    String mark; int power; String color; int price;
    public void start(Person p) { System.out.println(p.name + "啟動了" + mark); }
    public void speedUp() { System.out.println(mark + "加速"); }
    public void run() { System.out.println(mark + "正常行駛"); }
    public void hit(Person p) { System.out.println(mark + "撞了" + p.name); }
}

// Person.java (增加 drive 方法)
public void drive(Car c) { System.out.println(name + "駕駛" + c.mark); }

// Main.java
Car car = new Car(); car.mark = "寶馬";
Person p1 = new Person(); p1.name = "張三";
Person p2 = new Person(); p2.name = "李四";
car.start(p1); car.speedUp(); p1.drive(car); car.run(); car.hit(p2);

三、構造器深度解析

  • 無參構造器:不寫系統自動生成;寫了有參構造器,系統不再生成無參
  • 有參構造器:標準模式——this.field = param 完成初始化
  • 構造器重載:參數列表不同(個數/類型/順序),this(...) 互調避免重複
  • 調用時機:new ClassName() 瞬間,僅執行一次
// Employee 完整示例:帶參構造器 + 週幾判斷工作/休息
public class Staff {
    int number; String name; char sex; short age, w_age; long salary;
    public Staff(String name, int number, char sex, short age, short w_age, long salary) {
        this.name = name; this.number = number; this.sex = sex;
        this.age = age; this.w_age = w_age; this.salary = salary;
    }
    public void work() { System.out.println(name + "今天工作"); }
    public void rest() { System.out.println(name + "今天休息"); }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // ... 輸入數據 ...
        Staff s = new Staff(name, number, sex, age, w_age, salary);
        short day = sc.nextShort();
        if (day < 6) s.work(); else if (day <= 7) s.rest(); else System.out.println("error!");
    }
}

四、變量與方法分類全景圖

維度分類關鍵字內存區域生命週期訪問規則
成員變量類變量static方法區類加載 → 類卸載類名. / 對象. 皆可
實例變量無堆對象創建 → GC回收對象. 訪問
局部變量形參/方法內/代碼塊無棧方法調用 → 方法返回僅方法內可見
方法類方法static方法區類加載只能訪問 static 成員
實例方法無方法區對象創建可訪問所有成員

五、內存模型動態演示:Student 對象創建全過程

public class Student {
    private String name; private int age;
    public void study() { System.out.println("I love study!"); }
    // getter/setter 省略
}

public class StudentDemo {
    public static void main(String[] args) {
        Student s = new Student();        // ① 棧存引用,堆存對象
        s.setName("John"); s.setAge(23);  // ② 堆中對象屬性賦值
        s.study();                        // ③ 棧帧入棧執行 study()
        Student s2 = s;                   // ④ 棧中新引用指向同一堆對象
        s2.setName("Jack");               // ⑤ 修改同一對象,s 也變了
    }
}

內存演變圖解:

  1. 類加載:Student.class 進入方法區,成員方法分配入口地址
  2. main 入棧:棧分配 main() 棧幀
  3. new Student():
    • 堆分配對象內存,屬性賦默認值(null/0)
    • 棧分配引用變量 s,指向堆地址
  4. setter 賦值:通過引用定位堆對象,修改屬性
  5. study() 入棧:棧分配新幀,執行完彈出銷毀
  6. s2 = s:棧新增引用 s2,指向同一堆地址
  7. main 結束:棧幀銷毀,堆對象等待 GC

類加載後方法區 new對象後棧堆 賦值後堆對象 方法入棧 引用賦值 修改後共享對象 main結束棧空堆待GC

六、關鍵面試考點總結

  1. this:區分同名局部變量與成員變量;構造器互調 this(...)
  2. static:類級別共享,無 this,不能直接調用非 static 成員
  3. 默認初始化:實例變量有默認值(0/false/null),局部變量無,必須顯式賦值
  4. 方法重載:同類中方法名相同、參數列表不同(返回類型無關)
  5. 引用傳遞:Java 只有值傳遞,對象傳的是引用的值(地址)

七、練習題(建議手寫)

  1. 寫方法 max(int a, int b) 返回較大值
  2. 寫方法 isEven(int n) 判斷偶數
  3. 寫方法 isTriangle(int a, int b, int c) 判斷能否成三角形
  4. 寫方法 isRightTriangle(int a, int b, int c) 判斷直角三角形

「理解內存模型,是寫出高性能、無 Bug Java 代碼的前提。
棧存引用、堆存對象、方法區存類——把這張圖刻進腦子裡。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved