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、寵物—現實生活中的對象
如何在計算機中描述它?
世界上具體寵物對象,特別多。那么我們如何用計算機語言來描述這么多寵物對象,如果一個個描述我們肯定是做不到的;所以我們需要掌握其中的規律來對其進行划分。
從現實中抽象出類分為三步走:
- 第一步:找出它們的種類
- 第二步:找出它們的屬性
- 第三步:找出它們的行為
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默認值是0
、String默認值是null
屬性名稱:
- 屬性也稱為全局變量
- 只需要符合基本的命名規則和規范即可
2、方法
也稱為行為,正常一個方法表示一個具體的功能。例如:跑、吃、睡覺
//語法: [修飾符] 返回值類型 方法的名稱([參數列表]){ //方法體。就是該方法的具體功能 } //案例 public void show(String name){ System.out.println("我的名字是:"+name); }
方法組成的四要素:
- 返回值
- 方法名稱
- 參數列表
- 方法體
組成方法的四要素,缺一不可。
2.1 返回值
該方法執行完畢之后,把值返回給方法的調用者
- 必須定義返回值的具體的類型,如果沒有返回值使用void修飾
- 如果有具體的返回值,必須在語句塊中使用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 參數列表
定義方法的時候,參數是可選的。
- 形參列表:(形式參數),只是負責定義參數,以及參數的類型和名稱。但是該參數每頁實際的值
- 實參列表:方法的調用時候
//定義方法
// 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();
-
-
如果對一個對象只需要進行一次方法調用,那么就可以使用匿名對象。
-
我們經常將匿名對象作為實參傳遞給一個函數調用