01-物件導向介紹
-
物件導向並非是一個技術, 而是一種程式設計的思想
-
這種思想可以指導我們以什麼思路解決問題, 以什麼思路來組織程式碼
-
-
問題 : 為什麼要學習這種思想 ?
因為這套思想, 來源於生活, 生活中解決問題, 就是一系列的物件, 在一起打交道, 從而將問題解決.
所以我們希望寫程式碼解決問題的時候, 也能按照生活中的這種思想
這樣的話, 程式設計就會更加貼切於生活, 程式也會更加便於讓人理解.
舉例1: 解決隨機數的問題 ---> Random物件
舉例2: 解決鍵盤錄入的問題 ---> Scanner物件
舉例3: 封裝學生資料 ---> Student物件
-
物件導向我們學什麼 ?
-
學習自己如何設計物件
-
學習已有的物件如何使用 (API章節)
-
-
萬物皆物件
-
生活中的任何一種事物, 都可以透過程式碼, 將其描述為物件
-
02-類和物件
-
前提 : Java中想要建立物件, 必須現有類的存在
-
類的介紹 :
-
一組相關屬性和行為的集合, 將其理解為是物件的一張設計圖
-
-
物件的介紹 :
-
物件是根據類 (設計圖), 建立出來的實體
-
-
類和物件的關係 :
-
依賴關係 : 需要根據類, 建立物件
-
數量關係 : 根據一個類, 可以建立出多個物件
-
-
類的組成 :
屬性 : 在程式碼中使用成員變數表示, 成員變數跟之前定義變數的格式一樣, 只不過位置發生了改變 (類中方法外)
行為 : 在程式碼中使用成員方法表示, 成員方法跟之前定義方法的格式一樣, 只不過去掉了 static 關鍵字
-
類的設計
-
知道什麼設計為屬性, 什麼設計為行為
-
- 描述事物的一些[名詞], 設計為屬性
- 描述事物的一些[動詞], 設計為行為
舉例1: 我有一個{學生}叫做<張三>, 今年<23歲>, <180的身高>, 平時沒什麼特殊愛好, 就喜歡(吃飯)和(學習).
舉例2: 前陣子我買了一臺<白色>的<海爾>{洗衣機}, 花了<1999塊錢>, (洗衣服)和(甩幹)確實方便.
public class Student {
// 屬性: 姓名, 年齡
String name;
int age;
// 行為: 吃飯, 學習
public void eat(){
System.out.println("吃飯");
}
public void study(){
System.out.println("學習");
}
}
-
物件的建立和使用
-
思路 : 當物件建立完畢後, 呼叫內部的成員, 都是拿著物件名 . 出來的
-
建立物件的格式 : 類名 物件名 = new 類名();
Student stu = new Student();
System.out.println(stu); // com.itheima.oop.Student@233ac477
使用物件成員變數的格式 : 物件名.變數名;
stu.name = "張三";
stu.age = 23;
System.out.println(stu.name);
System.out.println(stu.age);
使用物件成員方法的格式 : 物件名.方法名();
stu.eat();
stu.study();
-
細節補充 :
1. 我們在定義類的時候, 成員變數通常不賦值.
(等物件建立完畢後, 再給成員變數賦值)
2. 成員變數沒有賦值, 也可以直接使用, 使用的是預設值
03-物件的記憶體圖
-
務必開啟 ppt 將內部流程梳理清楚
-
目標 : 今後編寫了建立物件的程式碼, 腦海中就要有堆的記憶體圖
Student stu = new Student();
-
04-成員變數和區域性變數的區別
-
類中位置不同 :
-
成員變數 : 方法外
-
區域性變數 : 方法內
-
-
初始化值不同 :
-
成員變數 : 有預設初始化值
-
區域性變數 : 沒有預設初始化值, 使用之前必須完成賦值
-
-
記憶體位置不同 :
-
成員變數 : 堆記憶體
-
區域性變數 : 棧記憶體
-
-
生命週期不同 :
-
成員變數 : 隨著物件的建立而存在, 隨著物件的消失而消失
-
區域性變數 : 隨著方法的呼叫而存在, 隨著方法的執行結束而消失
-
-
作用域 :
-
都在自己所屬的大括號中有效
-
05-this 關鍵字
-
情況 : 當區域性變數和成員變數重名
-
Java會根據就近原則, 優先使用區域性變數
-
-
問題 : 非要使用成員變數, 怎麼辦 ?
-
回答 : 使用this關鍵字進行區分
class Student {
int num = 10;
public void show(){
int num = 20;
System.out.println(num); // 20
System.out.println(this.num); // 10
}
}
-
this可以解決的問題 : 區分區域性變數和成員變數的重名問題
-
this的作用 :
this可以呼叫自己本類的成員
this.本類成員變數;
this.本類成員方法();
-------------------------------------------------
省略規則 :
this.本類成員方法() : this.可以直接省略
this.本類成員變數 : 如果區域性變數和成員變數沒有重名, this.可以省略不寫
class Student {
int num = 10;
public void show(){
System.out.println(this.num); // 10
this.print();
}
public void print(){
...
}
}
06-構造方法
-
介紹 : 構造方法又名構造器
-
構建, 創造一個物件要呼叫的方法
-
簡單記 : 構造方法就是用於建立物件的方法
-
-
格式 :
1. 方法名與類名相同, 大小寫也要一致
2. 沒有返回值型別, 連 void 都沒有
3. 沒有具體的返回值 (不能透過 return 語句帶回結果資料)
public class Student {
public Student(){
System.out.println("我是Student類的空引數構造方法");
}
}
-
構造方法的執行時機 :
-
在建立物件的時候, 被呼叫執行
-
每建立一次物件, 就會執行一次構造方法
-
-
構造方法的作用 :
-
本質作用 : 用來建立物件
-
結合執行時機 : 在建立物件的時候, 給成員變數初始化
-
public class Student {
String name;
int age;
public Student(String name, int age){
this.name = name;
this.age = age;
}
}
Student stu = new Student("張三", 23);
-
構造方法的注意事項 :
-
如果一個類中沒寫構造方法, 系統將會給出一個 [預設的] [無引數的] 構造方法
-
如果手動編寫了構造方法, 系統就不會給出那個預設的無參構造了
-
建議 : 無參構造, 帶參構造, 全部手動給出.
-
-
構造方法不允許手動呼叫
-
stu.Student(); 錯誤呼叫
-
-
07-封裝思想 (很重要)
-
物件導向有三大特徵 :
-
封裝
-
繼承
-
多型
-
-
封裝思想介紹 :
-
隱藏實現細節, 僅對外暴露公共的訪問方式
-
結合插線板理解
-
-
-
封裝在程式碼中常見的體現 :
-
將屬性抽取到類中, 是對資料做了封裝
使用封裝前 : 維護一個使用者資訊, 定義了5個變數, 資料過於零散
String id = "001";
String name = "張三";
int age = 23;
String tel = "156****1234";
String address = "北京";
----------------------------------------------------------
使用封裝後 : 5個零散的資料, 就被封裝到了一個整體的物件中
public class User {
String id;
String name;
int age;
String tel;
String address;
// 假設我寫了帶引數構造方法
}
User u1 = new User("001","張三",23,"156****1234", "北京");
User u2 = new User("002","李四",23,"156****1244", "北京");-
將程式碼抽取到方法中, 是對程式碼功能進行了封裝
程式設計師A : 編寫了一個遍歷列印陣列的方法
public void printArray(int[] arr){
...
}
程式設計師B : 無需關心方法內部實現, 只要知道怎麼呼叫即可.
以上過程, 就是程式設計師A, 將遍歷列印陣列這個功能程式碼, 封裝到了printArray方法中. -
08-許可權修飾符
-
private : 同一個類中
-
(default) : 同一個類中, 同一個包中
-
protected : 就業班
-
public : 任意位置
09-標準 JavaBean (必掌握)
-
所有成員變數 private 私有
-
提供空參\帶參構造方法
-
對於私有的成員變數, 提供對應的setXxx和getXxx方法
package com.itheima.test;
/*
標準 JavaBean :
1. 成員變數全部private私有
2. 提供空參\帶參構造方法
3. 提供對應的setXxx和getXxx方法
*/
public class Student {
private String name;
private int age;
public Student() {
}
public Student(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.itheima.test;
public class StudentTest {
public static void main(String[] args) {
// 1. 空參構造建立物件, 透過setXxx方法完成賦值
Student stu1 = new Student();
stu1.setName("張三");
stu1.setAge(23);
System.out.println(stu1.getName() + "---" + stu1.getAge());
// 2. 帶參構造方法建立物件, 在建立的時候直接賦值
Student stu2 = new Student("李四", 24);
System.out.println(stu2.getName() + "---" + stu2.getAge());
// 重點強調: getXxx方法, 能夠得到的是真實的資料, 使用方式, 不要侷限在列印語句上
for(int i = 1; i <= stu2.getAge(); i++){
System.out.println("祝福" + stu2.getName() + "生日快樂!");
}
}
}