java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象
對(duì)象與類
一、面向?qū)ο笏枷氲母攀?/h2>1>面向?qū)ο笈c面向過程:
- 二者都是一種思想,面向?qū)ο笫窍鄬?duì)于面向過程而言的。面向過程強(qiáng)調(diào)的是功能行為。面向?qū)ο?#xff0c;將功能封裝進(jìn)對(duì)象,強(qiáng)調(diào)具備了功能的對(duì)象。
- 面向?qū)ο蟾訌?qiáng)調(diào)運(yùn)用人類在日常的邏輯中采用的思想方法與原則,如抽象,分類,繼承,聚合,多態(tài)等。
- 面向?qū)ο蟮娜筇卣?#xff1a;封裝,繼承,多態(tài)。
/*
2>面向?qū)ο?#xff08;OOP)程序設(shè)計(jì)概述
1、 面向?qū)ο蟮某绦蚴怯蓪?duì)象組成的,每個(gè)對(duì)象包含對(duì)用戶公開的特定功能部分和隱藏的實(shí)現(xiàn)部分。
傳統(tǒng)的面向過程程序設(shè)計(jì)(結(jié)構(gòu)化程序設(shè)計(jì))通過設(shè)計(jì)一系列的過程(算法)來求解問題。一旦確定了這些過程,就要開始考慮存儲(chǔ)數(shù)據(jù)的適當(dāng)方式。(這就是常說的:算法+數(shù)據(jù)結(jié)構(gòu)=程序)。明確的來說,編程,首先要確定如何操作數(shù)據(jù),然后決定如何組織數(shù)據(jù)的結(jié)構(gòu),以便于操作數(shù)據(jù)。但是,OOP卻調(diào)換了這個(gè)次序,將數(shù)據(jù)放在第一位,然后再考慮操作數(shù)據(jù)的算法2、總結(jié)
- 程序員從執(zhí)行者轉(zhuǎn)化成指揮者
- 完成需求時(shí)
? ?先去找具有所需功能的對(duì)象來用。
? ?如果該對(duì)象不存在,那么創(chuàng)建一個(gè)更具有所需功能的對(duì)象
? ?這樣簡化開發(fā)并提高復(fù)用。
- class類和object對(duì)象時(shí)面向?qū)ο蟮暮诵母拍?/li>
? ?類是對(duì)一類事物的描述,是抽象的、概念上的定義。
? ?對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱實(shí)例
- 萬事萬物皆對(duì)象
- 面向?qū)ο笤O(shè)計(jì)程序的重點(diǎn)是類的設(shè)計(jì)
- 定義類其實(shí)是定義類中的成員(成員變量和成員方法)
3、面向?qū)ο笏枷氲穆涞胤▌t一:
- 設(shè)計(jì)類并設(shè)計(jì)類的成員(成員變量以及成員方法)。
- 通過類,來創(chuàng)建類的對(duì)象(類的實(shí)例化)。
- 通過"對(duì)象.屬性 對(duì)象.方法"來調(diào)用,完成相應(yīng)的功能。
二、對(duì)象與類
1>類
1.1 java類及類的成員
1.1.1 描述類的兩種方法:屬性、行為。
- 屬性對(duì)應(yīng)類中的成員變量
? 屬性=成員變量
- 行為對(duì)應(yīng)類中的成員方法
? 成員方法=函數(shù)
例一:
//類是抽象的例二:
public1.2 類的內(nèi)存解析
1.3 java類的屬性(成員變量)與局部變量
1.3.1 相同點(diǎn):
- 遵循變量聲明的格式
- 都有作用域
1.3.2 不同點(diǎn):
- 聲明位置的不同。
? 成員變量:聲明在類里,方法外
? 局部變量:聲明在方法內(nèi),方法的形參部分,代碼塊內(nèi)。
- 成員變量的修飾符有四個(gè):public private protected 缺省
? 局部變量沒有修飾符:與所在方法的修飾符相同。
- 初始化值:一定會(huì)有初始化值
? 成員變量:如果在聲明的時(shí)候,不顯示的賦值,不同的數(shù)據(jù)類型會(huì)有不同的默認(rèn)初始化值
? 局部變量: 一定要顯示的賦值。(局部變量沒有默認(rèn)初始化值)
- 二者內(nèi)存中存放的位置不同:成員變量存在于堆空間中;局部變量:棧空間中
1.4 類的方法:提供某種功能的實(shí)現(xiàn)
- 例:
格式: 權(quán)限修飾符 返回值類型(void : 無返回值/具體的返回值類型)
返回值將會(huì)返回給當(dāng)前的對(duì)象
類中的方法可以訪問類中的成員變量
1.4.1 重載
public以上的代碼就是一個(gè)方法的重載
- 重載的定義:有著相同的方法名,相同的返回類型,不同的參數(shù)(個(gè)數(shù)不同,類型不同),就構(gòu)成了重載。
再往深了說,Java中,重載可以用于一切方法,包括構(gòu)造方法(構(gòu)造器)。
? 注釋:要完整的描述一個(gè)方法,需要指定方法名以及參數(shù)類型。叫做這個(gè)方法的簽名。然而返回類型不是簽名的一部分,也就是說,不能有兩個(gè)名字相同、參數(shù)類型也相同但卻有不同返回類型的方法。
1.4.2 方法參數(shù)
1.4.2.1 形參與實(shí)參
- 形參:方法聲明時(shí)的括號(hào)里的參數(shù)
- 實(shí)參:調(diào)用方法時(shí)實(shí)際傳入的參數(shù)
1.4.2.2 java中的傳遞機(jī)制------值傳遞
- 值傳遞和地址傳遞:
? 值傳遞:表示方法接收的是調(diào)用者提供的值。
? 地址傳遞:表示方法接收的是調(diào)用者提供的變量地址(典型的就是C語言中的指針)
- 參數(shù)為基本數(shù)據(jù)類型的值傳遞:
? 假如要寫一個(gè)方法,這個(gè)方法的功能是交換 a b 的值
public? 內(nèi)存解析如下:
? 那我們考慮一個(gè)有效的寫法:
//我們可以把要交換的一對(duì)值寫進(jìn)一個(gè)類里,并且把這個(gè)類實(shí)例化內(nèi)存解析如下:
那直接交換的內(nèi)存解析是什么呢?不妨動(dòng)手畫一畫吧!
1.5 類的構(gòu)造器:
類的第三個(gè)成員:構(gòu)造器(構(gòu)造方法)。
1.5.1構(gòu)造器的作用:
- 創(chuàng)建對(duì)象
- 給創(chuàng)建的對(duì)象的屬性賦值
- 初始化屬性
1.5.2 空構(gòu)造器
設(shè)計(jì)類時(shí),若不顯示聲明類的構(gòu)造器的話,程序會(huì)默認(rèn)提供一個(gè)空的構(gòu)造器
構(gòu)造器寫法如下
//構(gòu)造器函數(shù)名與類名一樣1.5.3 一旦顯示的定義類的構(gòu)造器,那么默認(rèn)的構(gòu)造器就不再提供。
1.5.4 格式
? 聲明類的構(gòu)造器,
? 格式: 權(quán)限修飾符 類名(形參){}
1.5.5 構(gòu)造器的重載
? 類的構(gòu)造器之間也可以構(gòu)成重載
1.5.6 屬性的賦值的先后順序:
? 屬性的默認(rèn)初始化值,屬性的顯示賦值(要在構(gòu)造器賦值的前面),構(gòu)造器的初始化值,通過對(duì)象的.方法的方式給屬性賦值。
1.6 this關(guān)鍵字
- 可以用來修飾屬性、方法、構(gòu)造器
- this理解為當(dāng)前對(duì)象或當(dāng)前正在創(chuàng)建的對(duì)象:this.name,this.show();
- this(形參):可以用來顯示的調(diào)用當(dāng)前類的重載的構(gòu)造器,必須放在首行。
- tihs()使用次數(shù)有限制
1.7 static------靜態(tài)字段與靜態(tài)方法
static 靜態(tài)的 可以用來修飾屬性 方法 代碼塊(初始化塊) 內(nèi)部類
1.7.1 修飾屬性(類變量):
- 由類創(chuàng)建的所有的對(duì)象,都共用這一個(gè)屬性,也可以這樣說,靜態(tài)變量屬于類,而不屬于任何單個(gè)的對(duì)象。
- 當(dāng)其中一個(gè)對(duì)象對(duì)此屬性進(jìn)行修改,會(huì)導(dǎo)致其他對(duì)象對(duì)此屬性的一個(gè)調(diào)用。
- 類變量隨著類的加載而加載(不依據(jù)實(shí)體對(duì)象的存在)
- 靜態(tài)的變量可以直接通過“類.類變量”的形式來調(diào)用
- 類變量的加載是要早于對(duì)象的,所有當(dāng)有對(duì)象以后,可以“對(duì)象.類變量” 但是“類.實(shí)例變量”是不行的
- 類變量存在于靜態(tài)域中
2、修飾方法(類方法):
- 隨著類的加載而加載,在內(nèi)存中也是獨(dú)一份
- 可以直接通過“類.方法”的方式來調(diào)用
- 內(nèi)部可以調(diào)用靜態(tài)的屬性或者靜態(tài)的方法,而不能調(diào)用非靜態(tài)的屬性或者方法。反之,非靜態(tài)的方法是可以調(diào)用靜態(tài)的屬性或者方法
1.8 關(guān)鍵字final
最終的,可以用來修飾類,屬性,方法
1.8.1 修飾類,這個(gè)類不可以被繼承。
1.8.2 修飾方法,這個(gè)方法不可以被重寫
1.8.3 final修飾屬性,此屬性就是一個(gè)常量,用大寫字符去表示
? 此常量在那里賦值:a.不能使用默認(rèn)初始化 b.可以顯示的賦值,代碼塊,構(gòu)造器
1.8.4 static final 修飾的是 全常量
1.9 初始化塊(類的第四個(gè)成員)的應(yīng)用
代碼塊是什么呢?如下:
class1.9.1 關(guān)于屬性賦值的幾種操作方法:
- 通過默認(rèn)的初始化
- 通過顯示的初始化或代碼塊初始化(按照順序結(jié)構(gòu)執(zhí)行)
- 通過構(gòu)造器
- 通過方法
- 通過代碼塊:如果有修飾符,修飾符只能是static
1.9.2 分類:
- 非靜態(tài)代碼塊:
? a.可以對(duì)類的屬性(靜態(tài),非靜態(tài))進(jìn)行賦值,同時(shí)也可以調(diào)用本類聲明的方法
? b.可以有輸出語句
? c.一個(gè)類可以有多個(gè)非靜態(tài)的代碼塊,多個(gè)代碼塊之間按照順序結(jié)構(gòu)執(zhí)行
? d.每創(chuàng)建一個(gè)類,非靜態(tài)的代碼塊就加載一次
? e.非靜態(tài)的代碼塊的執(zhí)行要早于構(gòu)造器
? f.代碼塊與實(shí)例字段按照順序執(zhí)行
- 靜態(tài)代碼塊(修飾符為static):
? a.與靜態(tài)的屬性和方法一樣,只加載一次。
? b.加載早于非靜態(tài)的
? c.多個(gè)靜態(tài)代碼塊之間按照順序執(zhí)行
? d.靜態(tài)的代碼塊中只能執(zhí)行靜態(tài)的結(jié)構(gòu)(類屬性,類方法)
? e.隨著類的加載而加載
1.9.3 代碼內(nèi)含構(gòu)造器與代碼塊的處理步驟:
- [x] 如果構(gòu)造器的第一行調(diào)用了另一個(gè)構(gòu)造器,則基于所提供的參數(shù)執(zhí)行第二個(gè)構(gòu)造器
- [x] 否則
- 所有數(shù)據(jù)字段初始化為其默認(rèn)值(0、false或null)
- 按照在類聲明中出現(xiàn)的順序,執(zhí)行所有字段初始化方法和初始化塊
- [x] 執(zhí)行構(gòu)造器主體代碼
2>對(duì)象與實(shí)例化
2.1 對(duì)象與對(duì)象變量
2.1.1 對(duì)象與對(duì)象變量
- 先看如下代碼:
- 對(duì)象變量: 代碼中的 Person person Person person1 的 person person1 都是對(duì)象變量
- 對(duì)象:代碼中的new出來的就是對(duì)象,這個(gè)對(duì)象就是由構(gòu)造器創(chuàng)建的。
- 我們來看看 他的內(nèi)存解析:
2.1.2 類的實(shí)例化
在Java程序設(shè)計(jì)語言中,要用構(gòu)造器構(gòu)造新實(shí)例。構(gòu)造器是一種特殊的方法,用來構(gòu)造并初始化對(duì)象。創(chuàng)造對(duì)象的這個(gè)過程就稱為類的實(shí)例化的過程。
2.2 用var聲明局部變量
在java10中如果可以從變量的初始值推導(dǎo)出他們的類型,那么可以用var關(guān)鍵字聲明這個(gè)卡局部變量。
例如:
Person從現(xiàn)在開始倘若無需了解任何Java API 就能從等號(hào)右邊明顯看出類型,在這種情況下我們都將使用var表示法。
但是,我們不會(huì)對(duì)數(shù)值類型使用var,如 int long double。
3>類之間的三大關(guān)系
3.1 依賴
? 依賴是一種最明顯的、最常見的關(guān)系。簡單來說,如果一個(gè)類的方法使用或操作另一個(gè)類的對(duì)象,我們可以說一個(gè)類依賴于另一個(gè)類。我們編寫了一個(gè)賬戶類和訂單類,而我們要考慮到在賬戶下訂單的時(shí)候,訂單類會(huì)訪問賬戶類的對(duì)象來查看信用狀態(tài),由此,構(gòu)成了訂單類使用或操作了賬戶類,所以訂單類依賴賬戶類。? 應(yīng)該注意的是,應(yīng)該盡可能的減少相互依賴的類減至最少。智利的關(guān)鍵是,如果類A不知道B的存在,它就不會(huì)關(guān)心B的任何改變(這意味著B的改變不會(huì)導(dǎo)致A產(chǎn)生任何bug)。用軟件工程的術(shù)語來講,就是盡可能減少類之間的“耦合”。
3.2 聚合
? 簡單來說就是 一個(gè)類包含著另一個(gè)類3.3 繼承
? 繼承是面向?qū)ο笾泻苤匾囊粋€(gè)概念,我們會(huì)在后面深入討論。? 所以我們?cè)谶@里留一個(gè)懸念,到后面我們深入交流~~~
4>類要具有封裝性
4.1 什么是封裝性?
封裝性,就是指,一個(gè)類的成員變量是被封裝起來的,不可以在類的外部直接訪問,而是要通過方法來訪問,操作它。
4.2 為什么要有封裝性
如果一個(gè)字段沒有被封裝起來,那么外部操作修改他的“搗蛋者”可能出現(xiàn)在任何地方,這樣不利于調(diào)試。但是,如果封裝起來,只有這個(gè)成員的變量的訪問器和修改器可以訪問與操作他,我們只需要調(diào)試兩個(gè)方法就可以。
4.3 如何做到封裝性
- 看如下代碼
以上為一個(gè)具有封裝性的類
我們來分析它
4.3.1 需要私有的數(shù)據(jù)字段
什么是”私有的“? 就是用private關(guān)鍵字修飾的
我們下來介紹幾個(gè)權(quán)限修飾符的關(guān)鍵字(按照權(quán)限從大到小排序):
- public 權(quán)限最大,被修飾的成員變量和成員方法可以在任意地方被訪問
- protect 被修飾的成員變量和成員方法只能在本包中被訪問以及被子類(繼承的內(nèi)容,后面會(huì)談到)訪問。
- default 默認(rèn)修飾符,比如 我們?cè)?int a; 看起來是沒有加任何權(quán)限修飾符,實(shí)際上它是default的,即只能在本包中被訪問
- private 權(quán)限最小,只能在本類中被訪問
4.3.2 一個(gè)公共的字段訪問器方法
就是上面代碼中的get方法
4.3.3 一個(gè)公共的字段修改器方法
就是上面代碼的set方法
5>類設(shè)計(jì)技巧
5.1 一定要保證數(shù)據(jù)私有
5.2 一定要對(duì)數(shù)據(jù)進(jìn)行初始化
5.3 不要在類中使用過多的基本類型
? 這個(gè)想法是要用其他的類替換使用多個(gè)相關(guān)的基本類型。這樣會(huì)使得類更易于理解,也更易于修改。例如,用一個(gè)名為Address的新類替換一個(gè)Customer類中一下的實(shí)例字段:
private5.4 不是所有的字段都需要單獨(dú)的字段訪問器和字段更改器
? 例如你要設(shè)計(jì)一個(gè)Employee類,要設(shè)置員工的雇傭日期,一旦實(shí)例化以后就不會(huì)再更改,所以雇傭日期字段不需要訪問器和更改器
5.5 分解有過多職責(zé)的類
5.6 類名和類方法名要體現(xiàn)他們的職責(zé)
5.7 優(yōu)先使用不可變類
總結(jié)
以上是生活随笔為你收集整理的java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光伏项目路条费大约多少?路条费怎么给?
- 下一篇: 戴尔g15咋开vt