最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?超詳細講解對象的構造及初始化

 更新時間:2022年03月31日 09:24:20   作者:Gremmie102  
面向對象乃是Java語言的核心,是程序設計的思想。Java語言的面向對象技術包括了面向對象和面向過程的基本概念,面向對象的特征,Java語言的類,對象,修飾符,抽象類等一系列的知識點

如何初始化對象

我們知道再Java方法內部定義一個局部變量的時候,必須要初始化,否則就會編譯失敗

image.png

要讓這串代碼通過編譯,很簡單,只需要在正式使用a之前,給a設置一個初始值就好
那么對于創(chuàng)造好的對象來說,我們也要進行相對應的初始化
我們先寫一個Mydate的類

public class MyDate {

    public int year;
    public int month;
    public int day;

    /**
     * 設置日期:
     */
    public void setDate(int year,int month,int day) {
        this.year = year;
        this.month = month ;
        this.day = day;
    }

    public void printDate() {
        System.out.println("年:"+this.year+"月:"+this.month+"日:"+this.day);
    }
   public static void main(String[] args) {

        // this.printDate();

        MyDate myDate = new MyDate();

        myDate.setDate(2022,3,25);

        myDate.printDate();

        MyDate myDate2 = new MyDate();

        myDate2.setDate(2022,3,28);
        myDate2.printDate();

    }
}

我們可以看到,在Mydate類中,要在調用之前實現(xiàn)寫好setDate才能將具體的日期設置到對象當中

image.png

我們通過這個例子就可以發(fā)現(xiàn)兩個問題:

  • 每次對象創(chuàng)建好之后調用setDate方法設置具體時期,比較麻煩,那么對象該如何初始化呢?
  • 局部變量必須要初始化之后才能使用,那么為什么字段聲明之后沒有給初值,它依舊可以使用呢?

答案:

  • 我們可以運用構造函數(shù)來進行初始化
  • 因為這里和main函數(shù)中定義的局部變量不同,編譯器會自動為你的字段聲明的局部變量賦初始零值。

構造方法

當我們實例化一個對象的時候:必須會有這兩步,但并不是一定只有這兩步

  • 為對象分配內存
  • 調用合適的構造方法

構造方法(也稱為構造器)是一個特殊的成員方法,名字必須與類名相同,在創(chuàng)建對象的時候,由編譯器自動調用,并且在整個對象的生命周期內只調用一次

class Person {
    public String name;
    public int age;

    //構造方法:
    //名字與類名相同,且沒有返回值類型,void也不行
    //一般情況下使用public修飾
    //在創(chuàng)建對象的時候由編譯器自動調用,并且在對象的聲明周期內只調用一次
    public Person(String name,int age){
        this.name = name;
        this.age = age;
        System.out.println("構造方法被調用了")
    }
    public void eat() {
        System.out.println("吃飯!");
    }

    public void sleep() {
        System.out.println("睡覺!");
    }
    public static void main(String[] args){
        //在此處創(chuàng)建了一個Date類型的對象,并沒有顯式調用構造函數(shù)
        Person p = new Person("xiaohong",18);
        p.eat();
    } 
}

??:構造方法的作用就是對對象中的成員進行初始化,并不負責給對象開辟空間

image.png

特性

  • 名字必須和類名相同
  • 沒有返回值類型,void也不行
  • 創(chuàng)建對象時由編譯器自動調用,并且在對象的生命周期內只調用一次(相當于人的出生)
  • 構造方法可以重載(用戶根據自己的需求提供不同參數(shù)的構造方法)
class Student {
    //屬性:成員變量-》類的內部  方法的外部的
    public String name;
    public int age;
    public double score ;
    public String sex;


    public Student() {
        //調用本類中   帶有2個參數(shù)的構造方法,第一個參數(shù)的類型是String,第2個參數(shù)的類型是int
        this.age = 18;
        System.out.println("這個是不帶參數(shù)的構造方法!");
    }

    public Student(String name,int age) {
        //this();
        this.age = age;
        this.name = name;
        System.out.println("這個是帶2個參數(shù)的構造方法!");
    }

    public Student(String name, int age, double score, String sex) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.sex = sex;
        System.out.println("帶4個參數(shù)的構造方法!");
    }

    public void doClass() {
        System.out.println(name+"正在上課!");
        //this.doHomeWork();
    }
    public void doHomeWork(){
        System.out.println(name+"正在寫作業(yè)");
    }

    public void show() {
        System.out.println("姓名:"+name+" 年齡:"+age+" 學分:"+score+" 性別:"+sex);
    }
}
//重載的時候

上述方法中:名字相同,參數(shù)列表不同,因此構成了方法重載
如果用戶沒有顯式定義,編譯器會生成一份默認的構造方法,生成的默認構造方法一定是無參的。

class MyGirlFired {
    public String name;
    public int age;
    public String eyes;

    public void eat() {
        System.out.println("吃火鍋!");
    }
}

在上面的代碼中,沒有定義任何構造方法,編譯器就會默認為我們生成一個不帶參數(shù)的構造方法
??:一旦用戶定義了,編譯器則不再生成任何構造函數(shù)

image.png

class MyGirlFired {
    public String name;
    public int age;
    public String eyes;

    public MyGirlFired(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void eat() {
        System.out.println("吃火鍋!");
    }

    public static void main(String[] args) {
        //如果編譯器會生成,則生成的構造方法一定是無參數(shù)的
        //則此處創(chuàng)建對象是可以通過編譯的
        //但實際上會報錯
        MyGirlFired xHong = new MyGirlFired();
    }
}

image.png

在構造方法中,可以通過this調用其他構造方法來簡化代碼

class Student {
    //屬性:成員變量-》類的內部  方法的外部的
    public String name;
    public int age;
    public double score ;
    public String sex;


    public Student() {
        //調用本類中   帶有2個參數(shù)的構造方法,第一個參數(shù)的類型是String,第2個參數(shù)的類型是int
        this("yumi",18);
        //this("bit3",99,98.9,"女");
        System.out.println("這個是不帶參數(shù)的構造方法!");
    }

    public Student(String name,int age) {
        //this();
        this.age = age;
        this.name = name;
        System.out.println("這個是帶2個參數(shù)的構造方法!");
    }

    public Student(String name, int age, double score, String sex) {
        this.name = name;
        this.age = age;
        this.score = score;
        this.sex = sex;
        System.out.println("帶4個參數(shù)的構造方法!");
    }

    public void doClass() {
        System.out.println(name+"正在上課!");
        //this.doHomeWork();
    }
    public void doHomeWork(){
        System.out.println(name+"正在寫作業(yè)");
    }

    public void show() {
        System.out.println("姓名:"+name+" 年齡:"+age+" 學分:"+score+" 性別:"+sex);
    }
}

??注意:

  • this()必須是構造方法中的第一條語句,且只能放在構造函數(shù)中
  • 不能形成“環(huán)”

例如

image.png

絕大多數(shù)情況我們都用public來修飾,特殊場景下會被private修飾

默認初始化

上面我們提到了一個問題:為什么局部變量在使用時必須要用初始化,而成員變量可以不用呢?

public class Date {
    public int year;
    public int month;
    public int day;
    
    public Date(int year,int month,int day){
        //成員變量在定義之前,并沒有給出初始值,那為什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }

    public static void main(String[] args) {
        //此處a并沒有初始化,編譯器報錯;
        //Error:(24,28)Java:可能尚未初始化變量a
        //int a;
        //System.out.println(a);
        Date d = new Date(2022,3,29);
    }
}

image.png

要搞清楚這個過程,我們需要知道new關鍵字背后所發(fā)生的一些事情

Date d = new Date(2021,6,9);

在程序層面只是簡單的一條語句,而在JVM層面則需要做好多事情

  • 檢測對象對應的類是否加載了,如果沒有加載則加載
  • 為對象分配內存空間
  • 處理并發(fā)安全問題

??比如:多個線程同時申請對象,JVM要保證給對象分配的空間不沖突

  • 初始化所分配的空間

即:對象空間被申請好了之后,對象中包含的成員已經設置好了初始值

image.png

數(shù)據類型默認值
byte0
char‘\u0000’
short0
int0
long0L
booleanfalse
float0.0f
double0.0
referencenull
  • 設置對象頭信息(關于對象內存模型后面再說)
  • 調用構造方法,是給對象中的各個成員賦值

就地初始化

在聲明成員變量時,就直接給出了初始值

public class Date {
    public int year;
    public int month;
    public int day;

    public Date(){
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }
    public Date(int year,int month,int day){
        //成員變量在定義之前,并沒有給出初始值,那為什么就可以使用呢?
        System.out.println(this.year);
        System.out.println(this.month);
        System.out.println(this.day);
    }

    public static void main(String[] args) {
        //此處a并沒有初始化,編譯器報錯;
        //Error:(24,28)Java:可能尚未初始化變量a
        //int a;
        //System.out.println(a);
        Date d1 = new Date(2022,3,29);
        Date d2 = new Date();
    }
}

//運行結果:
//0
//0
//0
//0
//0
//0

??注意:代碼編譯完成之后,編譯器會將所有成員初始化的這些語句添加到各個構造函數(shù)中

image.png

image.png

5.一個類至少會有1個構造函數(shù),就算你沒有寫!
6.構造方法 本質 就是來實例化對象的時候調用
(1)分配內存
(2)調用合適的構造方法
7.this可以用來調用本類中的其他構造方法【構造方法當中使用】
且必須放在第一行!所以,只能在當前構造方法當中,調用一次
8.this的用法:

  • this.data 訪問屬性
  • this.func(); 訪問方法
  • this(); //用來調用本類中的其他構造方法

9.this不能形成環(huán)。

有錯誤請大家批評指正
感謝閱讀

到此這篇關于Java 超詳細講解對象的構造及初始化的文章就介紹到這了,更多相關Java 對象的構造內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring Cloud與分布式系統(tǒng)簡析

    Spring Cloud與分布式系統(tǒng)簡析

    這篇文章主要介紹了Spring Cloud與分布式系統(tǒng)的相關內容,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • Java數(shù)據結構之快速冪的實現(xiàn)

    Java數(shù)據結構之快速冪的實現(xiàn)

    快速冪是用來解決求冪運算的高效方式。本文將詳細為大家介紹如何利用Java實現(xiàn)快速冪,以及利用快速冪求解冪運算問題,需要的可以參考一下
    2022-03-03
  • SpringBoot靜態(tài)資源的訪問方法詳細介紹

    SpringBoot靜態(tài)資源的訪問方法詳細介紹

    最近在做SpringBoot項目的時候遇到了“白頁”問題,通過查資料對SpringBoot訪問靜態(tài)資源做了總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • 如何使用spring-ws發(fā)布webservice服務

    如何使用spring-ws發(fā)布webservice服務

    文章介紹了如何使用Spring-WS發(fā)布Web服務,包括添加依賴、創(chuàng)建XSD文件、生成JAXB實體、配置Endpoint、啟動服務等步驟,結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • JAVA初級項目——實現(xiàn)圖書管理系統(tǒng)

    JAVA初級項目——實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要介紹了JAVA如何實現(xiàn)圖書管理系統(tǒng),文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • java數(shù)據結構與算法之插入算法實現(xiàn)數(shù)值排序示例

    java數(shù)據結構與算法之插入算法實現(xiàn)數(shù)值排序示例

    這篇文章主要介紹了java數(shù)據結構與算法之插入算法實現(xiàn)數(shù)值排序的方法,結合簡單實例形式分析了插入算法的節(jié)點操作與排序相關實現(xiàn)技巧,需要的朋友可以參考下
    2016-08-08
  • Android 判斷真機和模擬器的方法

    Android 判斷真機和模擬器的方法

    這篇文章主要介紹了 Android 判斷真機和模擬器的方法的相關資料,需要的朋友可以參考下
    2017-02-02
  • Mybatis條件if test如何使用枚舉值

    Mybatis條件if test如何使用枚舉值

    這篇文章主要介紹了Mybatis條件if test如何使用枚舉值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 淺談Java循環(huán)中的For和For-each哪個更快

    淺談Java循環(huán)中的For和For-each哪個更快

    本文主要介紹了淺談Java循環(huán)中的For和For-each哪個更快,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • SpringTask-Timer實現(xiàn)定時任務的詳細代碼

    SpringTask-Timer實現(xiàn)定時任務的詳細代碼

    在項目中開發(fā)定時任務應該一種比較常見的需求,今天通過示例代碼給大家講解SpringTask-Timer實現(xiàn)定時任務的相關知識,感興趣的朋友一起看看吧
    2024-06-06

最新評論

南澳县| 尚义县| 张掖市| 汉中市| 镇安县| 商丘市| 民和| 乌鲁木齐县| 台南县| 大埔区| 大理市| 临潭县| 广水市| 房产| 澄江县| 大余县| 河间市| 桦南县| 瓮安县| 集贤县| 武宁县| 板桥市| 湟中县| 通道| 奉贤区| 紫金县| 澄江县| 博罗县| 盱眙县| 金乡县| 丹棱县| 巩留县| 满城县| 贵州省| 平昌县| 武清区| 监利县| 西乡县| 石景山区| 贺州市| 饶阳县|