一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java雜談之類和對象 封裝 構造方法以及代碼塊詳解

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

2022-01-19 10:57愛內卷的王同學 Java教程

在現實世界中,真實存在的東西,比如吉普車,卡丁車,貨車。我們在認識它的時候就會在腦海中將它抽象為一種類別叫做車。 好了,那再計算機世界中,它同樣的也會這樣做

Java當中的類和對象

 

1. 類和對象的初步認知

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

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

 

2. 類的實例化

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

基本語法:

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

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

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

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

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

類的實例化方法:

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

 

3. 類的成員

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

字段(屬性/成員變量)

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

注意事項:

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

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

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

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

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

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

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

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

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

方法

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();
  }
}

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

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

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

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

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

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

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

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

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

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

static 關鍵字

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

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

修飾字段

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

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);
}
}

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

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

修飾方法

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

修飾代碼塊(暫不講)

修飾類(暫不講)

 

4. 封裝

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

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

  • getter 和 setter

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

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

 

5. 構造方法

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

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

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

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

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

 

6. this 用法

this. 成員變量

this. 成員方法

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

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

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

 

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

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

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

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

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

  • 引用可以指向引用嗎?

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

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;
}//用于初始化成員變量
  • 靜態代碼塊
static {
  
}//用于提請準備數據
  • 同步代碼塊(暫不講)

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

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

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

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

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

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

原文鏈接:https://blog.csdn.net/qq_54693675/article/details/119785230

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
主站蜘蛛池模板: 国产第一综合另类色区奇米 | 四虎永久在线精品波多野结衣 | 国内精品91最新在线观看 | 美女用手扒开粉嫩的屁股 | 午夜精品久视频在线观看 | 91视在线国内在线播放酒店 | 久久视频在线视频观看精品15 | 色小孩导航 | 91欧美秘密入口 | 免费一级欧美片片线观看 | 91精品国产高清久久久久久io | 欧美一级视频免费观看 | 久久艹综合 | 好大好硬好深好爽gif图 | 日产中文乱码卡一卡二 | 黄动漫软件车车好快的车车 | 国产一级一级片 | 色综色天天综合网 | 天仙tv微福视频 | 欧美日韩国产成人综合在线影院 | 亚洲久草在线 | 人人人人看人人人做人人 | 青青草在观免费 | 日本美女动态图片 | 精品视频在线免费 | 日韩欧美一区二区三区免费观看 | 青青久久精品国产 | 好深快点再快点好爽视频 | 精品国产中文字幕在线视频 | 精品国产一区二区三区久久久蜜臀 | 大陆国产精品视频 | 久久99精品久久久久久园产越南 | 成人18视频在线观看 | 鄂州一家三口完整版免费 | 国产新疆成人a一片在线观看 | bnb99八度免费影院 | 欧美日韩成人在线视频 | 免费网站看v片在线成人国产系列 | 国产一区二区免费在线 | h肉动漫在线视频无修无遮挡 | 亚洲午夜久久久 |