激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - Java教程 - Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

2022-01-19 10:57愛內(nèi)卷的王同學(xué) Java教程

在現(xiàn)實(shí)世界中,真實(shí)存在的東西,比如吉普車,卡丁車,貨車。我們?cè)谡J(rèn)識(shí)它的時(shí)候就會(huì)在腦海中將它抽象為一種類別叫做車。 好了,那再計(jì)算機(jī)世界中,它同樣的也會(huì)這樣做

Java當(dāng)中的類和對(duì)象

 

1. 類和對(duì)象的初步認(rèn)知

java 是一門面向?qū)ο蟮恼Z言,所謂面向?qū)ο笥袆e于面向過程,面向?qū)ο笫侵恍鑼?duì)象之間的交互即可完成任務(wù),但是面向過程的話,需要我們將每一個(gè)步驟都詳細(xì)地做出來。比如,以洗衣服為例,如果是面向過程來襲衣服,那么我們首先需要衣服,然后放入盆中,之后加水,放洗衣粉,最后搓揉。但是如果面向?qū)ο蟮脑?,第一步只需要找?duì)象,找出衣服,洗衣粉,洗衣機(jī),水這些對(duì)象,然后全部放到洗衣機(jī)里面就行了。這就是對(duì)象之間的交互。

java 當(dāng)中的類是對(duì)象的綜合,大打個(gè)比方,對(duì)象是房子,那么類就是設(shè)計(jì)圖紙,每一個(gè)對(duì)象都是類具體的個(gè)體。

 

2. 類的實(shí)例化

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

基本語法:

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

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

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

類中的函數(shù)稱為:成員方法。

類的實(shí)例化方法:

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雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

字段(屬性/成員變量)

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

注意事項(xiàng):

  • 如上圖的第 13 行和第 14 行代碼,使用點(diǎn)號(hào)可以訪問實(shí)例化對(duì)象里面的字段
  • 如果成員變量沒有賦初始值

那么引用類型默認(rèn)是 NULL,基本類型默認(rèn)是0

如果是boolean類型的,默認(rèn)是false

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

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

  • 第 11 行實(shí)例化時(shí)person 是一個(gè)引用變量,此時(shí)會(huì)在計(jì)算機(jī)的??臻g里面開辟一塊空間用于存放 person,在堆上開辟一塊空間用于存放對(duì)象,person 引用的就是 棧空間上面的對(duì)象。
  • 同樣地,第五行中的 a 因?yàn)樗幵诤瘮?shù)之中所以說它是一個(gè)局部變量,所以它是被存到了棧空間當(dāng)中的。

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

方法

java 中的方法說白了就是函數(shù),本質(zhì)上就是 對(duì)象做出的一種行為

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

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

但是若想要想創(chuàng)建一個(gè)其他對(duì)象,再用show打印的話,需要 person 用點(diǎn)號(hào)來引用類里面的相關(guān)屬性

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

但是要注意的是,此處的代碼最上面 那個(gè)Person 類在示例化的時(shí)候就已經(jīng)給成員變量賦初值了,這其實(shí)是不對(duì)的,因?yàn)樯厦嬉呀?jīng)說過了,類其實(shí)是一切對(duì)象的總和,他是不可以這樣被具體化的(簡(jiǎn)單來講其實(shí)就是不可能所有人都叫張三)。

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

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

static 關(guān)鍵字

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

被 static 修飾的東西不需要實(shí)例化對(duì)象,用對(duì)象去點(diǎn)xx 來訪問,他是可以直接用類名點(diǎn)xx 來訪問。

修飾字段

靜態(tài)的成員變量(或稱:類變量)是獨(dú)立放在方法區(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);
}
}

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

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

修飾方法

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

修飾代碼塊(暫不講)

修飾類(暫不講)

 

4. 封裝

本質(zhì)上是使用private 和 public 和這兩個(gè)關(guān)鍵字來實(shí)現(xiàn)函數(shù)的封裝。因?yàn)槲覀冎皩懙拇a都是就直接用 public 來修飾的,這樣的,我們就必須要特地去了解類里面的情況,這會(huì)讓代碼寫起來非常麻煩,并且如果類的創(chuàng)建者篡改了原來類里面成員變量的名字,那么后面的代碼也要跟著改,安全系數(shù)很低。所以只要我們用 private 來封裝成員變量,讓使用者不能直接和成員變量產(chǎn)生聯(lián)系,而是和類里面的函數(shù)產(chǎn)生聯(lián)系。如果成員變量產(chǎn)生變更,類的調(diào)用者不需要做出任何修改。

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

  • getter 和 setter

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

 

5. 構(gòu)造方法

構(gòu)造方法特點(diǎn):沒有返回值,方法的名字和類名是相同的。

//以下為一個(gè)無參數(shù)的構(gòu)造方法示例
public Person() {
  
}

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

在我們實(shí)例化對(duì)象的時(shí)候,編譯器會(huì)默認(rèn)攜帶一個(gè)無參數(shù)構(gòu)造方法,但是如果同一個(gè)類里面已經(jīng)有了其他構(gòu)造方法,那么就不會(huì)自動(dòng)攜帶這種方法。以下三段代碼皆為構(gòu)造方法,并且他們的關(guān)系是重載。

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

 

6. this 用法

this. 成員變量

this. 成員方法

this ( ) 用 this 來調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)里面有幾個(gè)參數(shù) this 的括號(hào)里面就有幾個(gè)參數(shù)(注意,this 調(diào)用構(gòu)造方法必須放在第一行)

另外,之所以說 this 是一個(gè)引用對(duì)象而不是對(duì)象是因?yàn)椋瑢?duì)象的產(chǎn)生要分兩步走,第一步是為對(duì)象分配內(nèi)存,第二步是調(diào)用合適的構(gòu)造方法,這兩步完成了之后才能說我們的對(duì)象被創(chuàng)建了,但是,如果說我們的 this 在一個(gè)構(gòu)造方法之中創(chuàng)建的,就可以很明顯看出 this 不是對(duì)象而是引用對(duì)象,因?yàn)榇藭r(shí)的 this 還在構(gòu)造函數(shù)的代碼中,也就是說 this 使用時(shí)構(gòu)造函數(shù)對(duì)象還沒有被創(chuàng)建出來,所以說這個(gè)時(shí)候的 this 僅僅只是對(duì)象的引用。
大多數(shù)時(shí)候類里面使用 this 的時(shí)候,對(duì)象還沒有被創(chuàng)建出來,這里的 this 就是當(dāng)前類的對(duì)象的引用。

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

 

關(guān)于引用的幾個(gè)注意事項(xiàng):

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

答:不一定,因?yàn)楫?dāng)你在類里面創(chuàng)建一個(gè)成員變量是數(shù)組的時(shí)候,在你的對(duì)象實(shí)例化之后,數(shù)組的那個(gè)引用變量就會(huì)被放到對(duì)象上面,但是數(shù)組的引用變量本質(zhì)上還是引用它會(huì)指向自己數(shù)組里面的元素的。

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

Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解

  • 引用可以指向引用嗎?

答:不可以,引用只能指向?qū)ο蟆?/p>

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

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

一個(gè)引用被賦值null 代表它不指向任何對(duì)象

person = null;//示例

 

7. 代碼塊

代碼塊分為

  • 本地代碼塊(定義在方法里面的)//非重點(diǎn)
  • 實(shí)例代碼塊(構(gòu)造代碼塊)
{
  this.age = 19;
}//用于初始化成員變量
  • 靜態(tài)代碼塊
static {
  
}//用于提請(qǐng)準(zhǔn)備數(shù)據(jù)
  • 同步代碼塊(暫不講)

在程序執(zhí)行的時(shí)候,執(zhí)行順序?yàn)椋红o態(tài)代碼塊先執(zhí)行(即便放在最后面也是如此),之后實(shí)例代碼塊再執(zhí)行,最后執(zhí)行構(gòu)造方法。還有,就是在一個(gè)類之中,靜態(tài)的代碼只執(zhí)行一次。

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

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

在程序執(zhí)行的時(shí)候,執(zhí)行順序?yàn)椋红o態(tài)代碼塊先執(zhí)行(即便放在最后面也是如此),之后實(shí)例代碼塊再執(zhí)行,最后執(zhí)行構(gòu)造方法。還有,就是在一個(gè)類之中,靜態(tài)的代碼只執(zhí)行一次。

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

到此這篇關(guān)于Java雜談之類和對(duì)象 封裝 構(gòu)造方法以及代碼塊詳解的文章就介紹到這了,更多相關(guān)Java 類與對(duì)象內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

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

延伸 · 閱讀

精彩推薦
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

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

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

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

    小米推送Java代碼

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

    富貴穩(wěn)中求8032021-07-12
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

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

    程序猿DD9332021-10-08
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

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

    Java使用SAX解析xml的示例

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

    大行者10067412021-08-30
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

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

    spcoder14552021-10-18
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
主站蜘蛛池模板: 一级毛片免费高清 | 欧美黄色大片免费观看 | 欧美日韩中文字幕在线视频 | 亚洲日韩精品欧美一区二区 | 精品国产一区二区三区四区阿崩 | 天天操天天骑 | 免费一级高清毛片 | 日韩美香港a一级毛片免费 日韩激情 | 北原夏美av | 欧洲黄色一级视频 | 久久人人爽人人爽人人片av高清 | 欧美一级黄 | a免费看| 九九视屏 | 黄视频在线网站 | 毛片在线免费观看完整版 | 日韩精品久久久久久久电影99爱 | 国产精品视频 | 欧美成人一区在线观看 | 97超视频在线观看 | 91麻豆蜜桃一区二区三区 | 99国产精品国产免费观看 | 欧美一级做一a做片性视频 黄色网址免费进入 | 亚洲精品免费播放 | 亚洲影院在线观看 | 国产一级大片在线观看 | 在线一级片 | 成人永久免费视频 | 免费日本一区二区 | 国产99久久久国产精品 | 老司机一级毛片 | av在线成人 | 青久草视频 | 成人在线免费观看网址 | 请播放一级毛片 | 香蕉成人在线视频 | 国产91免费看 | 欧美日韩视频第一页 | 欧美aaaaaaaa| 性欧美一区二区三区 | 久久精品一区视频 |