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