Java--初識類和對象

前言

本篇講解Java類和對象的入門版本。
學習目的:
1.理解什么是類和對象。
2.引入面向對象程序設計的概念
3.學會如何定義類和創建對象。
4.理解this引用。
5.了解構造方法的概念并學會使用

考慮到篇幅過長問題,作者決定分多次發布。

面向對象的引入

Java是一門面向對象的程序設計語言。那么面向對象具體是啥意思呢?
面向對象(Object-oriented)更多是一種思維模式,它替換了原有的面向過程的思考方式,轉為了面向對象。這種編程思想強調了將問題分解為對象的集合,對象有各自的屬性和方法,對象與對象之間又有信息傳遞和行為協助。

  • 總結:解決問題的重心由拆分步驟,改變成拆分成對象,對象和對象的協作上。編程思維模式的轉變

面向過程編程

如果你先前學過任何一門面向過程的編程語言,比如C語言。回憶一下,先前解決問題是不是研究解決一個問題的過程是怎樣的?
它的重點在于如何完成任務,要實現哪些功能的函數,函數接收參數返回值,執行一系列的邏輯結構過程,然后才是研究數據應該采用什么數據結構存儲,最后輸出正確的結果。
面向過程首先考慮的是如何處理數據即算法,其次是數據如何存儲(數據結構)。

面向對象編程

面向對象編程(Object-Oriented Programming)簡稱OOP.它是一種以對象為中心的編程范式,對象有自己的狀態行為,通過封裝,繼承,多態實現代碼的模塊化。實現對象與對象之間的協作和交互。
與面向過程對比,面向對象先考慮的是數據如何存儲,將相關聯的數據和方法包裝成一個對象。其次考慮處理對象與對象之間。可以說先數據結構后算法,與面向過程反著來了。

生活化的示例

傳統洗衣服(面向過程)

1.拿臟的衣物。
2.水槽裝足夠的水
3.加入洗衣粉
4.將臟衣服放入水槽
5.瘋狂手搓
6.沖洗衣服
7.換水
8.繼續沖洗衣服
9.擰干洗好的衣服
10.晾衣服。

現代洗衣服(面向對象)

確定對象 臟衣物,洗衣粉,洗衣機
我們人為交互
1.將臟衣物放入洗衣機
2.倒入洗衣粉。
3.設定洗衣機的程序。
洗完后,取出晾干就可以了。
整個都是三個對象的交互。洗衣機怎么洗的,內部怎么運作的?I don’t care.
總之我知道按照上面三步衣服就洗好了。

類和對象的概念

舉個栗子,人就是一個類。人有姓名,年齡,身高,體重,家庭住址。但人的概念太抽象了,太廣泛了。那么張三,小紅,李華,你和我,就是具體的人了,我們也有上面的姓名身高年齡。
所以呢,*類是類型,藍圖,模板。*即上面例子中的人。那么后面的張三就是具體的人,就稱為一個對象。人有的屬性,張三也有。
所以,類可以描述對象,對象是類的實例化

接下來正式介紹類
類(class)是構造( construct ) 對象的模板和藍圖, 由類構造對象的過程稱為創建類的實例 ( instance ) 。
現在籠統的闡述類的特點,后面補充實例

類的特點:
1.屬性(fileds):類可以定義成員變量。成員變量體現的是對象的屬性(狀態特征)。每個對象通過各自類的屬性有自己的特點狀態。
2.方法(methods):類內部可以定義成員方法,簡稱方法或者函數。方法定義了對象的行為,方法可以讓對象執行某種特定的功能,更能完成對象與對象的協作。
3.類的實例化(instance):類本身只是一個模板,類似C中的結構體。只有實例化(構造對象),它內部的屬性和方法才有意義。如何創建下面會給出例子。
4.構造方法(construct):這里先不提,往后看下去,后面會講。
5.封裝類,抽象類,繼承,接口…………這里不提。其實作者也沒懂完

現在可以定義一個類了
類的基本語法(目前掌握以下這些就夠了)

class 類名{
//屬性:成員變量

//成員方法
}

1.class 類的關鍵字,定義一個類必須有。
2.類名:遵循標識符的命名規則,采用大駝峰命名法。
3.花括號別忘了,別漏了。
4.屬性(成員變量):這里可以定義各種類型變量表示類的狀態了。
5.成員方法:定義類的行為與操作。

下面定義一個Dog類

public class Dog {
//成員變量public String name;public int age;//成員方法public void bark(){System.out.println("Ruff! Ruff!");}
}

上面我們定義這樣一個類,該類有兩個成員變量,分別是字符串name和int年齡。還有bark這樣一個成員方法表示dog在叫的行為。
這里的public是訪問修飾符,表示類,成員變量,成員方法的訪問權限。

類的實例化
由類生成對象的過程叫做類的實例化

類在Java中為引用類型。
int double float為內置類型(基本數據類型),Java中與其相對的類型稱為引用類型,數組字符串也是引用類型。引用類型也是自定義類型,類是用戶自定義出來的類型。
Java中由類創建一個對象,要用到關鍵字new.

Dog dog=new Dog();

語法:
類名 變量名 = new 類名()
這里Dog就是先前定義的類了。
dog是這個類類型的變量名。
new “給我一個對象” 后面跟上Dog()就創建了一個屬于Dog的對象了。
new后面其實跟著的是構造方法,這個稍后再說。

既然創建了對象,我們定然想到如何處理對象呢。

        dog.age=1;dog.name="Bin";dog.bark();

通過圓點運算符(.)我們就可以訪問對象的成員了和方法了。
這里對象繼承了類的屬性,這個實例化的dog也有了name和age,也能調用bark()方法了。

假設我們不對對象初始化操作,會出現問題嗎?
不會,因為局部變量未初始化會被編譯器報錯警告。而對象的成員變量不在棧上而在堆上,未初始化會有對應的默認值。

        Dog dog=new Dog();System.out.println(dog.name);System.out.println(dog.age);

未初始化默認打印結果
對于引用類型,其默認值為null;內置類型就為相應的0值,int對于0,float對應0.0F,double對應0.0,另外boolean對應false。


我這里的dog在main方法內部創建,就是局部變量在棧上開辟一塊空間,同時在堆上為這個對象開辟合適的空間保存對象的屬性。這里的dog實際存儲了對象在堆上的地址,dog就稱為一個引用。通過引用,我們訪問對象的成員。

對象

其實類那一部分已經說明完大部分對象的內容,這里稍作補充和總結。

對象有狀態。這里的狀態從代碼來看就是成員變量的值不同,反過來就算同一個類的對象成員變量的值不同說明他們之間狀態不同。
對象有行為。根據對象的狀態,調用成員方法行為上不同,反之根據自身的行為(方法調用)也會影響自身狀態。
對象有名字。每個對象應該有獨立的標識符來區分不同
對象與對象之間獨立。每個對象有自己的狀態和行為。

認識this引用

關鍵字this

先定義如下一個類
里面的setData成員方法中的形參與成員變量名同名還能進行賦值嗎?

public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}
}
public class Date {public int year;public int month;public int day;public void setDate(int year,int month,int day){year=year;month=month;day=day;}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);date.printByString();}
}

運行結果是怎樣的呢?修改data對象的值了嗎?
答案必然是沒有!否則這里要說明的this干嘛呢。
很明顯,這里setDate里形參和成員變量名重復了,左值的year究竟代表了成員變量還是形參呢?是形參。
所以,這里上述的賦值就是自我娛樂,對成員變量沒有影響。因為調用方法時會在棧上開辟空間稱作函數棧幀,此時局部變量(函數形參)優先使用。
這個時候就要用上this對setDate函數做出如下修改。

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

這里的this相當于原來的date對象,很顯然this.成員變量和方法參數區分開了。說明了這里左值同名的year,month,day是引用(data對象)的成員變量。避免出現同名時混淆的情況。

那么this是怎樣知道它代表哪個引用呢?
實際上那個對象的引用在某個方法時會將這個引用當作函數參數傳遞過去。
實際的setDate寫成下面這樣。只不過我們寫的時候省略了第一個參數罷了。
由此我們可以知道那個對象的引用在調用某方法時,這個this就代表誰了。

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

這里的this由于就是date,它也可以調用自身的成員方法。


public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public static void main(String[] args) {Date date=new Date();date.setDate(2024,5,13);}
}

this還有一個用處調用其它構造方法

構造方法

前面提過成員方法,那么構造方法和成員方法有什么區別呢?類比學習一下吧。

一般的成員方法格式:
返回值 方法名(參數列表){
//方法體
}

構造方法可以看作特殊的成員方法
第一,它沒有返回值類型。
第二,它的方法名和它的類名一樣。

構造方法格式:
返回值 方法名 類名(參數列表){
//方法體
}

public Date(){}

這就是一個簡單的構造方法。
想到前面這個Date date=new Date(); new后面的 Date()不就是一個構造方法嗎?哎奇怪,當時我們并沒有創建這樣的構造方法呀。
事實上,如果定義的類沒有構造方法,編譯器會默認給你上述的構造方法,這種構造方法是最簡單的。沒有帶任何參數。
需要注意的是,如果你自己創造了一個構造方法,請嚴格按照你的構造方法創建對象,此時編譯器不會在為你默認這么一個構造方法了。

下面給出一個帶參數形式的構造方法。

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

這樣就可以在創建對象時同時初始化成員變量了。
構造方法同樣支持重載。即上面兩個構造方法可以同時存在一個Date類中。

public class Date {public int year;public int month;public int day;public void setDate(Date this,int year,int month,int day){this.year=year;this.month=month;this.day=day;this.printByString();}public void printByString(){System.out.println("year = "+year+" month = "+ month+" day = "+ day);}public Date(){}public Date(int year,int month,int day){this.year=year;this.month=month;this.day=day;}public static void main(String[] args) {Date date=new Date(2004,12,8);date.printByString();}
}

最后總結一下構造方法:
1.構造方法名與類名相同。
2.無返回值類型,不要理解成返回值類型為void
3.創建對象時調用,且只能調用一次。
4.構造方法可以重載。(比如上面的構造方法在創建對象時可以選擇不帶參數,還可以選三個參數初始化的)
5.如果沒有自定義構造方法,那么編譯器默認會構造方法。

結尾

想不出來說什么了,太困了。嗯~
一無所有,或者贏下所有

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

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

相關文章

Docker之grep: (standard input): binary file matches

使用 docker compose logs -f | grep 命令時遇到了 grep: (standard input): binary file matches 錯誤。 這個錯誤通常發生在 grep 嘗試搜索包含二進制內容的文件時。docker compose logs 命令會輸出容器的日志,而這些日志可能包含二進制數據,導致 gre…

MySQL查詢篇-集合運算

文章目錄 union (并集)union distinctunion all intersect(交集)intersect allintersect distinct except 差集except distinctexcept distinctexcept all union (并集) union distinct 使用前提:a和c數據類型一致&a…

互聯網摸魚日報(2024-05-13)

互聯網摸魚日報(2024-05-13) 36氪新聞 當綠色飛行成為潮流,這家航空公司定下了新目標 | 最前線 回收雨水澆花,廚余垃圾變肥料,我們打卡了阿里北京新園區 | 最前線 本周雙碳大事:中美就氣候問題進行會談;鋰電池行業迎…

GIAT: 蛋白質結構預測的新利器

瑞典Karolinska研究院在瑞典政府贊助下由Ben Murrell等研究團隊在AlphaFold 3最新報告后提出這篇論文提出了一種非常有趣和創新的方法來生成蛋白質骨架結構,稱為生成式不變角度轉換器(GIAT)。與現有的主要基于擴散模型和流匹配的方法不同,GIAT采用了類似于大型語言模型(如GPT)中…

【C語言|數據結構】雙向鏈表

文章目錄 前言1、初步認識雙向鏈表1.1 定義:1.2 結構1.3 節點的存儲 2、雙向鏈表的接口函數2.1 鏈表的節點的動態申請2.2 鏈表的初始化2.3 尾插2.4 頭插2.5 頭刪2.5 尾刪2.6 在pos節點后面添加數據2.6 刪除pos節點 3、雙向鏈表的實現: 前言 各位小伙伴大…

C控制語句:分支和跳轉

1.1if語句 //colddays.c --找出0攝氏度以下的天數占總天數的百分比 #include <stdio.h>int main(void) {const int FREEZING 0;float temperature;int cold_days 0;int all_days 0;printf("Enter the list of daily low temperature.\n");printf("Use…

電子學會C/C++編程等級考試2024年03月(八級)真題解析

C/C編程&#xff08;1~8級&#xff09;全部真題?點這里 第1題&#xff1a;道路 N個以 1 … N 標號的城市通過單向的道路相連:。每條道路包含兩個參數&#xff1a;道路的長度和需要為該路付的通行費&#xff08;以金幣的數目來表示&#xff09; Bob and Alice 過去住在城市 1.在…

藍海創業商機小吃配方項目,日入200+ ,小白可上手,圖文創作轉現快

小吃技術銷售&#xff0c;一單價格從幾元到幾百元不等&#xff0c;行業競爭相對較小&#xff0c;是一個相對冷門的領域。只需一部手機&#xff0c;就可以發布圖文并茂的內容&#xff0c;配上背景音樂&#xff08;BGM&#xff09;&#xff0c;即使是對視頻剪輯不熟悉的新手&…

面試中算法(金礦)

有一位國王擁有5座金礦&#xff0c;每座金礦的黃金儲量不同&#xff0c;需要參與挖掘的工人人數也不同。 例如&#xff0c;有的金礦儲量是5ookg黃金&#xff0c;需要5個工人來挖掘;有的金礦儲量是2ookg黃金&#xff0c;需要3個工人來挖掘...... 如果參與挖礦的工人的總數是10。…

【Oracle impdp導入dmp文件(windows)】

Oracle impdp導入dmp文件&#xff08;windows&#xff09; 1、連接數據庫2、創建與導出的模式相同名稱的用戶WIRELESS2&#xff0c;并賦予權限3、創建directory 的物理目錄f:\radio\dmp&#xff0c;并把.dmp文件放進去4、連接新用戶WIRELESS25、創建表空間的物理目錄F:\radio\t…

試衣不再有界:Tunnel Try-on開啟視頻試衣應用新紀元

論文&#xff1a;https://arxiv.org/pdf/2404.17571 主頁&#xff1a;https://mengtingchen.github.io/tunnel-try-on-page/ 一、摘要總結 隨著虛擬試衣技術的發展&#xff0c;消費者和時尚行業對于能夠在視頻中實現高質量虛擬試衣的需求日益增長。這項技術允許用戶在不實際穿…

目標檢測——印度車輛數據集

引言 親愛的讀者們&#xff0c;您是否在尋找某個特定的數據集&#xff0c;用于研究或項目實踐&#xff1f;歡迎您在評論區留言&#xff0c;或者通過公眾號私信告訴我&#xff0c;您想要的數據集的類型主題。小編會竭盡全力為您尋找&#xff0c;并在找到后第一時間與您分享。 …

弱監督語義分割學習筆記

目錄 partial cross entropy loss GitHub - LiheYoung/UniMatch: [CVPR 2023] Revisiting Weak-to-Strong Consistency in Semi-Supervised Semantic Segmentation partial cross entropy loss import torch import torch.nn.functional as Fdef partial_cross_entropy_loss…

區塊鏈中的APP與傳統APP的區別

一、技術 區塊鏈中的APP是基于區塊鏈技術開發的&#xff0c;而傳統APP則基于傳統的應用程序商店或網頁。區塊鏈中的APP利用區塊鏈技術的去中心化、數據不可篡改等特點&#xff0c;使得應用程序的開發和分發更加安全、透明和可信。與傳統APP相比&#xff0c;區塊鏈中的APP無需中…

如何實現嵌套路由

實現步驟 1. 新建子頁面 2. 在router/index.js中的父路由節點添加children數組 3. 在children中添加子路由 {path: /,name: home,component: HomeView,children: [ {path: /pageA,name: pageA,component: pageA},{path: /pageB,name: pageB,component: pageB}] }, 5.在父路…

Web安全:SQL注入之布爾盲注原理+步驟+實戰操作

「作者簡介」&#xff1a;2022年北京冬奧會網絡安全中國代表隊&#xff0c;CSDN Top100&#xff0c;就職奇安信多年&#xff0c;以實戰工作為基礎對安全知識體系進行總結與歸納&#xff0c;著作適用于快速入門的 《網絡安全自學教程》&#xff0c;內容涵蓋系統安全、信息收集等…

前端VUE基礎之創建腳手架

創建腳手架 第一步&#xff08;僅第一次執行&#xff09;&#xff1a;全局安裝vue/cli。 npm install -g vue/cli 到你要創建項目的目錄&#xff0c;然后使用命令創建項目 vue create xxxx 第三步&#xff1a;啟動項目 npm run serv 備注&#xff1a; 1. 如出現下載緩慢請…

PHP流程控制

PHP 流程控制主要是 if 和 switch 流程控制。 當您編寫代碼時&#xff0c;您常常需要為不同的判斷執行不同的動作。您可以在代碼中使用條件語句來完成此任務。 在 PHP 中&#xff0c;提供了下列條件語句&#xff1a; if 語句 - 在條件成立時執行代碼if...else 語句 - 在條件…

訪客管理系統對于校園安全的重要性

校園訪客辦理計劃是針對校園安全需求規劃的安全辦理體系&#xff0c;主要用于對校園外來人員的科學辦理。要做好校園安全作業&#xff0c;把風險分子拒之門外尤為要害。校園訪客辦理計劃實現訪客實名制&#xff0c;并結合公安網、黑名單功用&#xff0c;對風險人員進行提前預警…

沒有公網ip,如何實現外網訪問內網?

目前撥號上網是最廣泛的上網方式&#xff0c;這種方式優點是價格便宜&#xff0c;缺點是沒有固定公網ip&#xff0c;每次重新您撥號ip地址都會變。如果有一臺服務器&#xff0c;需要實現外網訪問&#xff0c;在沒有固定公網ip的環境下&#xff0c;該如何實現呢&#xff1f;使用…