1. 程式人生 > >Java基礎複習第七天——面向物件思想、類、物件、封裝、構造方法、JavaBean

Java基礎複習第七天——面向物件思想、類、物件、封裝、構造方法、JavaBean

目錄

一 面向物件思想

1.概述

2.面向物件的三大特徵

         3.類和物件

4.類和物件的關係

5.類的定義

6.成員變數和區域性變數

7.物件的使用格式

8.物件記憶體圖

二.封裝

1.封裝的概述

2.封裝的原則

3.封裝的步驟

4.private關鍵字的作用

5.private的使用格式

6.this關鍵字(this和super下次整吧)

三.構造方法

a.什麼是構造方法

b.構造方法的格式:

c.構造方法的過載

d.構造方法的注意事項

e.JavaBean類的定義******************************


一 面向物件思想

1.概述

   面向過程思想: 遇到一個問題,一步一步的去解決他,強調的是過程(典型代表語言是C語言)

   面向物件思想: 遇到一個問題,找一個可以解決問題的物件(可以是人,也可以是別的),強調是物件(典型代表語言Java)

 案例1: 洗衣服

      面向過程思想: a.收集衣服 b.加水洗衣液 c.泡一會 d.搓 e.漂洗 f.擰乾 d.晾衣服

      面向物件思想: 1.找個全自動洗衣機,把衣服丟進去

                              2.找一個人,把衣服給他

2.面向物件的三大特徵

     繼承       ---複用

     封裝       ---安全

     多型       

---拓展

3.類和物件

    Java中必須先有類,才能有物件

  類是什麼?

          一群具有相同屬性和行為事物的集合,比如人類,狗類,貓類

  物件又是什麼?

          就是類中的一個具體存在,也稱為例項。

  舉例:

         車(類) 寶馬車(類)  我家那輛三輪車(物件)

         動物(類) 狗(類) 大黃狗(類) 我家那隻狗(物件)

4.類和物件的關係

        物件 是以 類 作為 模板 創建出來的

        所以類中有什麼,那麼物件就應該有什麼(屬性、方法)

5.類的定義

    類的定義:包括類名,類的屬性(變數),類的行為(方法)三部分

 格式:

public class 類名{ //類名大駝峰

        //類的屬性(成員變數)

       資料型別 成員變數名1;

       資料型別 成員變數名2;

        ...

       //類的行為(成員方法) 沒有static關鍵字

     public 返回值型別 方法名(引數列表){

         方法體

       return 返回值;

    }

}

預設值問題:

    成員變數是有預設值的!!!!

6.成員變數和區域性變數

    

成員變數:直接定義在類中的變數

區域性變數:定義類中的方法中的變數

 

成員變數和區域性變數的五點區別:

     a.定義位置不同

     b.初始值不同/預設值不同

            區域性變數 沒有預設值 ,不賦值不能使用

            成員變數 有預設值,不同的資料型別不同的預設值

    c.作用域不同(有效範圍)

           區域性變數 只能在區域性使用,在哪個方法中定義的只能在該方法中使用

           成員變數 在該類中都可以使用

    d.記憶體位置

           區域性變數 跟隨方法的呼叫,進入棧中

           成員變數 跟隨物件的建立,進入堆中

    e.生命週期

           區域性變數 跟隨方法的呼叫而出現,跟隨方法的結束而銷燬

           成員變數 跟隨物件的建立而出現,跟隨物件的銷燬而銷燬

7.物件的使用格式


類名 物件名 = new 類名();
物件名.成員變數;
物件名.成員方法();


public class Test01_Student {
  public static void main(String[] args) {
    //建立物件格式:類名 物件名 = new 類名();
    Student s = new Student();
    System.out.println("s:"+s); //地址
    //直接輸出成員變數值
    System.out.println("姓名:"+s.name); //null
    System.out.println("年齡:"+s.age); //0
    System.out.println("‐‐‐‐‐‐‐‐‐‐");
    //給成員變數賦值
    s.name = "C羅";
    s.age = 18;
    //再次輸出成員變數的值
    System.out.println("姓名:"+s.name); //C羅
    System.out.println("年齡:"+s.age); //18
    System.out.println("‐‐‐‐‐‐‐‐‐‐");
    //呼叫成員方法
    s.study(); 
    s.eat(); 
  }

8.物件記憶體圖

1.單個物件呼叫方法

           在棧記憶體中執行的方法,遵循"先進後出,後進先出"的原則。變數p指向堆記憶體中的空間,尋找方法資訊,去執行該方法。
但是,這裡依然有問題存在。建立多個物件時,如果每個物件內部都儲存一份方法資訊,這就非常浪費記憶體了,因為所有物件的方法資訊都是一樣的。那麼如何解決這個問題呢?

 2.多個物件呼叫方法

           物件呼叫方法時,根據物件中方法標記(地址值),去類中尋找方法資訊。這樣哪怕是多個物件,方法資訊
只儲存一份,節約記憶體空間

二.封裝

1.封裝的概述

      封裝就是對我們寫的物件的一種保護,防止資料被隨意訪問和修改

2.封裝的原則

     a.把需要隱藏的屬性 隱藏起來

     b.對外提供一種公共訪問方式

3.封裝的步驟

    a.java提供關鍵字,private 用來修飾成員變數

    b.提供一對get/set方法,通過該方法可以訪問成員變數

4.private關鍵字的作用

     a.private是一種最小的許可權修飾符

     b.能修飾成員變數和成員方法

     c.被private修飾的成員,只能在類的內部訪問

5.private的使用格式

 格式: private 資料型別 成員變數名;


public class Dog{

private int age; //成員變數私有化了

//get方法,獲取值,沒有引數,有返回值

public int getAge(){

return age;

}

//set方法,修改值,沒有返回值,有引數

public void setAge(int a){

age = a;

}

}

6.this關鍵字(this和super下次整吧)

public class Dog{
		private int age; //成員變數私有化了
		//get方法,獲取值,沒有引數,有返回值
		public int getAge(){
			return age;
		}
		//set方法,修改值,沒有返回值,有引數
		public void setAge(int age){
			age = age; //如果這麼寫,就是區域性變數自己給自己賦值了,這是java的就近原則
			this.age = age;//把區域性變數age,賦值給成員變數this.age
		}
	}

tip: 1.idea生成get和set方法快捷鍵: alt+INS 點選 Getter and Setter

      2.eclipse 右鍵滑鼠——Generate——getter and setter

三.構造方法

a.什麼是構造方法

    給物件的成員變數預設值的方法

b.構造方法的格式:

      public 類名(){

      作用: 給成員變數賦預設值的

   }

  注意:構造方法沒有返回值,不寫返回值型別(不是void!!!!)

  注意:其實我們以前說的固定格式

           類名 物件名 = new 類名();//這裡的類名() 其實就是呼叫了無引數構造方法

           類名 物件名 = new 類名(引數);//呼叫有參構造方法

c.構造方法的過載

過載的構造方法:

public class Dog{

private int age; //成員變數私有化了

private String name;//

//無參構造

public Dog(){



}

//過載構造

public Dog(int age){

this.age = age;

}

public Dog(String name){

this.name = name;

}

public Dog(int age,String name){

this.age = age;

this.name = name;

}

}

d.構造方法的注意事項

    i.如果一個類中沒有寫任何構造,那麼預設有一個無參構造

    ii.如果我們寫了構造,那麼系統就不會生成無參構造

    iii.構造方法也可以過載

 

e.JavaBean類的定義******************************

  JavaBean是Java中定義類的標準

    i.所有成員變數必須私有化(private)

    ii.為私有化的成員變數提供Getter/Setter

    iii.標準的JavaBean中必須有無參構造

    iv. 標準的JavaBena中一般還會提供全參構造

  總結 JavaBean = private+get/set+無參構造+全參構造+(一般還會自己加toString()方法)

 

完整版JavaBean:

package com.gty.vip;


public class Person
{   
    //成員變數
    public  int age;
    public  String name;

    //無參構造方法
    public Person(){}

    //有參構造方法
    public Person(int age, String name){
        this.age=age;
        this.name=name;
    }

     //getset
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //toString()方法,也是可以快速生成的   @Override是java的註解
    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

   /*  主方法main()這裡不寫啊!!!因為沒有main()方法,所以是不能執行的
       我們都是在別的類中呼叫的
   
     public static void main(String[] args) {
 
    }*/
}