天天看點

Java基礎知識 六 類與對象、封裝、構造方法第 1章 面向對象思想第 2章 封裝

主要内容:

  1. 面向對象
  2. 類與對象
  3. 三大特征 ——封裝
  4. 構造方法

目錄

第 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 對象記憶體圖

下面對上面的例子在記憶體中調用過程進行講解:

Java基礎知識 六 類與對象、封裝、構造方法第 1章 面向對象思想第 2章 封裝

通過上圖,我們可以了解,在棧記憶體中運作的方法,遵循"先進後出,後進先出"的原則。變量p指向堆記憶體中

的空間,尋找方法資訊,去執行該方法。

對象調用方法時,根據對象中方法标記(位址值),去類中尋找方法資訊。這樣哪怕是多個對象,方法資訊

隻儲存一份,節約記憶體空間。

一個引用,作為參數傳遞到方法中記憶體圖:

Java基礎知識 六 類與對象、封裝、構造方法第 1章 面向對象思想第 2章 封裝
引用類型作為參數,傳遞的是位址值。

1.7 成員變量和局部變量差別

變量根據定義位置的不同,相對應的名字也就不同。如下圖所示:

Java基礎知識 六 類與對象、封裝、構造方法第 1章 面向對象思想第 2章 封裝

成員變量和局部變量差別:

  • 在類中的位置不同 

成員變量:類中,方法外

局部變量:方法中或者方法聲明上 (形式參數)

  • 作用範圍不一樣

成員變量:類中

局部變量:方法中

  • 初始化值的不同

成員變量:有預設值

局部變量:沒有預設值。必須先定義,指派,最後使用

  • 在記憶體中的位置不同

成員變量:堆記憶體

局部變量:棧記憶體

  • 生命周期不同

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

局部變量:随着方法的調用而存在,随着方法的調用完畢而消失

第 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());
  }
}