Java面向物件之類和物件

一、面向物件概述

Java是完全的面向物件程式設計(Object Oriented Programming),簡稱OOP

面向物件程式設計的思維方式更加符合大家的日常生活,因為我們的現實世界都是由各種各樣的物件組成,大到飛機、火車、樓房,小到一隻狗、膝上型電腦、一本書都是實實在在的物件。然而每個物件都有自己的狀態和行為,我們可以通過物件來完成一定的任務。

例如:我們乘坐飛機從深圳飛到湘西去旅遊,我們可以直接使用飛機的飛行能力,而不用管飛機這個物件是如何製造的。直接使用即可。

使用面向物件的方式來描述由物件組成的世界,更加符合人類的思維方式;

因為軟體出現的目的就是為了:

  • 用計算機的語言描述現實世界
  • 用計算機解決現實世界的問題

Java是目前最為流行的面向物件的程式語言(Python可能不服),擁有面向物件的四大特徵:

  • 封裝:隱藏內部實現細節,對外提供可訪問的方法
  • 繼承:子類自動繼承父類中所有的非私有屬性和方法
  • 多型:同一事物,多種不同的表示形態,例如:過載、重寫
  • 抽象:可以不用管具體的實現,定義統一的抽象規則

面向物件程式設計是Java的核心思想,但是對於初學者來說,學習起來還是比較抽象。所以建議初學者可以配合書籍一起學習,反覆觀看,從而掌握其中精華。

二、類

2.1 類的概述

類是Java應用程式中,必不可少的單位;建立類的關鍵字是:class; 其實我們在之前的學習過程中已經接觸過類,只是沒有專門單獨的拿出來講。

例如:

  • 以下建立了一個名稱叫Test01的類
  • 在類中定義了一個main()方法,也是程式的入口
public class Test01{
public static void main(String args[]){
//建立並且賦值
int score2[] = {100,90,88,85,66};
for(int i = 0;i<score2.length;i++) {
System.out.print(score2[i]+"\t");
}
}
}

所以建立類,也沒有那麼複雜。掌握其基本語法,然後根據自己的需求進行建立即可。

Java作為一門高階語言,我們除了可以建立自己定義的類以外,還內建了許多預定義好的類。

例如:

  • Scanner
  • Math
  • String

2.2 預定義類

所謂預定義類,就是Java語言根據實際業務場景,幫我們預定義好的類。我們只需要掌握如何使用,不需要再去額外建立。

常用的預定義類:

例如:

  • Scanner :鍵盤輸入
  • Math :數學相關類
  • String :字串類
  • Date :時間日期相關類
  • List :集合類

Java提供的預定義類有點多,好在提供了幫助文件,我們可以根據幫助文件檢視:https://www.matools.com/api/java8

後面有章節專門來研究常用的預定義類。

2.3 發現類的過程

1、寵物—現實生活中的物件

如何在計算機中描述它?

世界上具體寵物物件,特別多。那麼我們如何用計算機語言來描述這麼多寵物物件,如果一個個描述我們肯定是做不到的;所以我們需要掌握其中的規律來對其進行劃分。

從現實中抽象出類分為三步走:

  1. 第一步:找出它們的種類
  2. 第二步:找出它們的屬性
  3. 第三步:找出它們的行為

2、第一步:找出他們的種類

根據以上資訊,找出狗的種類;

Java使用的是class關鍵字來描述類;

//建立一個名為Dog的類
class Dog{ }

3、第二步:發現類的特徵

我們可以根據每個物件,抽取出他們相同的特徵(屬性);但是任何一個物件都會有多個特徵

例如:Dog狗類的特徵有

雖然特徵很多,但是實際我們只存放我們所需要的特徵(屬性):

class Dog {
String name = "旺財"; // 暱稱
int health = 100; // 健康值
int love = 0; // 親密度
String strain = "拉布拉多犬"; // 品種
}

4、第三步:發現類的方法

類的方法也可以稱為行為,是動態的。每個方法都可以看出是一個獨立的功能

和屬性一樣,我們存放的也是我們所關心的行為

class Dog {
String name = "旺財"; // 暱稱
int health = 100; // 健康值
int love = 0; // 親密度
String strain = "拉布拉多犬"; // 品種
/* 輸出狗的資訊 */
public void print() {
// 輸出狗資訊的程式碼
}
}

經過以上三個步驟,我們就可以建立一個完整的類。以及指定了類中包含的屬性和方法。

2.4 類的組成

通過以上發現類的過程,我們可以看到類的基本組成:

//語法格式:
[< 修飾符>] class < 類名>
{
[<屬性宣告>]
[<構造器宣告>]
[<方法宣告>]
[{程式碼塊}]
}

1、屬性

定義屬性:語法

//語法
[修飾符] 資料型別 屬性名稱 = [初始值]; //例如
public String name = "來福"; //建立了一個屬性,並且給初始值

修飾符:

  • public: 表示公共的,訪問許可權最大的,整個專案中都可以訪問
  • private: 表示私有的,訪問許可權最小的,再能在當前類中訪問

資料型別:

  • 資料型別可以是8種基本資料型別,也可以是引用資料型別
  • 屬性的初始值取決資料型別。 int預設值是0String預設值是null

屬性名稱:

  • 屬性也稱為全域性變數
  • 只需要符合基本的命名規則和規範即可

2、方法

也稱為行為,正常一個方法表示一個具體的功能。例如:跑、吃、睡覺

//語法:
[修飾符] 返回值型別 方法的名稱([引數列表]){
//方法體。就是該方法的具體功能
} //案例
public void show(String name){
System.out.println("我的名字是:"+name);
}

方法組成的四要素:

  • 返回值
  • 方法名稱
  • 引數列表
  • 方法體

組成方法的四要素,缺一不可。

2.1 返回值

該方法執行完畢之後,把值返回給方法的呼叫者

  1. 必須定義返回值的具體的型別,如果沒有返回值使用void修飾
  2. 如果有具體的返回值,必須在語句塊中使用return語句
//沒有返回值
//1.使用void修飾
//2.不用使用return
//3.方法的呼叫者不能使用變數接收內容
public void add(int num1,int num2) {
int sum = num1+num2;
} //有返回值的情況
//1.固定返回值型別
//2.方法體後面必須使用return關鍵字返回具體的數字
//3.方法執行之後的結果,可以使用變數儲存起來
public int desc(int num1,int num2) {
int d = num1-num2;
return d;
}

2.2 方法名稱

只是一個識別符號,符合命名規則和規

規範:

  • 駝峰命名規則; 首個單詞首字母小寫,之後每隔單詞首字母大寫 getUserByName();
  • 見名知意

2.3 引數列表

定義方法的時候,引數是可選的。

  1. 形參列表:(形式引數),只是負責定義引數,以及引數的型別和名稱。但是該引數每頁實際的值
  2. 實參列表:方法的呼叫時候
//定義方法
// num1,num2表示連個形參
//語法:資料型別 引數名,多個引數之間使用逗號隔開
public int desc(int num1,int num2) {
int d = num1-num2;
return d;
} //方法呼叫
//abc:變數,接收方法的返回值
//50,20:具體的實參,實引數據型別,個數,順序必須和形參要一致
int acb = p1.desc(50,20);

2.4 方法體

{}表示方法體,也是方法具體的業務實現

public int desc(int num1,int num2) {
//具體的業務 根據場景不同。具體 也不同
int d = num1-num2;
return d;
}

3、構造方法

3.1 構造方法特徵

它具有與類相同的名稱;

它不含返回值,也不需要使用void關鍵字修飾

一個類中可以擁有多個構造方法

public class Person{
public Person(){
//預設無參構造
} public Person(String name){
//定義有參構造
}
}

3.2 構造方法作用

按照指定的規則來建立物件,完成物件的初始化工資;(給所有的屬性賦值)

//注意: 構造方法不能使用void修飾,否則就是普通方法。喪失了構造方法的作用
//構造方法通過new 關鍵字 呼叫。不能通過物件呼叫 :
new Person(); //呼叫Person無參構造
new User("zhangsan", "深圳華美居", "110"); //呼叫有引數構造

3.3 構造方法注意

  • Java語言中,每個類都至少有一個構造方法;
  • 如果類的定義者沒有顯式的定義任何構造方法,系統將自動提供一個預設的構造方法:
  • Java類中,一旦類的定義者顯式定義了一個或多個構造方法,系統將不再提供預設的構造方法;
  • 構造器的主要作用:利用構造器引數初始化物件的屬性。
public Person(String name,int age){
this.name = name;
this.age = age;
}

2.5 類圖

描述整個類的資訊;

  • 用於分析和設計“類”
  • 直觀、容易理解

三、物件

1、簡介

  • 萬物皆物件,所有的東西都是一個物件
  • 物件是類的具體實現,一個類可以建立任意多個物件
  • 每個物件其實都是一個副本,物件與物件之間互不干涉
  • 關鍵字: new
  • 使用:
    • 物件名.屬性名 -->student.username
    • 物件名.方法名() --->student.eat();

2、建立物件的語法

​ new + 構造方法() : 例如: new Dog(); new Person();

​ 特殊的方法:

​ a.不需要返回值 b.方法名和類名一致;

3、類的訪問機制

  • 在一個類中的訪問機制:類中的方法可以直接訪問類中的成員變數
  • 在不同類中的訪問機制:先建立要訪問類的物件,再用物件訪問類中定義的成員。

4、匿名物件

  • 我們也可以不定義物件的引用,而直接呼叫這個物件的方法。這樣的物件叫做匿名物件, 如:

    • new Person().shout();
  • 如果對一個物件只需要進行一次方法呼叫,那麼就可以使用匿名物件。

  • 我們經常將匿名物件作為實參傳遞給一個函式呼叫