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

Java?超詳細(xì)講解對(duì)象的構(gòu)造及初始化

 更新時(shí)間:2022年03月31日 09:24:20   作者:Gremmie102  
面向?qū)ο竽耸荍ava語言的核心,是程序設(shè)計(jì)的思想。Java語言的面向?qū)ο蠹夹g(shù)包括了面向?qū)ο蠛兔嫦蜻^程的基本概念,面向?qū)ο蟮奶卣?,Java語言的類,對(duì)象,修飾符,抽象類等一系列的知識(shí)點(diǎn)

如何初始化對(duì)象

我們知道再Java方法內(nèi)部定義一個(gè)局部變量的時(shí)候,必須要初始化,否則就會(huì)編譯失敗

image.png

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

public class MyDate {

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

    /**
     * 設(shè)置日期:
     */
    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類中,要在調(diào)用之前實(shí)現(xiàn)寫好setDate才能將具體的日期設(shè)置到對(duì)象當(dāng)中

image.png

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

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

答案:

  • 我們可以運(yùn)用構(gòu)造函數(shù)來進(jìn)行初始化
  • 因?yàn)檫@里和main函數(shù)中定義的局部變量不同,編譯器會(huì)自動(dòng)為你的字段聲明的局部變量賦初始零值。

構(gòu)造方法

當(dāng)我們實(shí)例化一個(gè)對(duì)象的時(shí)候:必須會(huì)有這兩步,但并不是一定只有這兩步

  • 為對(duì)象分配內(nèi)存
  • 調(diào)用合適的構(gòu)造方法

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

class Person {
    public String name;
    public int age;

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

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

??:構(gòu)造方法的作用就是對(duì)對(duì)象中的成員進(jìn)行初始化,并不負(fù)責(zé)給對(duì)象開辟空間

image.png

特性

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


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

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

    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個(gè)參數(shù)的構(gòu)造方法!");
    }

    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+" 學(xué)分:"+score+" 性別:"+sex);
    }
}
//重載的時(shí)候

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

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

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

在上面的代碼中,沒有定義任何構(gòu)造方法,編譯器就會(huì)默認(rèn)為我們生成一個(gè)不帶參數(shù)的構(gòu)造方法
??:一旦用戶定義了,編譯器則不再生成任何構(gòu)造函數(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) {
        //如果編譯器會(huì)生成,則生成的構(gòu)造方法一定是無參數(shù)的
        //則此處創(chuàng)建對(duì)象是可以通過編譯的
        //但實(shí)際上會(huì)報(bào)錯(cuò)
        MyGirlFired xHong = new MyGirlFired();
    }
}

image.png

在構(gòu)造方法中,可以通過this調(diào)用其他構(gòu)造方法來簡(jiǎn)化代碼

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


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

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

    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個(gè)參數(shù)的構(gòu)造方法!");
    }

    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+" 學(xué)分:"+score+" 性別:"+sex);
    }
}

??注意:

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

例如

image.png

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

默認(rèn)初始化

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

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并沒有初始化,編譯器報(bào)錯(cuò);
        //Error:(24,28)Java:可能尚未初始化變量a
        //int a;
        //System.out.println(a);
        Date d = new Date(2022,3,29);
    }
}

image.png

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

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

在程序?qū)用嬷皇呛?jiǎn)單的一條語句,而在JVM層面則需要做好多事情

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

??比如:多個(gè)線程同時(shí)申請(qǐng)對(duì)象,JVM要保證給對(duì)象分配的空間不沖突

  • 初始化所分配的空間

即:對(duì)象空間被申請(qǐng)好了之后,對(duì)象中包含的成員已經(jīng)設(shè)置好了初始值

image.png

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

就地初始化

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

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并沒有初始化,編譯器報(bào)錯(cuò);
        //Error:(24,28)Java:可能尚未初始化變量a
        //int a;
        //System.out.println(a);
        Date d1 = new Date(2022,3,29);
        Date d2 = new Date();
    }
}

//運(yùn)行結(jié)果:
//0
//0
//0
//0
//0
//0

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

image.png

image.png

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

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

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

有錯(cuò)誤請(qǐng)大家批評(píng)指正
感謝閱讀

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

相關(guān)文章

  • 關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題(又刪庫跑路)

    使用@Transactional一鍵開啟聲明式事務(wù), 這就真的事務(wù)生效了?過于信任框架總有“意外驚喜”。本文通過案例給大家詳解關(guān)于Spring的@Transaction導(dǎo)致數(shù)據(jù)庫回滾全部生效問題,感興趣的朋友一起看看吧
    2021-05-05
  • 精致小巧的java相冊(cè)制作方法

    精致小巧的java相冊(cè)制作方法

    這篇文章主要為大家詳細(xì)介紹了精致小巧的java相冊(cè)制作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java 語言中Object 類和System 類詳解

    Java 語言中Object 類和System 類詳解

    Object 是 Java 類庫中的一個(gè)特殊類,也是所有類的父類。今天通過本文給大家介紹java object類的簡(jiǎn)單概念及常用方法,需要的朋友參考下吧
    2021-07-07
  • Mac M1 Java 開發(fā)環(huán)境配置詳解

    Mac M1 Java 開發(fā)環(huán)境配置詳解

    這篇文章主要介紹了Mac M1 Java 開發(fā)環(huán)境配置詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 詳解Java面向?qū)ο笾械睦^承

    詳解Java面向?qū)ο笾械睦^承

    這篇文章主要介紹了詳解Java面向?qū)ο笾械睦^承,繼承提高代碼的復(fù)用性:通過繼承,子類可以直接使用父類的屬性和方法,不需要重復(fù)定義,需要的朋友可以參考下
    2023-05-05
  • Java實(shí)現(xiàn)獲取行政區(qū)劃的示例代碼

    Java實(shí)現(xiàn)獲取行政區(qū)劃的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)獲取行政區(qū)劃的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)游戲
    2023-03-03
  • 詳細(xì)介紹Spring的配置文件

    詳細(xì)介紹Spring的配置文件

    這篇文章主要為大家詳細(xì)介紹了Spring中的配置文件的命名以及它的配置文件都有些什么。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟上小編一起學(xué)習(xí)一下
    2022-10-10
  • Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)

    Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)

    這篇文章主要給大家介紹了關(guān)于Springboot如何優(yōu)雅地進(jìn)行字段校驗(yàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 詳解Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁并且保存

    詳解Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁并且保存

    本篇文章主要介紹了Java兩種方式簡(jiǎn)單實(shí)現(xiàn):爬取網(wǎng)頁并且保存 ,主要用UrlConnection、HttpClient爬取實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • 使用java代碼代替xml實(shí)現(xiàn)SSM教程

    使用java代碼代替xml實(shí)現(xiàn)SSM教程

    這篇文章主要介紹了使用java代碼代替xml實(shí)現(xiàn)SSM教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論