“簡單不先于復(fù)雜捏萍,而是在復(fù)雜之后.” —— Alan Perlis
面向過程的程序設(shè)計:
面向過程,一種較早的編程思想譬重,在過程的角度思考問題午磁,強(qiáng)調(diào)的就是功能行為,功能的執(zhí)行過程,即先干什么,后做什么搭盾。每一個功能都使用函數(shù)實現(xiàn)
面向?qū)ο蟮某绦蛟O(shè)計(OOP):
面向?qū)ο蟪绦蛟O(shè)計,顧名思義,該思想是站在對象的角度思考問題,我們把多個功能合理的放到不同對象里茅撞,強(qiáng)調(diào)的是具備某些功能的對象.
面向?qū)ο蟪绦蛟O(shè)計是當(dāng)今主流的程序設(shè)計規(guī)范,更加適合使用于解決規(guī)模較大的問題,但是千萬不要誤解為面向?qū)ο笠欢ň蛢?yōu)于面向過程的設(shè)計.
面向?qū)ο笕筇卣鳎?/h4>
封裝(Encapsulation):將對象的實現(xiàn)細(xì)節(jié)隱藏起來,然后通過公共的方法來向外暴露該對象的功能
繼承(Inheritance):當(dāng)子類繼承父類后巨朦,子類是一種特殊的父類米丘,能直接或間接獲得父類里的成員。
多態(tài)(Polymorphism):可以直接把子類對象賦給父類變量糊啡,但是運(yùn)行時依然表現(xiàn)出子類的行為特征拄查,這意味著同一類型的對象在運(yùn)行時可能表現(xiàn)出不同的行為特征。
面向?qū)ο?jpeg
這是分割線.jpg
抽象
封裝(Encapsulation):將對象的實現(xiàn)細(xì)節(jié)隱藏起來,然后通過公共的方法來向外暴露該對象的功能
繼承(Inheritance):當(dāng)子類繼承父類后巨朦,子類是一種特殊的父類米丘,能直接或間接獲得父類里的成員。
多態(tài)(Polymorphism):可以直接把子類對象賦給父類變量糊啡,但是運(yùn)行時依然表現(xiàn)出子類的行為特征拄查,這意味著同一類型的對象在運(yùn)行時可能表現(xiàn)出不同的行為特征。
抽象是指從特定的角度出發(fā)棚蓄,從已經(jīng)存在的一些事物中抽取我們所關(guān)注的特性堕扶、行為,從而形成一個新的事物的思維過程梭依,是一種從復(fù)雜到簡潔的思維方式稍算。
類
類(Class)定義了一件事物的抽象特點(diǎn)。通常來說睛挚,類定義了事物的屬性和它可以做到的(它的行為)邪蛔。
具有相同特性(狀態(tài))和行為(功能)的對象的抽象就是類
舉例來說,“人”這個類會包含人的一切基礎(chǔ)特征,即所有“人”都共有的特征或行為侧到,例如有眼睛,有鼻子,會吃飯勃教。
代碼
public class User {
private String name;
private int age;
public void eat() {
System.out.println("");
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
對象
對象(Object)是類的實例。
例如匠抗,“狗”這個類列舉狗的特點(diǎn)故源,從而使這個類定義了世界上所有的狗。而萊絲這個對象則是一條具體的狗汞贸,它的屬性也是具體的绳军。狗有皮毛顏色,而萊絲的皮毛顏色是棕白色的矢腻。因此门驾,萊絲就是狗這個類的一個實例。一個具體對象屬性的值被稱作它的“狀態(tài)”多柑。(系統(tǒng)給對象分配內(nèi)存空間奶是,而不會給類分配內(nèi)存空間。這很好理解竣灌,類是抽象的系統(tǒng)不可能給抽象的東西分配空間聂沙,而對象則是具體的。)
對象: 對象是唯一的
創(chuàng)建對象:類名 對象名 = new 類名()
使用對象:對象.屬性 / 對象.方法名()
總結(jié):對象是類的實例初嘹,類是對象的抽象及汉。
JAVA中set() 和 get() 方法的理解及使用
set是設(shè)置的意思,而get是獲取的意思屯烦,比如setAge()和getAge()坷随,表示設(shè)置年齡和獲取年齡
然后我們來了解一下JAVA面向?qū)ο缶幊讨械姆忾]性和安全性,封閉性即對類中的域變量進(jìn)行封閉操作漫贞,即用private來修飾他們甸箱,如此一來其他類則不能對該變量訪問。這樣我們就將這些變量封閉在了類內(nèi)部迅脐,這樣就提高了數(shù)據(jù)的安全性芍殖,當(dāng)我們想要操作這些域變量怎么辦呢?我們可以通過兩種方法谴蔑,第一中即通過public方式的構(gòu)造器(或稱構(gòu)造函數(shù))豌骏,對象一實例化就對該變量賦值。第二種就是通過上面提到的set和get方法隐锭,這里我舉一個特定的例子窃躲,我定義一個Person類,該類中有name钦睡、age這兩個私有域變量蒂窒,然后我定義setname()、getname()、setage()洒琢、getage()這四個方法秧秉,通過這四個方法來實現(xiàn)對name和age的操作。這樣一來衰抑,我不用直接對Person類中的域變量操作象迎,而是通過set和get方法間接地操作這些變量,這樣就能提高域變量的安全性呛踊,同時又保證了域變量的封裝型砾淌。
set和get方法的使用場景,一般來說set和get方法都是對私有域變量進(jìn)行操作的谭网,所以大多數(shù)都是使用在包含特定屬性的類實體中汪厨。
代碼
public class UserAccount {
private String userName;
private String sex;
public void setUserName(String name) {
userName = name;
}
public String getUserName() {
return userName;
}
public void setSex(String str) {
if (str.equals("男") || str.equals("女")) {
sex = str;
} else {
sex = "男";
}
}
public String getSex() {
return sex;
}
}
封裝
概念
- 將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問蜻底,而是通過該類提供的方法類實現(xiàn)對隱藏信息的操作和訪問骄崩。
優(yōu)點(diǎn)
- 隱藏實際細(xì)節(jié),提供公共的訪問方式
- 提高了代碼的復(fù)用性
- 提高安全性
- 封裝原則
- 將不需要對外提供的內(nèi)容都隱藏起來
- 把屬性隱藏薄辅,提供公共方法對其訪問
實現(xiàn)步驟
① 修改屬性的可見性:設(shè)為private
② 創(chuàng)建getter/setter方法:用于屬性的讀寫
③ 在getter/setter方法中加入屬性控制語句:對屬性值的合法性進(jìn)行判斷
構(gòu)造函數(shù)
構(gòu)造函數(shù)的作用: 給對應(yīng)的對象進(jìn)行初始化。
構(gòu)造函數(shù)的定義的格式:
修飾符 函數(shù)名(形式參數(shù)){
函數(shù)體...
}
構(gòu)造函數(shù)要注意的細(xì)節(jié):
- 構(gòu)造函數(shù) 是沒有返回值類型的抠璃。
- 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致站楚。
- 構(gòu)造函數(shù)并不是由我們手動調(diào)用的,而是在創(chuàng)建對應(yīng)的對象時搏嗡,jvm就會主動調(diào)用到對應(yīng)的構(gòu)造函數(shù)窿春。
- 如果一個類沒有顯式的寫上一個構(gòu)造方法時,那么java編譯器會為該類添加一個無參的構(gòu)造函數(shù)的采盒。
- 如果一個類已經(jīng)顯式的寫上一個構(gòu)造方法時,那么java編譯器則 不會再為該類添加 一個無參 的構(gòu)造方法旧乞。
- 構(gòu)造函數(shù)是 可以在一個類中以函數(shù)重載 的形式存在多個 的。
構(gòu)造函數(shù)與普通 函數(shù)的區(qū)別:
- 返回值類型的區(qū)別:
- 構(gòu)造函數(shù)是沒有返回值類型 的磅氨,
- 普通函數(shù)是有返回值類型的尺栖,即使函數(shù)沒有返回值,返回值類型也要寫上void烦租。
- 函數(shù)名的區(qū)別:
- 構(gòu)造函數(shù)的函數(shù)名必須要與類名一致延赌,
- 普通函數(shù)的函數(shù)名只要符合標(biāo)識符的命名規(guī)則即可。
- 調(diào)用方式的區(qū)別:
- 構(gòu)造函數(shù)是 在創(chuàng)建對象的時候由jvm調(diào)用的叉橱。
- 普通函數(shù)是由我們使用對象調(diào)用的挫以,一個對象可以對象多次普通 的函數(shù),
- 作用上的區(qū)別:
- 構(gòu)造函數(shù) 的作用用于初始化一個對象窃祝。
- 普通函數(shù)是用于描述一類事物的公共行為的掐松。
代碼
以下Baby類中提供了兩個構(gòu)造函數(shù):
//嬰兒類
class Baby{
int id; //身份證
String name; //名字
//構(gòu)造函數(shù)
public Baby(int i , String n){
id = i;
name = n;
System.out.println("baby的屬性初始化完畢!!");
}
//無參 的構(gòu)造函數(shù)
public Baby(){
System.out.println("無參的構(gòu)造函數(shù)被調(diào)用了..");
}
public void cry(){
System.out.println(name+"哇哇哭...");
}
}
this關(guān)鍵字
- this關(guān)鍵字代表了所屬函數(shù)的調(diào)用者對象大磺。
this關(guān)鍵字作用:
- 如果存在同名成員變量與局部變量時抡句,在方法內(nèi)部默認(rèn)是訪問局部變量的數(shù)據(jù),可以通過this關(guān)鍵字指定訪問成員變量的數(shù)據(jù)量没。
- 在一個構(gòu)造函數(shù)中可以調(diào)用另外一個構(gòu)造函數(shù)初始化對象玉转。
this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項:
- 存在同名的成員變量與局部變量時,在方法的內(nèi)部訪問的是局部變量(java 采取的是“就近原則”的機(jī)制訪問的殴蹄。)
- 如果在一個方法中訪問了一個變量究抓,該變量只存在成員變量的情況下,那么java編譯器會在該變量的 前面添加this關(guān)鍵字袭灯。
this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)要注意的事項:
- this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時刺下,this關(guān)鍵字必須要位于構(gòu)造函數(shù)中 的第一個語句。
- this關(guān)鍵字在構(gòu)造函數(shù)中不能出現(xiàn)相互調(diào)用 的情況稽荧,因為是一個死循環(huán)橘茉。
static關(guān)鍵字
- static靜態(tài)變量(也稱類成員)
- 它屬于整個類所有,而不是某個對象所有姨丈,被類的所有對象所共享畅卓。
- 靜態(tài)成員可使用類名直接訪問,也可以使用對象名進(jìn)行訪問蟋恬。
- 靜態(tài)成員屬于整個類翁潘,當(dāng)系統(tǒng)第一次使用該類時,就會為其分配內(nèi)存空間直到該類被卸載才會進(jìn)行資源回收歼争。
static靜態(tài)函數(shù)
1. static修飾成員變量 :如果有數(shù)據(jù)需要被共享給所有對象使用時拜马,那么就可以使用static修飾。
靜態(tài)成員變量的訪問方式:
方式1: 可以使用對象進(jìn)行訪問沐绒。
格式: 對象.變量名俩莽。
方式二: 可以使用類名進(jìn)行訪問。
格式: 類名.變量名;
注意:
1. 非靜態(tài)的成員變量只能使用對象進(jìn)行訪問乔遮,不能使用類名進(jìn)行訪問扮超。
2. 千萬不要為了方便訪問數(shù)據(jù)而使用static修飾成員變量,只有成員變量的數(shù)據(jù)是真正需要被共享的時候
才使用static修飾申眼。
static修飾成員變量的應(yīng)用場景: 如果一個數(shù)據(jù)需要被所有對象共享使用的時候瞒津,這時候即可好實用static修飾。
靜態(tài)代碼塊:
static {
/// 要執(zhí)行的語句
}
static(靜態(tài)括尸、修飾符)
static修飾成員變量時:static修飾成員變量時,那么該成員變量的數(shù)據(jù)就是一個共享的數(shù)據(jù).
靜態(tài)成員變量的訪問方式:
方式一: 使用對象進(jìn)行訪問巷蚪。
對象.屬性名
方式二:可以使用類名進(jìn)行訪問。
類名.屬性名
注意:
1. 非靜態(tài)成員變量不能類名直接訪問濒翻,只能使用對象進(jìn)行訪問屁柏。
2. 千萬不要為了方便訪問成員變量而使用static修飾啦膜,一定要是該數(shù)據(jù)是共享數(shù)據(jù) 時才使用static修飾。
static修飾方法(靜態(tài)的成員方法):
訪問方式:
方式一:可以使用對象進(jìn)行訪問淌喻。
對象.靜態(tài)的函數(shù)名();
方式二:可以使用類名進(jìn)行訪問僧家。
類名.靜態(tài)函數(shù)名字。
推薦使用是類名直接訪問靜態(tài)的成員裸删。