Java的類和對象(一)—— 初始類和對象,this關鍵字,構造方法

前言

? ? ? ?從這篇文章開始,我們就進入到了JavaSE的核心部分。這篇文章是Java類和對象的第一篇,主要介紹類和對象的概念,this關鍵字以及構造方法~~

什么是類?什么是對象?

? ? ? ?學過C語言的老鐵們,可以類比struct自定義一個結構體,類就類似結構體,對象就類似使用結構體關鍵字來創建結構體變量(結構體普通變量,結構體指針,結構體數組),但是類里面可以定義方法(也就是C語言中的函數)
? ? ? ?沒有學過C語言的老鐵們,可以這樣理解,假設你是一個建筑工程師,類就是你畫出來的建筑圖紙,而對象就是用圖紙實際建造出來的房子,圖紙就是用來描述這個房子具體的細節(長,寬,高,材料等等)

類是用來對一個實體(對象)來進行描述的,主要描述該實體(對象)具有哪些屬性(外觀尺寸等),哪些功能(用來干啥),描述完成后計算機就可以識別了。

類的創建

我們可以使用 class 關鍵字來定義一個類
一個類里面包含字段/屬性/成員變量,也可以包含成員方法~~

class 類名{
? ? ? ?字段、屬性、成員變量;(定義在類里面,方法外面)
? ? ? ?成員方法;
}

下面我們來定義一個學生類:

class Student{//字段、屬性、成員變量public String name;public int age;public String stuNum;//成員方法public void sleep(){System.out.println(name + "睡覺");}public void haveClass(){System.out.println(name + "上課");}public void doHomework(){System.out.println(name + "做作業");}
}

對象的實例化

什么是對象的實例化,簡單來說就是創建一個對象,我們需要使用類名和 new 關鍵字來進行創建~~

創建格式:

類名 對象 = new 類名()

代碼示例:

Student student1 = new Student();

對象的使用

我們可以通過對象來訪問對象里面的成員變量和成員方法~~

使用格式:對象后面加一個點號再加相應的成員方法或者成員變量即可。

我們來試著使用一下,還是上面的學生類為例子:

    public static void main(String[] args) {Student student1 = new Student();student1.name = "張三";student1.age = 10;student1.stuNum = "32";student1.sleep();student1.haveClass();student1.doHomework();}

在這里插入圖片描述

面向過程和面向對象的區別

? ? ? ?面向過程和面向對象本質上都是解決問題的方法,面向過程注重的是過程,而面向對象就是需要對象與對象之間的聯系,面向對象的關鍵就是(找到對象,創建對象和使用對象),例如你上網購物,如果你是面向過程,你就會這樣子,下單,工廠制作商品,工人發貨,物流人員進行運輸,快遞員將快遞送到指定地點,你去那個地方取件,最后確認收貨,這就是面向過程。
? ? ? ?如果你是面向對象,那么就是你和快遞這兩個對象之間的聯系,你只需要關心為這個對象(商品)付款然后取件,就沒了。
? ? ? ?C語言就是典型的面向過程的編程語言,而Java是一門純面向對象的語言(Object Oriented Program,簡稱OOP),在面向對象的世界里,一切皆為對象。面向對象是解決問題的一種思想,主要依靠對象之間的交互完成一件事情。

this 關鍵字介紹

? ? ? ?現在我以下面的代碼為例子:

class Date{public int year;public int month;public int day;public void initDate1(int year, int month, int day){year = year;month = month;day = day;}public void initDate2(int y, int m, int d){year = y;month = m;day = d;}public void printDate(){System.out.println(year + "年 " + month + "月 " + day + "日 ");}
}public class Test{public static void main(String[] args) {Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();d1.initDate1(2024,5,13);d1.printDate();System.out.println("=====================");d1.initDate2(2024,5,13);d1.printDate();}
}

思考一下輸出結果是什么?
在這里插入圖片描述
在這里插入圖片描述

再談對象中成員變量

? ? ? ?對象中的成員變量和神奇,一旦對象創建好,對象里面的成員變量其實會被賦值成默認值,所以上面才會出現0年0月0日~~
? ? ? ?根據上一篇的JVM內畫圖,我們來看一下對象的分布:

在這里插入圖片描述

對象在堆里是只包含成員變量,沒有成員方法的~~

來現在解決一下為什么下面的代碼不行~~

    public void initDate1(int year, int month, int day){year = year;month = month;day = day;}

因為程序遵循局部變量優先使用原則,所以上面的代碼相當于是局部變量自己給自己賦值~~

如何解決?

添加 this 關鍵字就可以了

    public void initDate1(int year, int month, int day){this.year = year;this.month = month;this.day = day;}

this 關鍵字能讓編譯器識別這是成員變量而不是局部變量~~
因此建議大家習慣性地使用this關鍵字~~

再理解this

public class Test{public static void main(String[] args) {Date d1 = new Date();Date d2 = new Date();Date d3 = new Date();d1.initDate1(2024,5,13);d1.printDate();System.out.println("=====================");d2.initDate2(2024,5,14);d2.printDate();System.out.println("=====================");d3.initDate2(2024,5,15);d3.printDate();}
}

在這里插入圖片描述
? ? ? ?問題來了,上面創建了三個對象,都調用了printDate()方法,這些方法是如何區分這是哪個對象的呢?

在Java中,調用成員方法時會發生隱式傳參:

    public void initDate1(Date this, int year, int month, int day){this.year = year;this.month = month;this.day = day;}public void initDate2(Date this, int y, int m, int d){year = y;month = m;day = d;}public void printDate(Date this){System.out.println(year + "年 " + month + "月 " + day + "日 ");}

大家看到上面的 Date this(這個是可以不用寫的,寫了你會發現沒有報錯) 這個就是因為Java 自動幫你傳遞了這個對象,所以 this 其實就是可以指代這個對象時誰。

當你調用某個對象的成員方法時,Java會自動幫你把對象傳遞過去,并且使用 this 來接收這個對象,所以上面我們可以使用 this.year = year 來避免局部變量自我賦值,而是將局部變量賦值給對象的成員變量。

this與成員方法

由于this 就是指向對象的,所以我們可以在非靜態的成員方法中進行使用來調用其他的成員方法~~

靜態與非靜態會在下一篇文章中講解~~

構造方法

? ? ? ?構造方法的作用是給成員變量進行初始化的

創建格式:

修飾符 類名(形參列表){
? ? ? ?方法體
}

注意構造方法沒有返回值,并且和普通的方法一樣是可以發生方法的重載的~~
名字必須與類名相同,在創建對象時,由編譯器自動調用,并且在整個對象的生命周期內只調用一次

再談對象的實例化

對象的示例化簡單來說可以分為兩步,第一步是分配內存空間,第二步是調用構造方法
一旦new 類名(參數) 的時候就會調用構造方法~

可是上面的代碼中,我們沒有寫過構造方法,代碼為什么會正常執行并且沒有報錯呢?

因為在Java中,如果你沒有寫過任何的構造方法的話,Java會給你自動提供一個空的構造方法(這個方法是空的,沒有任何效果)
但是如果你寫了構造方法的話,Java是不會幫你提供一個空的構造方法~~

例如下面的代碼:

class Dog{public String name;public Dog(int year){System.out.println(year + "出生了");}
}public class Test{public static void main(String[] args) {Dog dog = new Dog(2024);Dog dog2 = new Dog();}
}

dog2 是無法進行創建的,因為Dog的構造方法只有public Dog(int year),而沒有Dog()這個構造方法!!!

this與構造方法

在構造方法中是可以使用this關鍵字來調用構造方法的~
調用格式比較特殊,this(參數)
在構造方法中可以調用其他構造方法,但必須放在第一行!!!
并且使用 this 調用構造方法的時候不能形成環!!!

下面代碼就是成環的表現~~
這是不被允許的!!!

    public Dog(){this(2024);}public Dog(int year){this();System.out.println(year + "出生了");}

總結

this 關鍵字:

  1. this.當前對象的成員變量
  2. this.當前對象的非靜態的成員方法
  3. this() 調用其他的構造方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12014.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12014.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12014.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【哈希】Leetcode 383. 贖金信【簡單】

贖金信 給你兩個字符串:ransomNote 和 magazine ,判斷 ransomNote 能不能由 magazine 里面的字符構成。 如果可以,返回 true ;否則返回 false 。 magazine 中的每個字符只能在 ransomNote 中使用一次。 解題思路 可以使用哈希…

matlab進行濾波處理

在MATLAB中進行濾波處理,你可以使用內置的函數或自定義濾波器。以下是一些常見的方法: 1. 使用內置濾波器函數 MATLAB提供了多種內置濾波器函數,如filter,filtfilt,butter(用于設計巴特沃斯濾波器&#x…

spark結課之tip2

spark常用方法總結: 一、從內部創建RDD (1).通過并行化集合(Parallelized Collections): 可以使用SparkContext的parallelize方法將一個已有的集合轉換為RDD。 基本語法: parallelize(collection, numSlicesNone)…

AI系列:大語言模型的RAG(檢索增強生成)技術(下)-- 使用LlamaIndex

目錄 前言什么是LlamaIndex?LlamaIndex代碼設置embedding模型設置LLM模型索引查詢機 驗證使用感受參考資料 前言 繼上一篇文章AI系列:大語言模型的RAG(檢索增強生成)技術(上),這篇文章主要以LlamaIndex為…

銀行業數據運營場景下的數據埋點方案

1、引言 隨著金融科技的快速發展,銀行業的數據運營變得日益重要。數據埋點作為數據收集的重要手段,對于銀行業務的精細化運營、風險管理和產品迭代等方面起著至關重要的作用。本方案將針對銀行業數據運營場景,設計一套完整的數據埋點方案&am…

【生信技能樹】GEO數據挖掘全流程

R包的安裝,每次做分析的時候先運行這段代碼把R包都安裝好了,這段代碼不需要任何改動,每次分析直接運行。 options("repos""https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packag…

思源筆記如何結合群暉WebDav實現云同步數據

文章目錄 1. 開啟群暉WebDav 服務2. 本地局域網IP同步測試3. 群暉安裝Cpolar4. 配置遠程同步地址5. 筆記遠程同步測試6. 固定公網地址7. 配置固定遠程同步地址 在數字化時代,信息的同步與共享變得尤為重要。無論是個人用戶還是企業團隊,都渴望能夠實現跨…

nginx 代理java 請求報502

情況:nginx代理java 請求 后端返回正常,但是經過nginx 時報502 經過多次對比其他接口發現可能是返回的請求頭過大,導致nginx 報錯:如下 2024/05/13 02:57:12 [error] 88#88: *3755 upstream sent too big header while reading r…

創建存儲過程

一、DDL與DML CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATETIME NOT NULL,userName VARCHAR(255) NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM(男, 女) NOT NULL,introduce TEXT ); INSERT INTO student (createDate, userN…

透明加密軟件推薦:哪款實用又高效?

透明加密軟件是一種專門針對文件保密需求的計算機加密工具。 其核心在于“透明”二字,意味著整個加密過程對于使用者來說是無形且無感知的。 當用戶進行文件的日常操作,如打開、編輯或保存時,透明加密軟件會在后臺自動進行加密和解密工作&a…

【算法刷題day52】Leetcode:300. 最長遞增子序列、674. 最長連續遞增序列、718. 最長重復子數組

文章目錄 Leetcode 300. 最長遞增子序列解題思路代碼總結 Leetcode 674. 最長連續遞增序列解題思路代碼總結 Leetcode 718. 最長重復子數組解題思路代碼總結 草稿圖網站 java的Deque Leetcode 300. 最長遞增子序列 題目:300. 最長遞增子序列 解析:代碼隨…

Keil編程不同驅動文件引用同一個常量的處理方法

基礎不牢,地動山搖,最近單片機編程又遇到一個基礎問題。 我在頭文件中定義了一個常量同時給兩個驅動文件使用,封裝的時候編譯沒問題,但是在main函數中引用驅動函數的時候就出現了重定義的問題,如下如所示。 解決方法很…

Windows 11 下 kafka 的安裝踩坑

安裝 windows系統kafka小白入門篇——下載安裝,環境配置,入門代碼書寫(推薦) kafka在windows下安裝和使用入門教程 問題1 參考鏈接 運行kafka集成的zookeeper時,命令:bin\windows\zookeeper-server-star…

05. 【Java教程】第一個 Java 程序

本節我們將以Windows操作系統為例,編寫并執行第一個Java程序。在這之前,請確保你的操作系統上已經安裝了JDK 1. 編譯程序 大家可能有個疑問,為什么需要編譯程序呢?計算機不能直接執行我們編寫的源代碼嗎? 這是由于計…

指針由淺入深

1.變量與地址 2.指針與指針變量 3.直接訪問和間接訪問 4.空指針與野指針 5.空類型 6.定義與初始化的書寫規則 7.指針運算 8.指針與數組 指針與一維數組 指針與二維數組 指針與字符數組 9.const與指針 10.指針數組和數組指針 11.多級指針 #include<stdio.h> #include<…

CPU利用率使用教程

本文主要參考&#xff1a; 一文讓你學到 nmon最詳盡的用法 Linux性能監控命令_nmon 安裝與使用 如果你是在Ubuntu上安裝nmon&#xff0c;使用&#xff1a; apt install nmon安裝好后&#xff0c;直接運行 $:nmon #運行如果是后臺抓數據&#xff1a; -f 參數: 生成文件,文件…

python 虛擬環境多種創建方式

【一】說明介紹 &#xff08;1&#xff09;什么是虛擬環境 在Python中&#xff0c;虛擬環境&#xff08;Virtual Environment&#xff09;是一個獨立的、隔離的Python運行環境&#xff0c;它擁有自己的Python解釋器、第三方庫和應用程序。通過創建虛擬環境&#xff0c;可以確…

【刷題(2)】矩陣

一、矩陣問題基礎 遍歷&#xff1a; for i in range(len(matrix[0])): for j in range(len(matrix): while 倒序遍歷&#xff1a; for i in range(right,left,-1) 臨時存儲&#xff1a;temp w,h:len(matrix[0])-1 len(matrix)-1 left,right,top,bottom:0 len(matrix[0])-1 0 l…

Cesium 3DTileset Style 原理簡析

Cesium 3DTileset Style 原理簡析 應用層會看到這樣的使用。那么原理是什么, 為啥寫 height, 除了這個還有啥? const tileset await Cesium.Cesium3DTileset.fromUrl("../../public/tileset/building/tileset.json"); tileset.style new Cesium.Cesium3DTileSty…