欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中類與對象全面解析(附實例代碼)

 更新時間:2025年05月08日 09:03:55   作者:程序員小楠  
這篇文章主要介紹了Java中類與對象的相關(guān)資料,重點講解了封裝的概念,通過private關(guān)鍵字和getter/setter方法來保護和操作對象的成員變量,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

面向?qū)ο?/h2>

設(shè)計對象并使用

  • 類: 是共同特征的描述(設(shè)計圖)

  • 對象: 是真實存在的具體實例

  • Javabean類: 用來描述一類事物的類,在Javabean類里是不寫main方法的

    注意: 類名首字母要大寫,見名知意,(駝峰模式)

    注意: 在實際開發(fā)中,建議一個文件定義一個class類

    代碼:

    package com.xiaonan.Demo01;
    
    public class GirlFriend {
       //屬性
       String name;
       int age;
       String gender;
    
       //行為
       public void eat(){
           System.out.println("在吃飯");
       }
    
       public void sleep(){
           System.out.println("在睡覺");
       }
    }
package com.xiaonan.Demo01;

public class GirlFriendTest {
    public static void main(String[] args) {
        //創(chuàng)建一個女朋友對象
        GirlFriend gf1 = new GirlFriend();

        //賦值
        gf1.age = 18;
        gf1.gender = "女";
        gf1.name = "小琪";

        //輸出
        System.out.println(gf1.age);
        System.out.println(gf1.gender);
        System.out.println(gf1.name);

        //調(diào)用方法
        gf1.eat();
        gf1.sleep();

        System.out.println("--------------------");
        //new第二個對象
        GirlFriend gf2 = new GirlFriend();
        //賦值
        gf2.age = 18;
        gf2.gender = "女";
        gf2.name = "小青";

        //輸出
        System.out.println(gf2.age);
        System.out.println(gf2.gender);
        System.out.println(gf2.name);

        //調(diào)用方法
        gf1.eat();
        gf1.sleep();
    }
}

封裝

  • 是面向?qū)ο笕筇卣?(封裝 繼承 多態(tài))

  • 對象代表什么,就得封裝對應(yīng)的數(shù)據(jù),并提供數(shù)據(jù)對應(yīng)的行為

    案例:

    人關(guān)門

    這個門是自己關(guān)的,人只是給門一個作用力

private關(guān)鍵字

  • 是一個權(quán)限修飾符

  • 可以修飾成員(成員變量 和成員方法)

  • 被private(私有的)修飾的成員只能在本類中才能訪問

    例子:

package com.xiaonan.test;

public class Test {
    private int age; // private:私有的

    //set 賦值
    public void setAge(int a){
        if(a>=10 && a<= 50){
            age = a;
        }else{
            System.out.println("非法數(shù)據(jù)");
        }
    }

    //get(獲取)
    public int getAge(){
        return age;
    }
}
  • 針對private修飾的成員變量,如果需要被其他的類使用,要提供相應(yīng)的操作

  • 提供"setXxx(參數(shù))" 方法,用于給成員變量賦值,方法用public修飾

  • 提供"getXxx()" 方法,用于獲取成員變量的值,方法用public(公共的)修飾

就近原則和this關(guān)鍵字

示例代碼:

package com.xiaonan.test01;

public class GirlFriend {

    //成員變量
    private int age;

    public void method() {
        //局部變量 (方法變量)
        int age = 10;
        //System.out.println(age); //就近原則(誰離我近,我就用誰)
        System.out.println(this.age); //this關(guān)鍵字 這里的age是 成員變量的age
    }
}
package com.xiaonan.test01;

public class GirlFriendTest {
    public static void main(String[] args) {
        //創(chuàng)建一個 GirlFriend對象
        //格式: 類名 對象名 = new 類名();
        //例子
        GirlFriend gf1 = new GirlFriend();
        gf1.method();
    }
}

this關(guān)鍵字的作用

  • 區(qū)分成員變量和局部變量

構(gòu)造方法

在Java中,構(gòu)造方法是用于創(chuàng)建對象并初始化對象的特殊方法。構(gòu)造方法具有以下注意事項:

  • 構(gòu)造方法的名稱必須與類名完全相同,且沒有返回類型(包括void),它們不能被顯式地調(diào)用,而是在創(chuàng)建對象時自動調(diào)用。

  • 如果在類中沒有定義任何構(gòu)造方法,Java編譯器會自動生成一個默認的無參構(gòu)造方法。如果在類中定義了構(gòu)造方法,編譯器將不會自動生成默認構(gòu)造方法。

  • 可以定義多個構(gòu)造方法,它們可以具有不同的參數(shù)列表(參數(shù)個數(shù)、類型或順序不同),這被稱為方法的重載(overloading)。

  • 構(gòu)造方法可以有訪問修飾符(如public、private、protected)來控制對構(gòu)造方法的訪問權(quán)限。一般情況下,構(gòu)造方法應(yīng)該使用public修飾符,以便其他類可以實例化對象。

  • 在構(gòu)造方法中可以使用關(guān)鍵字super調(diào)用父類的構(gòu)造方法,以便在創(chuàng)建子類對象時初始化父類的成員變量。

  • 構(gòu)造方法可以使用this關(guān)鍵字調(diào)用同一個類中的其他構(gòu)造方法,以便在構(gòu)造方法之間進行重用。

  • 構(gòu)造方法可以拋出異常,但通常不建議在構(gòu)造方法中拋出受檢異常,而應(yīng)該在構(gòu)造方法中處理異?;蚴褂梅鞘軝z異常。

  • 構(gòu)造方法可以執(zhí)行任意的初始化操作,例如初始化對象的成員變量、調(diào)用其他方法等。

需要注意的是,構(gòu)造方法的主要目的是在創(chuàng)建對象時進行初始化操作,因此應(yīng)該避免在構(gòu)造方法中執(zhí)行過多的邏輯或復(fù)雜的計算。如果需要進行復(fù)雜的初始化操作,可以考慮使用靜態(tài)工廠方法或其他設(shè)計模式來替代構(gòu)造方法。

標準的JavaBean

  • 類名要見名知意

  • 成員變量使用private修飾

  • 提供至少兩個構(gòu)造方法

    無參構(gòu)造方法

    帶全部參數(shù)的構(gòu)造方法

  • 成員方法

    提供每一個成員變量對應(yīng)的setXxx()與getXxx()

    如果還有其他的行為也要寫上

快捷鍵

// alt + insert (快速生成JavaBean標準類的 構(gòu)造無參與全部參數(shù)的方法 和set方法和get方法)

插件

PTG 一秒生成標準的JavaBean

對象內(nèi)存圖

一個對象內(nèi)存圖

當在Java中創(chuàng)建一個對象時,它會在堆內(nèi)存中分配一塊連續(xù)的內(nèi)存空間來存儲對象的數(shù)據(jù)。下面是一個更詳細的Java對象的內(nèi)存圖示例:

  • Object Header:對象頭是用于存儲對象的元數(shù)據(jù)的部分。它通常包含以下信息:

    • 類型指針(Type Pointer):指向?qū)ο笏鶎俚念惖脑獢?shù)據(jù)。
    • 哈希碼(Hash Code):對象的哈希碼,用于支持對象的哈希表操作。
    • 鎖信息(Lock Information):用于支持對象的同步和并發(fā)操作。
  • Instance Variables:實例變量,也稱為成員變量或字段,是對象的數(shù)據(jù)部分。它們是在類中定義的變量,用于存儲對象的狀態(tài)和屬性。每個實例變量占用一定的內(nèi)存空間,具體大小取決于變量的類型和對齊要求。

創(chuàng)建對象時,Java虛擬機會執(zhí)行以下步驟:

  • 分配內(nèi)存:Java虛擬機在堆內(nèi)存中分配一塊連續(xù)的內(nèi)存空間來存儲對象的數(shù)據(jù)。

  • 初始化對象頭:Java虛擬機會將對象頭的字段初始化為默認值,如類型指針、哈希碼和鎖信息。

  • 初始化實例變量:Java虛擬機會將實例變量的值初始化為默認值,如數(shù)值類型為0,布爾類型為false,引用類型為null。

  • 執(zhí)行構(gòu)造方法:Java虛擬機會調(diào)用對象的構(gòu)造方法來執(zhí)行進一步的初始化操作,可以在構(gòu)造方法中設(shè)置實例變量的具體值。

    注意:上述內(nèi)存圖和步驟是基于Java的傳統(tǒng)對象模型,具體實現(xiàn)可能會因Java虛擬機的不同實現(xiàn)而有所不同。此外,Java還有其他的內(nèi)存區(qū)域,如棧內(nèi)存、方法區(qū)等,用于存儲不同類型的數(shù)據(jù)和執(zhí)行程序的其他操作。

    兩個引用指向同一個對象

    在Java中,可以通過將兩個引用變量指向同一個對象來實現(xiàn)這種情況。當兩個引用指向同一個對象時,它們實際上引用了相同的內(nèi)存地址,因此它們可以訪問和修改相同的對象數(shù)據(jù)。

    下面是一個示例代碼,演示了如何在Java中創(chuàng)建兩個引用指向同一個對象:

    public class Main {
     public static void main(String[] args) {
         // 創(chuàng)建一個對象
         MyClass obj = new MyClass();
    
         // 創(chuàng)建兩個引用指向同一個對象
         MyClass ref1 = obj;
         MyClass ref2 = obj;
    
         // 修改對象的數(shù)據(jù)
         obj.setData("Hello, World!");
    
         // 通過兩個引用訪問和修改相同的對象數(shù)據(jù)
         System.out.println(ref1.getData());  // 輸出: Hello, World!
         System.out.println(ref2.getData());  // 輸出: Hello, World!
     }
    }
    
    class MyClass {
     private String data;
    
     public void setData(String data) {
         this.data = data;
     }
    
     public String getData() {
         return data;
     }
    }

    在上面的示例中,ref1ref2是兩個引用變量,它們都指向obj所引用的同一個MyClass對象。通過這兩個引用變量,我們可以訪問和修改相同的對象數(shù)據(jù)。

    需要注意的是,當一個對象沒有任何引用指向它時,它將成為Java中的垃圾對象,并由垃圾收集器回收內(nèi)存。因此,在使用多個引用指向同一個對象時,需要小心確保在不需要引用時及時將其置為null,以便垃圾收集器可以回收不再使用的對象。

    基本數(shù)據(jù)類型與引用數(shù)據(jù)類型的區(qū)別

  • 存儲方式:基本數(shù)據(jù)類型的值直接存儲在變量中,而引用數(shù)據(jù)類型的變量存儲的是對象的引用(內(nèi)存地址)。

  • 大小和默認值:基本數(shù)據(jù)類型具有固定的大小和默認值,而引用數(shù)據(jù)類型的大小取決于對象的大小,且默認值為null。

    • 基本數(shù)據(jù)類型的大小是固定的,不受具體平臺的影響。例如,int類型始終占用4個字節(jié)。
    • 引用數(shù)據(jù)類型的大小取決于所引用對象的大小。例如,一個引用變量可能指向一個很小的對象或一個很大的對象。
    • 基本數(shù)據(jù)類型的默認值是根據(jù)其類型確定的。例如,int類型的默認值為0,boolean類型的默認值為false。
    • 引用數(shù)據(jù)類型的默認值為null,表示該引用變量當前未指向任何對象。
  • 傳遞方式:基本數(shù)據(jù)類型在方法參數(shù)傳遞時是按值傳遞的,而引用數(shù)據(jù)類型在方法參數(shù)傳遞時是按引用傳遞的。

    • 當將基本數(shù)據(jù)類型作為方法參數(shù)傳遞時,傳遞的是實際的值的副本。在方法內(nèi)部對參數(shù)進行修改不會影響原始值。
    • 當將引用數(shù)據(jù)類型作為方法參數(shù)傳遞時,傳遞的是引用的副本。在方法內(nèi)部對參數(shù)進行修改會影響原始對象。
  • 內(nèi)存管理:基本數(shù)據(jù)類型的變量直接存儲數(shù)據(jù)值,內(nèi)存管理由編譯器或解釋器處理;而引用數(shù)據(jù)類型的變量存儲對象的引用,對象的創(chuàng)建和銷毀由開發(fā)人員手動管理或由垃圾回收器自動處理。

    • 基本數(shù)據(jù)類型的變量在棧上分配內(nèi)存,其生命周期由程序控制。
    • 引用數(shù)據(jù)類型的對象在堆上分配內(nèi)存,其生命周期由開發(fā)人員手動管理或由Java的垃圾回收器自動處理。

    需要注意的是,Java中的基本數(shù)據(jù)類型包括boolean、byte、short、int、long、float、double和char,而其他所有的類型都屬于引用數(shù)據(jù)類型,包括類、接口、數(shù)組和枚舉等。

    this關(guān)鍵字的內(nèi)存原理

    作用: 用于區(qū)分局部變量和成員變量

    this的本質(zhì): 所在方法調(diào)用者的地址值

    在Java中,this關(guān)鍵字表示當前對象的引用。它可以在實例方法和構(gòu)造方法中使用,用于引用當前正在執(zhí)行方法的對象。

    this關(guān)鍵字的內(nèi)存原理如下:

  • 當創(chuàng)建一個對象時,Java虛擬機會在堆上為該對象分配內(nèi)存空間,并將對象的實例變量存儲在該內(nèi)存空間中。

  • 當調(diào)用對象的實例方法時,Java虛擬機會將當前對象的引用作為隱藏參數(shù)傳遞給方法。這個隱藏參數(shù)就是this關(guān)鍵字所表示的當前對象的引用。

  • 在方法內(nèi)部,可以使用this關(guān)鍵字來訪問當前對象的實例變量和實例方法。通過this關(guān)鍵字,可以明確地指定當前對象的成員,避免與局部變量或參數(shù)發(fā)生命名沖突。

  • 當方法執(zhí)行完畢后,this關(guān)鍵字的作用也就結(jié)束了。它不會占用額外的內(nèi)存空間,而是在方法調(diào)用結(jié)束后被釋放。

需要注意的是,每個實例方法都有一個隱含的this參數(shù),但它并不會顯式地出現(xiàn)在方法的參數(shù)列表中。編譯器會自動將this參數(shù)添加到方法的參數(shù)列表中,以便在方法內(nèi)部使用。

總結(jié)起來,this關(guān)鍵字在Java中用于引用當前對象,它并不占用額外的內(nèi)存空間,而是作為方法的隱含參數(shù)傳遞給實例方法。通過this關(guān)鍵字,可以訪問當前對象的實例變量和實例方法。

成員變量和局部變量的區(qū)別

在Java中,成員變量(也稱為實例變量)和局部變量是兩種不同類型的變量,它們有以下區(qū)別:

  • 作用域:成員變量定義在類中,可以在整個類中的各個方法中訪問。而局部變量定義在方法、代碼塊或構(gòu)造函數(shù)中,僅在其所在的作用域內(nèi)有效。

  • 生命周期:成員變量的生命周期與對象的生命周期相同,當對象創(chuàng)建時被初始化,直到對象被銷毀。而局部變量的生命周期僅限于其所在的作用域,在離開作用域后,局部變量將被銷毀。

  • 默認值:成員變量會被賦予默認值,例如,整數(shù)類型的成員變量默認值為0,布爾類型的成員變量默認值為false。而局部變量沒有默認值,必須在使用之前顯式初始化。

  • 訪問修飾符:成員變量可以使用不同的訪問修飾符(如public、private、protected)進行訪問控制,以控制其可見性。而局部變量不能使用訪問修飾符,它們的可見性僅限于其所在的作用域內(nèi)。

  • 內(nèi)存分配:成員變量在對象創(chuàng)建時分配內(nèi)存空間,每個對象都有一份成員變量的拷貝。而局部變量在方法調(diào)用或代碼塊執(zhí)行時分配內(nèi)存空間,每次調(diào)用或執(zhí)行都會創(chuàng)建一個新的局部變量。

需要注意的是,成員變量和局部變量可以同名,但在同一作用域內(nèi),局部變量會覆蓋同名的成員變量。如果需要訪問成員變量,可以使用關(guān)鍵字"this"來引用當前對象的成員變量。

總結(jié)

到此這篇關(guān)于Java中類與對象的文章就介紹到這了,更多相關(guān)Java中類與對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解MyBatis特性之動態(tài)SQL

    詳解MyBatis特性之動態(tài)SQL

    動態(tài) SQL 是 MyBatis 的強大特性之一,這篇文章我們將結(jié)合動態(tài)SQL完成更加復(fù)雜的 SQL 操作,文章通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 如何使用Gradle實現(xiàn)類似Maven的profiles功能

    如何使用Gradle實現(xiàn)類似Maven的profiles功能

    這篇文章主要介紹了如何使用Gradle實現(xiàn)類似Maven的profiles功能,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • SpringCloud實現(xiàn)Redis在各個微服務(wù)的Session共享問題

    SpringCloud實現(xiàn)Redis在各個微服務(wù)的Session共享問題

    Redis是運行在內(nèi)存中,查取速度很快。本文重點給大家介紹SpringCloud實現(xiàn)Redis在各個微服務(wù)的Session共享,感興趣的朋友一起看看吧
    2018-08-08
  • Java?NIO中四大核心組件的使用詳解

    Java?NIO中四大核心組件的使用詳解

    Java?NIO(New?IO)是Java?1.4版本中引入的一套全新的IO處理機制,而NIO提供了四個核心組件:Channel、Buffer、Selector和SelectionKey,本文就來簡單講講這四大組件的使用吧
    2023-05-05
  • Java如何實現(xiàn)圖片裁剪預(yù)覽功能

    Java如何實現(xiàn)圖片裁剪預(yù)覽功能

    通常注冊賬戶上傳用戶圖像時需要進行預(yù)覽,這篇文章就是教我們?nèi)绾斡?Java 實現(xiàn)圖片裁剪預(yù)覽功能,需要的朋友可以參考下
    2015-07-07
  • Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置

    Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置

    Hutool是一個Java基礎(chǔ)工具類,對文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時時間配置的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring Boot整合Spring Data Jpa代碼實例

    Spring Boot整合Spring Data Jpa代碼實例

    這篇文章主要介紹了Spring Boot整合Spring Data Jpa代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • java8中Map的一些騷操作總結(jié)

    java8中Map的一些騷操作總結(jié)

    這篇文章主要給大家介紹了關(guān)于java8中Map的一些騷操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • k8s解決java服務(wù)下載超時問題小結(jié)

    k8s解決java服務(wù)下載超時問題小結(jié)

    我們在走ingress的java程序的時候,往往會有導(dǎo)出數(shù)據(jù)的功能,這個時候就會有因網(wǎng)絡(luò)慢、后臺處理時間過長導(dǎo)致下載超時,也有因下載文件太大,導(dǎo)致下載失敗,下面給分享k8s解決java服務(wù)下載超時問題,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • tio-boot整合hotswap-classloader實現(xiàn)熱加載方法實例

    tio-boot整合hotswap-classloader實現(xiàn)熱加載方法實例

    這篇文章主要為大家介紹了tio-boot整合hotswap-classloader實現(xiàn)熱加載方法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論