1、面向過程與面向對象的思想
面向對象: 我該讓誰來做
面向過程: 我該怎麼做
2、大象裝冰箱
我們把大象裝冰箱為例進行分析。
在針對具體的需求,可以使用名詞提煉的辦法進行分析,尋找具體的對象。
需求:把大象裝冰箱裡
對象:大象、冰箱
分三步:
1、打開冰箱門
2、将大象裝進去
3、關閉冰箱門
分析發現打開、裝、關閉都是冰箱的功能。即冰箱對象具備如下功能:
冰箱打開
冰箱存儲
冰箱關閉
用僞代碼描述,上述需求中有兩個具體的事物 大象 和 冰箱
描述大象:
class 大象
{
}
描述冰箱
class冰箱
void 打開(){}
void 存儲(大象){}
void 關閉(){}
當把具體的事物描述清楚之後,需要使用這些具體的事物,Java使用具體的事物,需要通過new關鍵字來建立這個事物的具體執行個體。
使用對象:
1、建立冰箱的對象
冰箱 bx = new 冰箱();
2、調用冰箱的功能
對象.功能();
bx.打開();
bx.存儲(new 大象());
bx.關閉();
總結:
1、先按照名詞提煉問題領域中的對象
2、對對象進行描述,其實就是在明确對象中應該具備的屬性和功能
3、通過new的方式就可以建立該事物的具體對象
4、通過該對象調用它以後的功能。
3、對象的記憶體圖
方法進棧,類進堆
4、成員變量和局部變量的差别
成員變量:定義在類中的
局部變量:定義在方法中的變量
差別:
1)定義位置上的差別
成員變量:定義在類中,方法外
局部變量:定義在方法中,語句内
2)作用域不同
成員變量:作用範圍是整個類
局部變量:作用範圍是方法内,語句内
3)預設值不同
成員變量:有自己的預設值
局部變量:沒有預設值,不指派不能使用
4)記憶體位置不同
成員變量:跟着對象進入堆記憶體存儲
局部變量:跟着方法進棧記憶體
5)生命周期不同
成員變量:跟着對象,在堆中存儲,記憶體等待JVM清理
局部變量:跟着方法,方法出棧,生命周期較短
5、方法參數是基本資料類型 或 引用資料類型
public class Person {
String name ;
/*
-
方法的參數類型,是基本資料類型,引用資料類型
*/
public class TestPerson {
public static void main(String[] args) {
int a = 1;
function(a);
System.out.println(a);
Person p = new Person();
p.name = "張三";
System.out.println(p.name);
function(p);
System.out.println(p.name);
}
/*
* 定義方法,參數類型是引用資料類型
* 參數是Person類型
* p接受的是一個記憶體的位址
* main 中的變量p
* function 中的變量p 儲存的位址是一樣的
*/
public static void function(Person p){
p.name = "李四";
}
/*
* 定義方法,參數類型是基本資料類型
*/
public static void function(int a){
a+=5;
}
6、封裝
将具體功能封裝到方法中,學習對象時,也提過将方法封裝在類中,其實這些都是封裝。
封裝,它也是面向對象思想的特征之一。面向對象共有三個特征:封裝,繼承,多态。接下來我們具體學習封裝。
封裝表現:
1、方法就是一個最基本封裝體。
2、類其實也是一個封裝體。
從以上兩點得出結論,封裝的好處:
1、提高了代碼的複用性。
2、隐藏了實作細節,還要對外提供可以通路的方式。便于調用者的使用。這是核心之一,也可以了解為就是封裝的概念。
3、提高了安全性。
7、private關鍵字
- 新的關鍵字 private 私有 屬于成員修飾符,不能修飾局部變量
- 被private修飾的成員,隻能在自己的本類中被使用
- cn.itcast.demo04;
- 描述現實生活中的人的事物
- 屬性: 姓名 年齡
- 功能: 說話
- 出現安全問題: age問題,可能出現指派為負數的情況
- 負數不會導緻程式問題,違反生活中的真實情況
- 提高安全問題: 讓外面的類,不允許直接調用我的成員變量
- 對私有變量,提供公共的通路方式: 方法
//人的姓名,成員變量
String name;
//人的年齡,成員變量
private int age ;
//變量age被私有,提供方法,讓外面的類使用
//定義方法,對age變量進行指派,方法名字,必須set開頭
public void setAge(int a){
//對變量參數a進行範圍的限制
if(a<0 || a > 200){
//如果a超過範圍,手動将age指派為20
age = 20;
}else{
//如果a沒有超過範圍,直接對age指派
age = a;
}
}
//定義方法,對變量age擷取值使用,方法名字get
public int getAge(){
return age;
}
//定義人的說話功能,方法中,要求說出自己的姓名和年齡
public void speak(){
System.out.println(name+"..."+age);
}
package cn.itcast.demo04;
- 定義好的Person類進行測試
- 建立對象,對象調用屬性和方法
public class PersonTest {
public static void main(String[] args) {
//建立Person類的對象 new
Person p = new Person();
//對成員變量指派
//p.age = -200;
//對成員變量age指派,隻能調用Set方法指派
p.setAge(50);
p.name = "張三";
//調用類中方法
p.speak();
//輸出成員變量age值,必須調用get方法
System.out.println(p.getAge());
}
類中不需要對外提供的内容都私有化,包括屬性和方法。
以後再描述事物,屬性都私有化,并提供setXxx getXxx方法對其進行通路。
8、私有化Person類帶get,set
私有化所有的屬性(成員變量),必須有對應的get與set方法
凡是自定義的類,都必須有get與set方法
package cn.itcast.demo05;
- 類描述人:
- 屬性: 姓名和年齡
- 方法: 說話
- 私有化所有的屬性 (成員變量) ,必須寫對應的get/set方法
- 凡是自定義的類,自定義成員變量,應該私有化,提供get/set
- this關鍵字:
- 區分成員變量和局部變量同名情況
- 方法中,方位成員變量,寫this.
private String name;
private int age;
// set方法,變量name,age指派
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
// get方法,變量name,age擷取值
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void speak() {
String name = "哈哈";
int age = 16;
System.out.println("人在說話 " + this.name + "..." + this.age);
}
public static void main(String[] args) {
Person p = new Person();
//調用set方法,對成員變量指派
p.setAge(18);
p.setName("旺财");
p.speak();
//調用get方法,擷取成員變量的值
// System.out.println(p.getName());
// System.out.println(p.getAge());
}
9、this關鍵字——用于解決成員變量和局部變量的重名問題
方法中的局部變量和類中的成員變量,采用就近原則進行變量擷取
由于存在成員變量和局部變量同名的情況,此時需要this關鍵字
所有this.的變量都是類中的成員變量
10、知識點總結
類與對象
類,用于描述多個對象的共同特征,它是對象的模闆。
對象,用于描述現實中的個體,它是類的執行個體。
類的定義:使用關鍵字class來定義java中的類
格式:
class 類名 {
//屬性
資料類型 變量名;
…
//方法
修飾符 傳回值類型 方法名(參數){ }
…
}
建立對象:
類名 對象名 = new 類名();
封裝(private關鍵字)
封裝,把對象的屬性與方法的實作細節隐藏,僅對外提供一些公共的通路方式
封裝的展現:
變量:使用 private 修飾,這就是變量的封裝
方法:也是一種封裝,封裝了多條代碼
類: 也是一種封裝,封裝了多個方法
private關鍵字,私有的意思
它可以用來修飾類中的成員(成員變量,成員方法)
private的特點:
private修飾的成員隻能在目前類中通路,其他類中無法直接通路
this關鍵字
this關鍵字,本類對象的引用
this是在方法中使用的,哪個對象調用了該方法,那麼,this就代表調用該方法的對象引用
this什麼時候存在的?當建立對象的時候,this存在的
this的作用:用來差別同名的成員變量與局部變量(this.成員變量)
public void setName(String name) {
this.name = name;
}
