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

Java雜談之類和對象 封裝 構造方法以及代碼塊詳解

 更新時間:2021年09月26日 17:25:16   作者:愛內卷的王同學  
在現(xiàn)實世界中,真實存在的東西,比如吉普車,卡丁車,貨車。我們在認識它的時候就會在腦海中將它抽象為一種類別叫做車。 好了,那再計算機世界中,它同樣的也會這樣做

Java當中的類和對象

1. 類和對象的初步認知

java 是一門面向對象的語言,所謂面向對象有別于面向過程,面向對象是只需對象之間的交互即可完成任務,但是面向過程的話,需要我們將每一個步驟都詳細地做出來。比如,以洗衣服為例,如果是面向過程來襲衣服,那么我們首先需要衣服,然后放入盆中,之后加水,放洗衣粉,最后搓揉。但是如果面向對象的話,第一步只需要找對象,找出衣服,洗衣粉,洗衣機,水這些對象,然后全部放到洗衣機里面就行了。這就是對象之間的交互。

java 當中的類是對象的綜合,大打個比方,對象是房子,那么類就是設計圖紙,每一個對象都是類具體的個體。

2. 類的實例化

總之,通過上面的分析,我們不難得出這樣的結論:類似對象的統(tǒng)稱,對象就是這個類的具體化實例,一個類可以產生無數個對象。那么但我在寫代碼的是就要進行類的實例化,即從類(也就是模板)中抽出一個具體的對象(相當于實物)。

基本語法:

//創(chuàng)建類
class <class_name> {
    field;//屬性
    method;//成員方法
}
//實例化一個對象
<class_name> <對象名> = new <class_name>();

class 為定義類的關鍵字,ClassName 為類的名字,{}中為類的主體。(注意:java的類的命名是使用大駝峰,此處附上 java 組成部分的命名規(guī)則)

fdzf7F.md.jpg

在類中 但是在成員方法外面 的元素可以稱其為:字段 / 屬性 / 成員變量(三種皆可)。

類中的函數稱為:成員方法。

類的實例化方法:

class Person {
    public int age; //字段
    public String name;
    public String sex;
    public void eat() { //方法
        system.out.println("吃飯");
    }
    public void sleep() {
        system.out.println("睡覺");
    }
}

3. 類的成員

fT3WL9.jpg

字段(屬性/成員變量)

class Person { //創(chuàng)建一個類
    public String name; //成員變量
    public int age;
    public void eat() {
        int a = 0;//局部變量
        System.out.println("吃飯");
    }
}
class Test { //創(chuàng)建一個類
    public static void main(String[] args) {//主函數
        Person person = new person();
        //實例化出來一個具體對象
        System.out.println(person.name);//打印出來
        System.out.println(person.age);
        person.eat();
    }
}
//執(zhí)行結果
null
0

注意事項:

  • 如上圖的第 13 行和第 14 行代碼,使用點號可以訪問實例化對象里面的字段
  • 如果成員變量沒有賦初始值

那么引用類型默認是 NULL,基本類型默認是0

如果是boolean類型的,默認是false

如果是char 類型的,默認是 “\u0000”(其實就是空)

  • 訪問既包含了讀也包含了寫,讀,即可以用點號找到成員變量 ,寫,即可以給他賦值(本人認為這是一句廢話,但是教科書看到了就bb一句)
  • 此外,如果將引用設為null 那么后面再用點號來引用的話就會發(fā)生空指針異常,代碼就會報錯。(如下圖所示)

fseKmT.md.jpg

fseRnf.md.jpg

  • 第 11 行實例化時person 是一個引用變量,此時會在計算機的??臻g里面開辟一塊空間用于存放 person,在堆上開辟一塊空間用于存放對象,person 引用的就是 ??臻g上面的對象。
  • 同樣地,第五行中的 a 因為它處在函數之中所以說它是一個局部變量,所以它是被存到了??臻g當中的。

在這里插入圖片描述

方法

java 中的方法說白了就是函數,本質上就是 對象做出的一種行為

class Person {
    public int age = 18;
    public String name = "張三";
    public void show() {
        System.out.println("我叫 + name,今年 + age + 歲");
    }
}
class test {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}

如上,就是說張三這個對象他有一個要執(zhí)行的動作叫做 show

但是若想要想創(chuàng)建一個其他對象,再用show打印的話,需要 person 用點號來引用類里面的相關屬性

Person person2 = new Person();
person2.name = "李四";
person2.age  = 20;
person2.show();

但是要注意的是,此處的代碼最上面 那個Person 類在示例化的時候就已經給成員變量賦初值了,這其實是不對的,因為上面已經說過了,類其實是一切對象的總和,他是不可以這樣被具體化的(簡單來講其實就是不可能所有人都叫張三)。

注意事項:在真正開發(fā)的時候我們總不可能每當要打印的時候都去寫show 函數的,所以是有快捷方法的,那就是 toString 方法,鼠標右鍵點擊一下找到generate 點擊之后然后就會跳轉,之后就可以找到了。

其實原理就是 println 的打印酒氣本源其實是調用了一個叫做 object 的類 里面的 toString 方法,這里我們的操作就是重寫該方法,這樣改完之后下面的代碼再用 println 打印的時候就可以直接打出我們想要的效果了。

fstcm4.jpg

如上圖兩處紅色的方框便是我們更改的,那么之后每次打印代碼輸出我們想要的效果。如下圖,上面一行是 show()函數輸出的結果,而下面一行是 重寫 toString 輸出的效果

fsNi7j.jpg

fsNBEd.md.jpg

static 關鍵字

(static 可以修飾的有:字段、方法、代碼塊、類)

被 static 修飾的東西不需要實例化對象,用對象去點xx 來訪問,他是可以直接用類名點xx 來訪問。

修飾字段

靜態(tài)的成員變量(或稱:類變量)是獨立放在方法區(qū)的,只有一份,以下面的例題為例

class TestDemo{
   public int a;
   public static int count;
}
public class Main{
   public static void main(String[] args) {
   TestDemo t1 = new TestDemo();
   t1.a++;
   TestDemo.count++;
   System.out.println(t1.a);
   System.out.println(TestDemo.count);
   System.out.println("============");
   t2 = new TestDemo();
   t2.a++;
   TestDemo.count++;
   System.out.println(t2.a);
   System.out.println(TestDemo.count);
  }
}

fsvZv9.jpg

所以由a 和count 的存儲方式就可以很容易得出答案,每當我們新實例化一個對象,a 就會隨之重創(chuàng),所以a 是會變的,但是 count只有一份,只存于方法區(qū),所以 當重新 new 一個對象的時候,count 會繼承上一次的值。

修飾方法

  • 靜態(tài)方法還是開辟棧幀的
  • 靜態(tài)方法是可以直接被調用的,不需要像普通方法那樣想實例化對象再用對象來引用。也因此主函數的前面是要加 static的 ,因為static 是可以讓主函數直接通過jvm 來調用的,如果不用這種方式的話那么將必須在主函數里面 new 一個對象,讓對象來調用主函數,但是主函數目前的問題是,new 對象必須在主函數里面,但問題是我現(xiàn)在主函數進都進不來,要想進來就必須調用主函數,要調用就必須在主函數里面 new 對象,很明顯,這是一個自相矛盾的事情,要想解決這個矛盾就必須給主函數加上 static。
  • 非靜態(tài)方法可以直接調用靜態(tài)方法和非靜態(tài)方法(就是直接在其內部寫上函數名加括號就代表調用),但是靜態(tài)方法不可直接調用非靜態(tài)方法,能直接調用的只有靜態(tài)方法,也就是說主函數要想直接調用其他方法,那就必須要讓其他函數加上 static ,不然的話還要再創(chuàng)建對象,就很麻煩。

修飾代碼塊(暫不講)

修飾類(暫不講)

4. 封裝

本質上是使用private 和 public 和這兩個關鍵字來實現(xiàn)函數的封裝。因為我們之前寫的代碼都是就直接用 public 來修飾的,這樣的,我們就必須要特地去了解類里面的情況,這會讓代碼寫起來非常麻煩,并且如果類的創(chuàng)建者篡改了原來類里面成員變量的名字,那么后面的代碼也要跟著改,安全系數很低。所以只要我們用 private 來封裝成員變量,讓使用者不能直接和成員變量產生聯(lián)系,而是和類里面的函數產生聯(lián)系。如果成員變量產生變更,類的調用者不需要做出任何修改。

總而言之,當被 private 修飾之后它的權限就被降低了,只能在當前類里面使用。被 private 修飾的只能用類名來引用。

  • getter 和 setter

但是當我們修改自己的封裝的字段的時候,不可能每次都把 getName()和setName ()寫出來,所以就可以直接使用快捷的方式,鼠標右擊 選中generate 再選中 自己要操作的項即可。(以下為示例),還有 this 表示當前所在對象的引用。

f2oHRH.jpg

5. 構造方法

構造方法特點:沒有返回值,方法的名字和類名是相同的。

//以下為一個無參數的構造方法示例
public Person() {
    
}

構造方法的作用是用來初始化對象的,即在對象還未創(chuàng)建的時候為對象的成員變量賦初值,因為對象的創(chuàng)建是要分兩步走的,先為對象分配內存,再為對象分配合適的構造方法,也就是說當我們想要在構造方法當中提前給對象賦值的時候是可以用 this的,而且由于 this 本質上是在對象創(chuàng)建后 jvm 給該對象分配的相應的指針,但是也正是也因為this 可以在構造函數之中使用(此時的對象還沒有完全創(chuàng)建好)這就可以說明 this 其實是對象的引用,并非對象本身。

在我們實例化對象的時候,編譯器會默認攜帶一個無參數構造方法,但是如果同一個類里面已經有了其他構造方法,那么就不會自動攜帶這種方法。以下三段代碼皆為構造方法,并且他們的關系是重載。

fWAS3Q.jpg

6. this 用法

this. 成員變量

this. 成員方法

this ( ) 用 this 來調用構造函數,構造函數里面有幾個參數 this 的括號里面就有幾個參數(注意,this 調用構造方法必須放在第一行)

另外,之所以說 this 是一個引用對象而不是對象是因為,對象的產生要分兩步走,第一步是為對象分配內存,第二步是調用合適的構造方法,這兩步完成了之后才能說我們的對象被創(chuàng)建了,但是,如果說我們的 this 在一個構造方法之中創(chuàng)建的,就可以很明顯看出 this 不是對象而是引用對象,因為此時的 this 還在構造函數的代碼中,也就是說 this 使用時構造函數對象還沒有被創(chuàng)建出來,所以說這個時候的 this 僅僅只是對象的引用。
大多數時候類里面使用 this 的時候,對象還沒有被創(chuàng)建出來,這里的 this 就是當前類的對象的引用。

此外,靜態(tài)方法當中不能出現(xiàn) this (靜態(tài)只能靠類名來引用)。

關于引用的幾個注意事項:

  • 引用是否只能存在于棧上?

答:不一定,因為當你在類里面創(chuàng)建一個成員變量是數組的時候,在你的對象實例化之后,數組的那個引用變量就會被放到對象上面,但是數組的引用變量本質上還是引用它會指向自己數組里面的元素的。

class Person {
    private String name;
    private int age;
    private int[] elem = new int[10];
}//以下為原理圖

ffhwWQ.jpg

  • 引用可以指向引用嗎?

答:不可以,引用只能指向對象。

Person person = new person();
person1 = new person();
person1 = new person();
person1 = new person();
person1 = new person();

從上面這串代碼可以明顯看出,person1 這個引用指向的對象一再被賦予新的對象,但是盡管如此這并不意味著 person1 就同時指向了多個對象,最終有效的對象只有第五行,也就是說,person1 指向了第五行的那個對象,其他的都沒用了。

一個引用被賦值null 代表它不指向任何對象

person = null;//示例

7. 代碼塊

代碼塊分為

  • 本地代碼塊(定義在方法里面的)//非重點
  • 實例代碼塊(構造代碼塊)
{
    this.age = 19;
}//用于初始化成員變量
  • 靜態(tài)代碼塊
static {
    
}//用于提請準備數據
  • 同步代碼塊(暫不講)

在程序執(zhí)行的時候,執(zhí)行順序為:靜態(tài)代碼塊先執(zhí)行(即便放在最后面也是如此),之后實例代碼塊再執(zhí)行,最后執(zhí)行構造方法。還有,就是在一個類之中,靜態(tài)的代碼只執(zhí)行一次。

并且當一段代碼之中只有相同類型的,就會安從上往下的順序執(zhí)行。例如,如果一個類之中既有靜態(tài)的字段,又有靜態(tài)代碼塊,那么誰在前面,誰先執(zhí)行。
(構造代碼塊)

{
    this.age = 19;
}//用于初始化成員變量
  • 靜態(tài)代碼塊
static {
    
}//用于提前準備數據
  • 同步代碼塊(暫不講)

在程序執(zhí)行的時候,執(zhí)行順序為:靜態(tài)代碼塊先執(zhí)行(即便放在最后面也是如此),之后實例代碼塊再執(zhí)行,最后執(zhí)行構造方法。還有,就是在一個類之中,靜態(tài)的代碼只執(zhí)行一次。

并且當一段代碼之中只有相同類型的,就會安從上往下的順序執(zhí)行。例如,如果一個類之中既有靜態(tài)的字段,又有靜態(tài)代碼塊,那么誰在前面,誰先執(zhí)行。

到此這篇關于Java雜談之類和對象 封裝 構造方法以及代碼塊詳解的文章就介紹到這了,更多相關Java 類與對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java使用zookeeper實現(xiàn)的分布式鎖示例

    java使用zookeeper實現(xiàn)的分布式鎖示例

    這篇文章主要介紹了java使用zookeeper實現(xiàn)的分布式鎖示例,需要的朋友可以參考下
    2014-05-05
  • Java讀取properties配置文件的8種方式匯總

    Java讀取properties配置文件的8種方式匯總

    讀取.properties配置文件在實際的開發(fā)中使用的很多,總結了一下,下面這篇文章主要給大家介紹了關于Java讀取properties配置文件的8種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • springboot集成普羅米修斯(Prometheus)的方法

    springboot集成普羅米修斯(Prometheus)的方法

    這篇文章主要介紹了springboot集成普羅米修斯(Prometheus)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 一篇文章超詳細的介紹Java繼承

    一篇文章超詳細的介紹Java繼承

    Java中的繼承是一種機制,表示為一個對象獲取父對象的所有屬性和行為,下面這篇文章主要給大家介紹了關于Java繼承的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • 由淺到深帶你詳談Java實現(xiàn)數組擴容的三種方式

    由淺到深帶你詳談Java實現(xiàn)數組擴容的三種方式

    這篇文章主要詳細介紹了Java實現(xiàn)數組擴容的三種方式,新建一個數組,把原來數組的內容搬到新數組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價值,需要的朋友可以借鑒一下
    2023-06-06
  • SpringCloud的Config配置中心詳解

    SpringCloud的Config配置中心詳解

    這篇文章主要介紹了SpringCloud的Config配置中心詳解,SpringCloud Config為微服務架構中的微服務提供集中化的外部配置支持,配置服務器為各個不同微服務應用的所有環(huán)境提供了一個中心化的外部配置,需要的朋友可以參考下
    2023-07-07
  • Java 遍歷 String 字符串所有字符的操作

    Java 遍歷 String 字符串所有字符的操作

    這篇文章主要介紹了Java 遍歷 String 字符串所有字符的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 解決IDEA報錯war?exploded?is?not?valid問題

    解決IDEA報錯war?exploded?is?not?valid問題

    在使用IntelliJ?IDEA時遇到'[projectname]warexploded'無效的問題,可以通過清除項目列表、重新導入項目和配置新的Tomcat來解決,確保在Tomcat配置中,將ApplicationContext修改為僅包含一個'/',這一方法或許能幫助遇到相似問題的開發(fā)者
    2024-09-09
  • Springboot jar運行時如何將jar內的文件拷貝到文件系統(tǒng)中

    Springboot jar運行時如何將jar內的文件拷貝到文件系統(tǒng)中

    因為執(zhí)行需要,需要把jar內templates文件夾下的的文件夾及文件加壓到宿主機器的某個路徑下,以便執(zhí)行對應的腳本文件,這篇文章主要介紹了Springboot jar運行時如何將jar內的文件拷貝到文件系統(tǒng)中,需要的朋友可以參考下
    2024-06-06
  • 使用MyBatis查詢千萬級數據量操作實現(xiàn)

    使用MyBatis查詢千萬級數據量操作實現(xiàn)

    這篇文章主要為大家介紹了如何使用MyBatis?查詢千萬數據量的操作過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論

昔阳县| 绍兴县| 宜春市| 昌江| 邯郸县| 克什克腾旗| 富顺县| 策勒县| 龙海市| 莱西市| 同江市| 盐城市| 天津市| 广宁县| 宜昌市| 阜宁县| 精河县| 汕头市| 公主岭市| 霍山县| 台南市| 凭祥市| 图们市| 会昌县| 连云港市| 桐柏县| 宣化县| 德保县| 武乡县| 高要市| 陵水| 诸城市| 寿阳县| 定安县| 临西县| 铜鼓县| 巴青县| 山西省| 利辛县| 咸丰县| 哈巴河县|