JavaSE基礎學習(八)——面向物件
阿新 • • 發佈:2018-12-20
1.1 面向物件思想
1.1.1 概述: 我們回想一下,之前我們完成一個需求的步驟:首先是搞清楚我們要做什麼,然後在分析怎麼做,最後我們再程式碼體現。一步一步去實現,而具體的每一步都需要我們去實現和操作。這些步驟相互呼叫和協作,完成我們的需求。在上面的每一個具體步驟中我們都是參與者,並且需要面對具體的每一個步驟和過程,這就是面向過程最直接的體現。 那麼什麼是面向過程開發呢? 面向過程開發,其實就是面向著具體的每一個步驟和過程,把每一個步驟和過程完成,然後由這些功能方法相互呼叫,完成需求。 面向過程的代表語言:C 語言 當需求單一,或者簡單時,我們一步一步去操作沒問題,並且效率也挺高。可隨著需求的更改,功能的增多,發現需要面對每一個步驟很麻煩了,這時就開始思索,能不能把這些步驟和功能在進行封裝,封裝時根據不同的功能,進行不同的封裝,功能類似的封裝在一起。這樣結構就清晰了很多。用的時候,找到對應的類就可以了。這就是面向物件的思想。
1.1.2 特點
- 是一種更符合我們思考習慣的思想
- 可以將複雜的事情簡單化
- 將我們從執行者變成了指揮者(角色發生了轉換)
1.2 類與物件及其使用
- 類與物件關係
- 我們學習程式語言,就是為了模擬現實世界的事物,實現資訊化。比如:去超市買東西的計費系統,去銀行辦業務的系統。
- 我們如何表示一個現實世界事物呢:
- 屬性 就是該事物的描述資訊
- 行為 就是該事物能夠做什麼
- 舉例:學生事物
- 我們學習的 Java 語言最基本單位是類,所以我們就應該把事物用一個類來體現。
- 類:是一組相關的屬性和行為的集合。
- 物件:是該類事物的具體體現。
- 舉例:
- 類 學生
- 物件 班長就是一個物件
- 類的定義:
- 現實世界的食物:
- 屬性 事物的描述資訊
- 行為 事物能做什麼
- 現實世界的食物:
- Java 中用 class 描述事物也是如此
- 成員變數 就是事物的屬性
- 成員方法 就是事物的行為
- 定義類其實就是定義類的成員(成員變數和成員方法)
- 成員變數:和以前定義變數是一樣的,只不過位置發生了改變。在類中,方法外。
- 成員方法:和以前定義方法是一樣的,只不過把 static 去掉。
package com.study.demo; /** * @Auther: lds * @Date: 2018/11/10 10:47 * @Description: */ public class Student { //成員變數 // 姓名 String name; //年齡 int age; //成員方法 //學習的方法 public void study() { System.out.println("好好學習,天天向上"); } //吃飯的方法 public void eat() { System.out.println("學習之後餓了要吃飯"); } }
- 物件的建立及其使用
- 建立物件:類名 物件名 = new 類名();
- 使用物件訪問類中的成員:物件名.成員變數 物件名.成員方法
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 10:49
* @Description:
*/
public class StudentDemo {
public static void main(String[] args) {
//建立物件格式:類名 物件名 = new 類名();
Student s = new Student();
System.out.println("s:" + 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(); // 學習之後餓了要吃飯
}
}
1.3 物件的記憶體圖
- 定義Phone類
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 10:56
* @Description:
*/
public class Phone {
String brand; // 品牌
int price; // 價格
String color; // 顏色
public void call(String name) {
System.out.println("給" + name + "打電話");
}
public void sendMessage() {
System.out.println("群發簡訊");
}
}
- 一個物件的記憶體圖
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 10:56
* @Description:
*/
public class Phone {
String brand; // 品牌
int price; // 價格
String color; // 顏色
public void call(String name) {
System.out.println("給" + name + "打電話");
}
public void sendMessage() {
System.out.println("群發簡訊");
}
}
1.4 成員變數和區域性變數的區別
- 在類中的位置不同
- 成員變數:類中,方法外
- 區域性變數:方法中或者方法宣告上(形式引數)
- 在記憶體中的位置不同
- 成員變數:堆記憶體
- 區域性變數:棧記憶體
- 生命週期不同
- 成員變數:隨著物件的建立而存在,隨著物件的消失而消失
- 區域性變數:隨著方法的呼叫而存在,隨著方法的呼叫完畢而消失
- 初始化值的不同
- 成員變數:有預設值
- 區域性變數:沒有預設值。必須先定義,賦值,最後使用
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 11:06
* @Description:
*/
public class VariableDemo {
int x; // 成員變數
public void show() {
int y = 0; // 區域性變數
System.out.println(x);
System.out.println(y);
}
}
1.5 封裝
- Private 關鍵字由來及其使用
- private 關鍵字
- 是一個許可權修飾符。
- 可以修飾成員(成員變數和成員方法)
- 被 private 修飾的成員只在本類中才能訪問
- private 關鍵字
原來的程式碼已經報錯了,成員被private修飾,私有。
- private 最常見的應用:
- 把成員變數用 private 修飾
- 提供對應的 getXxx()/setXxx()方法
成員變數私有化的標準程式碼
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 13:46
* @Description:
*/
public class Student02 {
private String name;
private int age;
public void setName(String name) {
name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
age = age;
}
public int getAge() {
return age;
}
}
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 13:46
* @Description:
*/
public class Student02Demo {
public static void main(String[] args) {
//建立物件
Student02 s = new Student02();
System.out.println(s.getName() + "---" + s.getAge());
s.setName("張三");
s.setAge(18);
System.out.println(s.getName() + "---" + s.getAge());
}
}
- 封裝的概述:
- 是面向物件三大特徵之一。
- 是面向物件程式語言對客觀世界的模擬,客觀世界裡成員變數都是隱藏在物件內部的,外界無法直接操作和修改。就像剛才說的年齡。
- 封裝原則:
- 將不需要對外提供的內容都隱藏起來。
- 把屬性隱藏,提供公共方法對其訪問。
- 成員變數 private,提供對應的 getXxx()/setXxx()方法。
- 封裝好處:
- 通過方法來控制成員變數的操作,提高了程式碼的安全性。
- 把程式碼用方法進行封裝,提高了程式碼的複用性。
1.6 this關鍵字
- this 關鍵字的由來:
- this:代表所在類的物件引用
- 記住:方法被哪個物件呼叫,this 就代表那個物件
- this 關鍵字的使用:
- 區域性變數隱藏成員變數(區域性變數和成員變數重名)
1.7 構造方法
- 作用:
- 給物件的資料進行初始化
- 格式:
- 方法名與類名相同
- 沒有返回值型別,連 void 都沒有
- 沒有具體的返回值 修飾符 構造方法名(引數列表){ }
- 注意事項:
- 如果你不提供構造方法,系統會給出預設構造方法
- 如果你提供了構造方法,系統將不再提供
- 構造方法也是可以過載的
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 14:35
* @Description:
*/
public class Student03 {
private String name;
private int age;
public Student03() {
}
public Student03(String name) {
this.name = name;
}
public Student03(int age) {
this.age = age;
}
public Student03(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name + "----" + age);
}
}
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/11/10 14:41
* @Description:
*/
public class Student03Demo {
public static void main(String[] args) {
//如何呼叫構造方法呢?
//通過 new 關鍵字呼叫
//格式:類名 物件名 = new 構造方法(...);
Student03 s = new Student03();
s.show(); // null----0
//public Student(String name)
Student03 s2 = new Student03("張三");
s2.show(); // 張三----0
//public Student(int age)
Student03 s3 = new Student03(18);
s3.show(); // null----18
//public Student(String name,int age)
Student03 s4 = new Student03("張三", 18);
s4.show(); // 張三----18
}
}
標準學生類程式碼編寫和測試
- 類:
- 成員變數
- 構造方法:無參構造方法 帶參構造方法
- 成員方法:getXxx() setXxx()
- 給成員變數賦值的方式:無參構造方法+setXxx() 帶參構造方法
package com.study.demo.studentdemo;
/**
* @Auther: lds
* @Date: 2018/11/10 15:01
* @Description:
*/
public class Student04 {
private String name;
private int age;
public Student04() {
}
public Student04(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.study.demo.studentdemo;
/**
* @Auther: lds
* @Date: 2018/11/10 15:02
* @Description:
*/
public class Student04Demo {
public static void main(String[] args) {
// 無參構造方法
Student04 s = new Student04();
s.setName("張三");
s.setAge(18);
System.out.println("name: " + s.getName() + " age: " + s.getAge());
//有參構造
Student04 ss = new Student04("李四", 19);
System.out.println("name: "+ ss.getName()+" age: "+ss.getAge());
}
}
今天先寫到這裡吧,明天是雙十一了,小夥伴們準備好了嗎?