主要内容:
- 面向對象
- 類與對象
- 三大特征 ——封裝
- 構造方法
目錄
第 1章 面向對象思想
1.1 面向對象思想概述
1.2 類和對象
1.3 類的定義
1.4 對象的使用
1.5 類與對象的練習
1.6 對象記憶體圖
1.7 成員變量和局部變量差別
第 2章 封裝
2.1 封裝概述
2.2 封裝的步驟
2.3 封裝的操作——private關鍵字
2.4 封裝優化1——this關鍵字
2.5 封裝優化2——構造方法
2.6 标準代碼——JavaBean
第 1章 面向對象思想
1.1 面向對象思想概述
概述:
Java語言是一種面向對象的程式設計語言,而面向對象思想是一種程式設計思想,我們在面向對象思想的指引下,
使用Java語言去設計、開發計算機程式。 這裡的對象泛指現實中一切事物,每種事物都具備自己的屬性和行為。面
向對象思想就是在計算機程式設計過程中,參照現實中事物,将事物的屬性特征、行為特征抽象出來,描述成計算
機事件的設計思想。 它差別于面向過程思想,強調的是通過調用對象的行為來實作功能,而不是自己一步一步的去
操作實作。
舉例:
面向過程:把衣服脫下來 -->找一個盆-->放點洗衣粉-->加點水-->浸泡10分鐘-->揉一揉-->清洗衣服-->擰幹-->晾起來
面向對象:把衣服脫下來 -->打開全自動洗衣機-->扔衣服-->按鈕-->晾起來
差別:
面向過程:強調步驟。
面向對象:強調對象,這裡的對象就是洗衣機
特點:
面向對象思想是一種更符合我們思考習慣的思想,它可以将複雜的事情簡單化,并将我們從執行者變成了指揮者。
面向對象的語言中,包含了三大基本特征,即封裝、繼承和多态。
1.2 類和對象
什麼是類???
類 :是一組相關屬性和行為的集合。可以看成是一類事物的模闆,使用事物的屬性特征和行為特征來描述該
類事物。
- 屬性 :就是該事物的狀态資訊。
- 行為 :就是該事物能夠做什麼。
舉例:小貓
屬性:名字、體重、年齡、顔色。
行為:走、跑、叫。
什麼是對象???
對象 :是一類事物的具體展現。對象是類的一個執行個體,必然具備該類事物的屬性和行為。
舉例:一隻小貓
屬性:tom、5kg、2 years、yellow。
行為:溜牆根走、蹦跶的跑、喵喵叫。
類與對象的關系
類是對一類事物的描述,是抽象的。
對象是一類事物的執行個體,是具體的。
類是對象的模闆,對象是類的實體 。
1.3 類的定義
事物與類的對比
現實世界的一類事物:
屬性:事物的狀态資訊。 行為:事物能夠做什麼。
Java中用class描述事物也是如此:
成員變量:對應事物的屬性 成員方法:對應事物的行為
類的定義格式:
public class ClassName {
//成員變量
//成員方法
}
定義類 :就是定義類的成員,包括成員變量和成員方法。
成員變量 :和以前講解定義變量幾乎是一樣的。隻不過位置發生了改變。在類中,方法外。
成員方法 :和以前講解定義方法幾乎是一樣的。隻不過把static去掉,static的作用在面向對象後面會詳細說。
類的定義格式舉例:
public class Student {
//成員變量
String name;//姓名
int age;//年齡
//成員方法
//學習的方法
publicvoid study() {
System.out.println("好好學習,天天向上");
}
//吃飯的方法
publicvoid eat() {
System.out.println("學習餓了要吃飯");
}
}
1.4 對象的使用
格式:
建立對象:
類名 對象名 = new 類名();
使用對象通路類中的成員:
對象名.成員變量;
對象名.成員方法();
舉例:
public class Demo{
public static void main(String[] args) {
//建立對象格式:類名 對象名 = new 類名();
Student s = new Student();//建立1.3中的類對象
System.out.println("s:"+s); //[email protected]
//直接輸出成員變量值
System.out.println("姓名:"+s.name); //null
System.out.println("年齡:"+s.age); //0
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//給成員變量指派
s.name = "趙麗穎";
s.age = 18;
//再次輸出成員變量的值
System.out.println("姓名:"+s.name); //趙麗穎
System.out.println("年齡:"+s.age); //18
System.out.println("‐‐‐‐‐‐‐‐‐‐");
//調用成員方法
s.study(); // "好好學習,天天向上"
s.eat(); // "學習餓了要吃飯"
}
}
在案例中可以看到,在未給成員變量指派時,成員變量都有一個預設值:
基本類型 | 預設值 | |
基本類型 | 整數(byte,short,int,long) | |
浮點數(float,double) | 0.0 | |
字元(char) | '\u0000' | |
布爾(boolean) | false | |
引用類型 | 數組,類,接口 | null |
1.5 類與對象的練習
定義手機類:
public class Phone {
// 成員變量
String brand; //品牌
int price; //價格
String color; //顔色
// 成員方法
//打電話
public void call(String name) {
System.out.println("給"+name+"打電話");
}
//發短信
public void sendMessage() {
System.out.println("群發短信");
}
}
定義測試類:
public class Test02Phone {
public static void main(String[] args) {
//建立對象
Phone p = new Phone();
//輸出成員變量值
System.out.println("品牌:"+p.brand);//null
System.out.println("價格:"+p.price);//0
System.out.println("顔色:"+p.color);//null
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//給成員變量指派
p.brand = "錘子";
p.price = 2999;
p.color = "棕色";
//再次輸出成員變量值
System.out.println("品牌:"+p.brand);//錘子
System.out.println("價格:"+p.price);//2999
System.out.println("顔色:"+p.color);//棕色
System.out.println("‐‐‐‐‐‐‐‐‐‐‐‐");
//調用成員方法
p.call("紫霞");
p.sendMessage();
}
}
1.6 對象記憶體圖
下面對上面的例子在記憶體中調用過程進行講解:
通過上圖,我們可以了解,在棧記憶體中運作的方法,遵循"先進後出,後進先出"的原則。變量p指向堆記憶體中
的空間,尋找方法資訊,去執行該方法。
對象調用方法時,根據對象中方法标記(位址值),去類中尋找方法資訊。這樣哪怕是多個對象,方法資訊
隻儲存一份,節約記憶體空間。
一個引用,作為參數傳遞到方法中記憶體圖:
引用類型作為參數,傳遞的是位址值。
1.7 成員變量和局部變量差別
變量根據定義位置的不同,相對應的名字也就不同。如下圖所示:
成員變量和局部變量差別:
- 在類中的位置不同
成員變量:類中,方法外
局部變量:方法中或者方法聲明上 (形式參數)
- 作用範圍不一樣
成員變量:類中
局部變量:方法中
- 初始化值的不同
成員變量:有預設值
局部變量:沒有預設值。必須先定義,指派,最後使用
- 在記憶體中的位置不同
成員變量:堆記憶體
局部變量:棧記憶體
- 生命周期不同
成員變量:随着對象的建立而存在,随着對象的消失而消失
局部變量:随着方法的調用而存在,随着方法的調用完畢而消失
第 2章 封裝
2.1 封裝概述
面向對象程式設計語言是對客觀世界的模拟,客觀世界裡成員變量都是隐藏在對象内部的,外界無法直接操作和修改。
封裝可以被認為是一個保護屏障,防止該類的代碼和資料被其他類随意通路。要通路該類的資料,必須通過指定的
方式。适當的封裝可以讓代碼更容易了解與維護,也加強了代碼的安全性。
原則:
将屬性隐藏起來,若需要通路某個屬性,提供公共方法對其通路。
2.2 封裝的步驟
1. 使用 private 關鍵字來修飾成員變量。
2. 對需要通路的成員變量,提供對應的一對 getXxx 方法 、 setXxx 方法。
2.3 封裝的操作——private關鍵字
private的含義:
1. private是一個權限修飾符,代表最小權限。
2. 可以修飾成員變量和成員方法。
3. 被private修飾後的成員變量和成員方法,隻在本類中才能通路。
private的使用格式:
private 資料類型 變量名 ;
1. 使用 private 修飾成員變量,代碼如下:
public class Student {
private String name;
private int age;
}
2. 提供 getXxx 方法 / setXxx 方法,可以通路成員變量,代碼如下:
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
2.4 封裝優化1——this關鍵字
我們發現 setXxx 方法中的形參名字并不符合見名知意的規定,那麼如果修改與成員變量名一緻,是否就見名知意
了呢?代碼如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public void setAge(int age) {
age = age;
}
}
經過修改和測試,我們發現新的問題,成員變量指派失敗了。也就是說,在修改了 setXxx() 的形參變量名後,方
法并沒有給成員變量指派!這是由于形參變量名與成員變量名重名,導緻成員變量名被隐藏,方法中的變量名,無
法通路到成員變量,進而指派失敗。是以,我們隻能使用this關鍵字,來解決這個重名問題。
this的含義:
this代表所在類的目前對象的引用(位址值),即對象自己的引用。
注意:
方法被哪個對象調用,方法中的this就代表那個對象。即誰在調用,this就代表誰。
this使用格式:
this.成員變量名;
使用 this 修飾方法中的變量,解決成員變量被隐藏的問題,代碼如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
注意:
方法中隻有一個變量名時,預設也是使用 this 修飾,可以省略不寫。
2.5 封裝優化2——構造方法
當一個對象被建立時候,構造方法用來初始化該對象,給對象的成員變量賦初始值。
注意:
無論是否自定義構造方法,所有的類都有構造方法,因為Java自動提供了一個無參數構造方法,一旦自己定義了構造方法,Java自動提供的預設無參數構造方法就會失效。
構造方法的定義格式:
修飾符 構造方法名(參數清單){
// 方法體
}
構造方法的寫法上,方法名與它所在的類名相同。它沒有傳回值,是以不需要傳回值類型,甚至不需要void。使用
構造方法後,代碼如下:
public class Student {
private String name;
private int age;
// 無參數構造方法
public Student() {}
// 有參數構造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
注意事項:
1. 如果不提供構造方法,系統會給出無參數構造方法。
2. 如果提供了構造方法,系統将不再提供無參數構造方法。
3. 構造方法是可以重載的,既可以定義參數,也可以不定義參數。
2.6 标準代碼——JavaBean
JavaBean 是 Java語言編寫類的一種标準規範。符合 JavaBean 的類,要求類必須是具體的和公共的,并且具有無
參數的構造方法,提供用來操作成員變量的 set 和 get 方法。
public class ClassName{
//成員變量
//構造方法
//無參構造方法【必須】
//有參構造方法【建議】
//成員方法
//getXxx()
//setXxx()
}
編寫符合 JavaBean 規範的類,以學生類為例,标準代碼如下:
public class Student {
//成員變量
private String name;
private int age;
//構造方法
public Student() {}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成員方法
publicvoid setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
}
測試類,代碼如下:
public class TestStudent {
public static void main(String[] args) {
//無參構造使用
Student s= new Student();
s.setName("柳岩");
s.setAge(18);
System.out.println(s.getName()+"‐‐‐"+s.getAge());
//帶參構造使用
Student s2= new Student("趙麗穎",18);
System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
}
}