Java基礎Day7

##今日內容

  • 面向對象概述

  • 類和對象的關係

  • 面向對象內存圖

  • private、this關鍵字和封裝

  • 面向對象之構造方法

  • 面向對象三大特徵

  1. 封裝

  2. 繼承

  3. 多態

##01. 面向過程和麪向對象思想概述

    1. 什麼是面向過程?

    1. 什麼是面向對象?

    1. 面向對象思想的好處是什麼?

總結: 
    1. 面向過程: 強調的是過程, 自己通過第一步, 第二步.. 一步步的自己去完成對應的需求.
    2. 面向對象: 強調的是對象, 通過指揮對象去幫我們完成對應的需求.
    3. 
            
        1. 面向對象是一種[思想], 更符合我們思考問題的一種習慣. (懶人習慣)
        2. 將複雜的問題簡單化
        3. 將我們從[執行者]的位置, 變成了[指揮者].
​
結論:
​
        Java中講究萬物皆[對象]
​
            可以通過Java代碼, 將現實生活的任意一種事物, 都看作爲是一個對象
​
                因爲任何一種事物都會具備自己的一份[功能].

##02. 面向對象思想特點和舉例

  • 舉例說明

總結:
    懶人思想, 指揮對象去做某件事情.
​
    買電腦:
        面向過程:1. 上網學習各個參數的解釋
                 2. 瞭解各個品牌的性價比
                 3. 購買..
​
        面向對象:找一個[懂電腦的人]幫我去買
        
    洗衣服: 

 

    鍋包肉:

##03. 類和對象的概述

    1. 如何通過java描述現實生活中事物

    1. 類是由什麼組成的?

    1. 類和對象的關係是什麼?

測試類 : 帶有main方法的類
​
類 : 基本類 -> 封裝[事物][數據]的一個類.

 

總結:
    1.  java中描述現實生活事物, 都是通過類的形式
                學生事物
                    class Student{
                        
                    }
                車事物
                    class Car{
                        
                    }
                動物事物
                    class Animal{
                        
                    }
​
    2.  事物(類) : 屬性, 行爲
​
                屬性 : 一個事物的描述信息
                                姓名, 年齡, 畢業院校...
​
                行爲 : 該事物具體能做的功能
                                學習

 

                問題: 屬性在代碼中如何表示?
                        使用[成員變量]進行表示 : 成員變量跟之前定義變量的格式一樣, 只不過位置發生了改變
                                [類中, 方法外]

 

                        // 當前的類是描述學生這個事物, 通過三個成員變量(屬性)進行了描述
                        public class Student {
                            String name = "張三";
                            int age = 23;
                            String school = "傳智專修學院";
                            public void study(){
                                System.out.println("學生學習");
                            }
​
                        }
						public class Car{
	
							// 屬性
							String pinpai = "奇瑞QQ";
							double jiage = 50000;

							// 行爲
							public  void run(){
								System.out.println("跑");
							}

						}

 

				問題: 行爲在代碼中如何表示?

						使用的是[成員方法]進行表示 :  成員方法, 跟之前定義方法的格式一樣, 只不過去掉了static關鍵字.
	3. 類僅僅是對事物進行了一個描述, 可以將類看做爲是一個設計圖紙

			我們真正需要使用的是具體存在的事物.

				類 : 描述
				對象 : 具體存在的事物
				結論 : 我們需要根據類, 去創建對象.

##04. 手機類的定義

    1. 屬性和行爲分別用什麼表示?

    1. 又該如何編寫?

總結:
	1.	成員變量, 成員方法

			屬性 : 品牌, 價格, 顏色
			行爲 : 大電話, 發短信
			
	2.  
		public class Phone {
		    /*
		       屬性 : 品牌, 價格, 顏色
			   行爲 : 打電話, 發短信
		     */
		    String brand;			// 成員變量 : 跟之前定義變量的格式一樣, 只不過位置挪到了[類中方法外]
		    double price;
		    String color;
									// 成員方法 : 跟之前定義的方法格式一樣, 只不過去掉了static關鍵字
		    public void call(String name){
		        System.out.println("給" + name + "打電話");
		    }
		
		    public void sendMessage(){
		        System.out.println("手機羣發羣信");
		    }
		}
    1. 成員變量和局部變量的區別:

		1. 位置區別:

			成員變量 : 類中方法外

			局部變量 : 方法中, 或者是方法的聲明上(形參)

 

						public static void main(String[] args){
							int num = 10;	// 方法中
							System.out.println(num);
						}

						public static void method(int num){	// 方法的聲明上
							System.out.println(num);
						}

						鋪墊: 局部代碼塊, 局部內部類..

							只要是跟局部相關的, 都跟方法有關.

		2. 初始化值的區別 :

			成員變量 : 有默認初始化值.

			局部變量 : 沒有默認初始化值, 使用之前必須完成賦值才能使用.
		(這僅僅是一部分)
  • 5分鐘時間練習

##05. 對象的使用

  • 如何創建對象?

  • 如何調用對象的屬性?

  • 如何調用對象的行爲?

總結:

	1. 類名 對象名 = new 類名();
			Phone p = new Phone();

	2. 對象名.變量名;
			p.color = "黑色";
			System.out.println(p.color);
	3. 對象名.方法名(實際參數);
			p.call("張三");
			p.sendMessage();
  • 分析:

屬性: 品牌, 價格, 顏色

行爲: 打電話, 發短信
	
	打電話的功能要求加入姓名
	
		例如: 給張三打電話.

5分鐘時間自己編寫.

##06. 一個對象的內存圖

  • 要求自己會畫

##07. 方法共用的內存圖

  • 總結: 在一次程序的執行過程中如果創建了多個對象

  • .class文件只加載一次

  • 字節碼文件只有一份, 所以多個對象, 使用的方法, 就是同一份方法.

  • 擴展:

垃圾回收機制
	
	Java語言有完善的垃圾回收機制, 會在不定時的時候對內存中的垃圾[自動]進行清掃

	啥是內存中的垃圾?

		當堆內存中數據[數組\對象]的地址值, 沒有任何一個變量記錄的時候, 該數據[對象], 就會變成垃圾對象.

				main(){
		
					Phone p = new Phone();			// p = 0a1
					p = null;		

				}

##08. 兩個對象的內存圖(兩個引用指向同一個堆內存)

  • 看圖說話

	int[] arr = {11,22,33};

	int[] arr2 = arr;

	Phone p1 = new Phone();
	p1.color = "白色";

	Phone p2 = p1;
	p2.color = "藍色";

	System.out.println(p1.color);
	System.out.println(p2.color);

##09. 成員變量和局部變量的區別

總結:

A:位置不同

		成員變量 : 類中方法外

		局部變量 : 方法中, 或者是方法的聲明上(形參)

B:初始化值不同

		成員變量 : 有默認初始化值

		局部變量 : 沒有默認初始化值, 使用之前必須完成賦值才能使用.

C:生命週期不同

		成員變量 : 隨着對象的創建而存在, 隨着對象的消失而消失

		局部變量 : 隨着方法的調用而存在, 隨着方法的彈棧而消失

D:內存位置不同

		成員變量 : 堆內存
						成員變量所屬於對象, 所以在堆內存

		局部變量 : 棧內存
						局部變量所屬於方法, 所以在棧內存

 

	E:作用域不同(編寫代碼)

		成員變量 : 在整個類當中.

 

		局部變量 : 僅在它所在的大括號中有效

 

					main(){

						for(int i = 1; i <= 10; i++){
							System.out.println(i);
						}

						System.out.println(i);	// 出現編譯錯誤.

					}

##10. private關鍵字的概述和特點

  • private權限修飾符可以修飾什麼?

  • 被其修飾的(成員)有什麼特點?

總結:
	1. 可以用來修飾[成員]

		成員變量

		成員方法

	2. 只能在本類中進行訪問
		class Student {
		    // 原因: 就是爲了防止接受到一些錯誤的數據.
		    private int age;
		
		    // 提供: age的公共訪問方式
		    // 1. [設置的渠道]
		    public void setAge(int a){
		       if(a >= 0 && a <= 200){
		           age = a;
		       }else{
		           System.out.println("您的數據有誤");
		       }
		    }
		    // 2. [獲取的渠道]
		    public int getAge(){
		        return age;
		    }
		}

##11. private修飾後的[標準類]代碼

  • 案例演示

  • 5分鐘時間練習

public class TestPerson {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("張三");
        p.setAge(23);
        System.out.println(p.getName() + "..." + p.getAge());
    }
}

class Person{
    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;
    }
}
問題: setXxx和getXxx方法一定要成對兒出現嗎?

		setScore()	getScore();

總結:
	  不一定, 需要根據具體的業務去組織.

##12. this關鍵字的概述和使用

    1. 什麼是this關鍵字

    1. this關鍵字的作用是什麼?

總結:
	1. this: 代表當前對象的引用, 誰來調用我, 我就代表誰
				對象的引用 : 對象的地址值.
	2. 用來區分局部變量, 和成員變量的重名問題

	3. 結論 : this.用來調用本類的成員.
			public class Person{

				private String name;

				public String getName(){
					return name;		// 實際上的代碼 : return this.name;
				}
			}
  • this內存原理

  • 練習

(6分鐘)
定義一個學生類
屬性:姓名和年齡
生成對應的getter/setter方法
使用this關鍵字區分局部和成員變量
新建一個測試類測試學生類

##13. 封裝的概述和好處

    1. 概述下什麼是封裝?

    1. 封裝的好處又是什麼?

總結:
	1. 隱藏實現細節, 僅對外暴露公共的訪問方式.

		常見的封裝 : 私有成員變量, 對外提供公共的setXxx和getXxx方法.

				注意: 私有僅僅是封裝的一種體現形式, 不能說封裝就是私有.

				封裝是一個大的思想概念 :

						1. 將一段代碼, 抽取到方法中, 這就是對代碼的一個封裝.

							作爲調用者, 我不需要關注方法內部的實現原理, 我只需要關注怎樣調用

 

						2. 將數據抽取到一個類當中, 這是對數據的一種封裝.
								需求: 存儲學生信息(姓名, 年齡, 成績, 學校)
										class Student{
											// 姓名, 年齡, 成績, 學校
										}
	2. 

		1. 提高了代碼的安全性		-> age : -23
		2. 提高了代碼的複用性		-> 將一段代碼封裝到一個方法中, 對方法進行重複調用

		------------------------------

		封裝的弊端 :

			1. 封裝本身沒什麼弊端, 如果有弊端存在, 只能說明該程序員寫的代碼太爛

			2. 調用成員變量的時候, 稍微麻煩了一點.

					不能直接對象名.屬性名調用, 需要調用setXxx和getXxx方法.

##14. 構造方法的概述和使用

    1. 什麼是構造方法?

    1. 構造方法的格式爲?

    1. 構造方法可以有return語句嗎?

總結:
	1. 構建, 或者說是創造一個對象時候, 調用的方法
					創建對象時候, 執行的方法.
							如果一個類, 沒有構造方法, 將無法創建對象

					Person p = new Person();

 

	2.

		1. 方法名與類名相同, 大小寫也要一致
		2. 沒有返回值類型, 連void都沒有
		3. 沒有具體的返回值

			class Person{

				public Person(){
					System.out.println("我是空參構造方法");
					return;
				}

			}

 

	3. 構造方法可以寫return語句, 但是return不能跟具體的返回值, 只能用於結束方法.

 

問題: 構造方法在什麼時候被調用? 能不能手動調用?

			創建對象的時候, 會由系統自動調用構造方法, 每創建一次對象, 就會執行一次構造方法.

				Person p1 = new Person();
    			p1.Person();		// 編譯錯誤

				結論 : 構造方法不能手動調用, 只能是在創建對象的時候, 由系統自動調用.

 

問題: 構造方法的作用是什麼?

		需要結構構造方法的執行時機進行思考

				構造方法是在創建對象的時候, 就會執行的方法.

					我們希望構造方法在執行的時候, 幫我們乾點活.

						爲成員變量進行賦值
		總結 : 用於給對象中的數據[屬性]進行初始化的.

 

##15. 構造方法的注意事項

    1. 構造方法注意事項?

    1. 構造方法能夠重載嗎?

    1. 給成員變量的兩種初始化方式有什麼區別?

總結:
	1. 如果一個類當中沒有編寫任何構造方法, 系統將會提供一個默認的空參構造方法, 保證可以創建對象
				class Person{
					// 空參構造方法
					// public Person(){}
	
				}

				Person p = new Person();	// 這句話不會出現編譯錯誤, 因爲在使用Person類的默認空參構造

		但是如果手動編寫了構造方法, 系統將不會再提供那個默認的空參構造方法了

				class Person{

					String name;
			
					public Person(String name){
						this.name = name;
					}

				}
				Person p = new Person();	// 這句話就會產生編譯錯誤, 因爲手動給出了有參構造, 系統就不會提供那個默認的空參構造方法了

 

		建議: 今後編寫代碼的時候, 空參有參構造, 都手動給出

	2.  構造方法也是方法, 可以進行重載
		
	3.
		兩種初始化方式分別爲:

			1. 有參構造初始化

			2. setXxx初始化

					這兩種方式一般都是配合使用的.

							一般都會通過有參構造進行[初始化], 隨後通過setXxx方法[修改]屬性值.

								Student s = new Student("張三",23);
						        s.setName("李四");
						        System.out.println(s.getName());

##16. 標準的學生類代碼編寫和測試

  • 案例演示

  • 5分鐘時間操作

	1. 私有成員變量
	2. 提供setXxx和getXxx方法
	3. 提供空參有參構造
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章