自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

零基礎(chǔ)學(xué)Java:對象和類

開發(fā) 后端
OOP 的英文全稱是 Object Oriented Programming,要理解它的話,就要先理解面向?qū)ο?,要想理解面向?qū)ο蟮脑挘鸵壤斫饷嫦蜻^程,因?yàn)橐婚_始沒有面向?qū)ο蟮木幊陶Z言,都是面向過程。

[[353195]]

“二哥,我那天在圖書館復(fù)習(xí)上一節(jié)你講的內(nèi)容,剛好碰見一個(gè)學(xué)長,他問我有沒有‘對象’,我說還沒有啊。結(jié)果你猜他說什么,‘要不要我給你 new 一個(gè)啊?’我當(dāng)時(shí)就懵了,new 是啥意思啊,二哥?”三妹滿是疑惑的問我。

“哈哈,三妹,你學(xué)長還挺幽默啊。new 是 Java 中的一個(gè)關(guān)鍵字,用來把類變成對象。”我笑著對三妹說,“對象和類是 Java 中最基本的兩個(gè)概念,可以說撐起了面向?qū)ο缶幊?OOP)的一片天。”

01、面向過程和面向?qū)ο?/strong>

三妹是不是要問,什么是 OOP?

OOP 的英文全稱是 Object Oriented Programming,要理解它的話,就要先理解面向?qū)ο螅肜斫饷嫦驅(qū)ο蟮脑?,就要先理解面向過程,因?yàn)橐婚_始沒有面向?qū)ο蟮木幊陶Z言,都是面向過程。

舉個(gè)簡單點(diǎn)的例子來區(qū)分一下面向過程和面向?qū)ο蟆?/p>

有一天,你想吃小碗湯了,怎么辦呢?有兩個(gè)選擇:

1)自己買食材,豆腐皮啊、肉啊、蒜苔啊等等,自己動(dòng)手做。

2)到飯店去,只需要對老板喊一聲,“來份小碗湯。”

第一種就是面向過程,第二種就是面向?qū)ο蟆?/p>

面向過程有什么劣勢呢?假如你買了小碗湯的食材,臨了又想吃宮保雞丁了,你是不是還得重新買食材?

面向?qū)ο笥惺裁磧?yōu)勢呢?假如你不想吃小碗湯了,你只需要對老板說,“我那個(gè)小碗湯如果沒做的話,換成宮保雞丁吧!”

面向過程是流程化的,一步一步,上一步做完了,再做下一步。

面向?qū)ο笫悄K化的,我做我的,你做你的,我需要你做的話,我就告訴你一聲。我不需要知道你到底怎么做,只看功勞不看苦勞。

不過,如果追到底的話,面向?qū)ο蟮牡讓悠鋵?shí)還是面向過程,只不過把面向過程進(jìn)行了抽象化,封裝成了類,方便我們的調(diào)用。

02、類

對象可以是現(xiàn)實(shí)中看得見的任何物體,比如說,一只特立獨(dú)行的豬;也可以是想象中的任何虛擬物體,比如說能七十二變的孫悟空。

Java 通過類(class)來定義這些物體,這些物體有什么狀態(tài),通過字段來定義,比如說比如說豬的顏色是純色還是花色;這些物體有什么行為,通過方法來定義,比如說豬會(huì)吃,會(huì)睡覺。

來,定義一個(gè)簡單的類給你看看。

  1. /** 
  2.  * 微信搜索「沉默王二」,回復(fù) Java 
  3.  * 
  4.  * @author 沉默王二 
  5.  * @date 2020/11/19 
  6.  */ 
  7. public class Person { 
  8.     private String name
  9.     private int age; 
  10.     private int sex; 
  11.  
  12.     private void eat() { 
  13.     } 
  14.  
  15.     private void sleep() { 
  16.     } 
  17.  
  18.     private void dadoudou() { 
  19.     } 

一個(gè)類可以包含:

  • 字段(Filed)
  • 方法(Method)
  • 構(gòu)造方法(Constructor)

在 Person 類中,字段有 3 個(gè),分別是 name、age 和 sex,它們也稱為成員變量——在類內(nèi)部但在方法外部,方法內(nèi)部的叫臨時(shí)變量。

成員變量有時(shí)候也叫做實(shí)例變量,在編譯時(shí)不占用內(nèi)存空間,在運(yùn)行時(shí)獲取內(nèi)存,也就是說,只有在對象實(shí)例化(new Person())后,字段才會(huì)獲取到內(nèi)存,這也正是它被稱作“實(shí)例”變量的原因。

方法 3 個(gè),分別是 eat()、sleep() 和 dadoudou(),表示 Person 這個(gè)對象可以做什么,也就是吃飯睡覺打豆豆。

那三妹是不是要問,“怎么沒有構(gòu)造方法呢?”

的確在 Person 類的源碼文件(.java)中沒看到,但在反編譯后的字節(jié)碼文件(.class)中是可以看得到的。

  1. // 
  2. // Source code recreated from a .class file by IntelliJ IDEA 
  3. // (powered by Fernflower decompiler) 
  4. // 
  5.  
  6. package com.itwanger.twentythree; 
  7.  
  8. public class Person { 
  9.     private String name
  10.     private int age; 
  11.     private int sex; 
  12.  
  13.     public Person() { 
  14.     } 
  15.  
  16.     private void eat() { 
  17.     } 
  18.  
  19.     private void sleep() { 
  20.     } 
  21.  
  22.     private void dadoudou() { 
  23.     } 

public Person(){} 就是默認(rèn)的構(gòu)造方法,因?yàn)槭强盏臉?gòu)造方法(方法體中沒有內(nèi)容),所以可以缺省。Java 聰明就聰明在這,有些很死板的代碼不需要開發(fā)人員添加,它會(huì)偷偷地做了。

03、new 一個(gè)對象

創(chuàng)建 Java 對象時(shí),需要用到 new 關(guān)鍵字。

Person person = new Person();

這行代碼就通過 Person 類創(chuàng)建了一個(gè) Person 對象。所有對象在創(chuàng)建的時(shí)候都會(huì)在堆內(nèi)存中分配空間。

創(chuàng)建對象的時(shí)候,需要一個(gè) main() 方法作為入口, main() 方法可以在當(dāng)前類中,也可以在另外一個(gè)類中。

第一種:main() 方法直接放在 Person 類中。

  1. public class Person { 
  2.     private String name
  3.     private int age; 
  4.     private int sex; 
  5.  
  6.     private void eat() {} 
  7.     private void sleep() {} 
  8.     private void dadoudou() {} 
  9.  
  10.     public static void main(String[] args) { 
  11.         Person person = new Person(); 
  12.         System.out.println(person.name); 
  13.         System.out.println(person.age); 
  14.         System.out.println(person.sex); 
  15.     } 

輸出結(jié)果如下所示:

  1. null 

第二種:main() 方法不在 Person 類中,而在另外一個(gè)類中。

實(shí)際開發(fā)中,我們通常不在當(dāng)前類中直接創(chuàng)建對象并使用它,而是放在使用對象的類中,比如說上圖中的 PersonTest 類。

可以把 PersonTest 類和 Person 類放在兩個(gè)文件中,也可以放在一個(gè)文件(命名為 PersonTest.java)中,就像下面這樣。

  1. /** 
  2.  * @author 微信搜「沉默王二」,回復(fù)關(guān)鍵字 PDF 
  3.  */ 
  4. public class PersonTest { 
  5.     public static void main(String[] args) { 
  6.         Person person = new Person(); 
  7.     } 
  8.  
  9. class Person { 
  10.     private String name
  11.     private int age; 
  12.     private int sex; 
  13.  
  14.     private void eat() {} 
  15.     private void sleep() {} 
  16.     private void dadoudou() {} 

04、初始化對象

在之前的例子中,程序輸出結(jié)果為:

  1. null 

為什么會(huì)有這樣的輸出結(jié)果呢?因?yàn)?Person 對象沒有初始化,因此輸出了 String 的默認(rèn)值 null,int 的默認(rèn)值 0。

那怎么初始化 Person 對象(對字段賦值)呢?

第一種:通過對象的引用變量。

  1. public class Person { 
  2.     private String name
  3.     private int age; 
  4.     private int sex; 
  5.  
  6.     public static void main(String[] args) { 
  7.         Person person = new Person(); 
  8.         person.name = "沉默王二"
  9.         person.age = 18; 
  10.         person.sex = 1; 
  11.          
  12.         System.out.println(person.name); 
  13.         System.out.println(person.age); 
  14.         System.out.println(person.sex); 
  15.     } 

person 被稱為對象 Person 的引用變量,見下圖:

通過對象的引用變量,可以直接對字段進(jìn)行初始化(person.name = "沉默王二"),所以以上代碼輸出結(jié)果如下所示:

  1. 沉默王二 
  2. 18 

第二種:通過方法初始化。

  1. /** 
  2.  * @author 沉默王二,一枚有趣的程序員 
  3.  */ 
  4. public class Person { 
  5.     private String name
  6.     private int age; 
  7.     private int sex; 
  8.  
  9.     public void initialize(String n, int a, int s) { 
  10.         name = n; 
  11.         age = a; 
  12.         sex = s; 
  13.     } 
  14.  
  15.     public static void main(String[] args) { 
  16.         Person person = new Person(); 
  17.         person.initialize("沉默王二",18,1); 
  18.  
  19.         System.out.println(person.name); 
  20.         System.out.println(person.age); 
  21.         System.out.println(person.sex); 
  22.     } 

在 Person 類中新增方法 initialize(),然后在新建對象后傳參進(jìn)行初始化(person.initialize("沉默王二", 18, 1))。

第三種:通過構(gòu)造方法初始化。

  1. /** 
  2.  * @author 沉默王二,一枚有趣的程序員 
  3.  */ 
  4. public class Person { 
  5.     private String name
  6.     private int age; 
  7.     private int sex; 
  8.  
  9.     public Person(String nameint age, int sex) { 
  10.         this.name = name
  11.         this.age = age; 
  12.         this.sex = sex; 
  13.     } 
  14.  
  15.     public static void main(String[] args) { 
  16.         Person person = new Person("沉默王二", 18, 1); 
  17.  
  18.         System.out.println(person.name); 
  19.         System.out.println(person.age); 
  20.         System.out.println(person.sex); 
  21.     } 

這也是最標(biāo)準(zhǔn)的一種做法,直接在 new 的時(shí)候把參數(shù)傳遞過去。

補(bǔ)充一點(diǎn)知識,匿名對象。匿名對象意味著沒有引用變量,它只能在創(chuàng)建的時(shí)候被使用一次。

  1. new Person(); 

可以直接通過匿名對象調(diào)用方法:

  1. new Person().initialize("沉默王二", 18, 1); 

“好了,三妹,關(guān)于 Java 中的對象和類就先說這么多吧。”轉(zhuǎn)動(dòng)了一下僵硬的脖子后,我對三妹說。

“好的,二哥,你辛苦了,我來給你按摩下。”

本文轉(zhuǎn)載自微信公眾號「沉默王二」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系沉默王二公眾號。

 

責(zé)任編輯:武曉燕 來源: 沉默王二
相關(guān)推薦

2021-01-13 14:55:54

JavaPython開發(fā)

2016-11-25 13:05:18

2020-10-20 14:50:26

Python數(shù)字字符串

2020-11-23 09:46:18

Java方法權(quán)限

2021-03-23 17:21:48

Java編程開發(fā)

2014-10-08 10:42:08

萌碼編程

2018-06-13 10:23:27

編程語言Python數(shù)據(jù)庫

2022-03-15 09:31:17

ESLint工作原理前端

2017-09-21 15:31:49

2012-02-22 10:33:36

Wi-Fi

2021-03-31 11:21:36

Java語言編程

2024-06-17 10:45:57

C語言編程變量容器

2020-04-09 14:02:33

NginxHttps前端

2019-11-11 14:09:17

Swift數(shù)據(jù)科學(xué)語言

2021-01-28 08:34:30

Java對象定義

2021-08-27 07:13:52

UI計(jì)算機(jī)圖形

2021-03-11 11:50:07

kafka服務(wù)器Java

2018-08-24 09:00:00

DevOps持續(xù)集成連續(xù)部署

2024-12-31 07:00:00

2017-09-18 10:48:06

深度學(xué)習(xí)零基礎(chǔ)入門
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號