日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

面向對象OOP基礎理解

作者:m0_72954164 更新時間: 2022-07-26 編程語言

一、兩種編程思想

面向過程編程(Procedure Oriented Programming 簡稱為POP

????????是一種基本的編程思想,是將一件事情按流程逐步實現。這種思想強調事情完成的過程,分析步驟寫出相應的代碼。

????????如猜拳游戲,每一個步驟都能按順序用代碼描述出來,邏輯清晰。但如果邏輯復雜,如象棋游戲,則無法使用POP的思想實現。

????????C語言就是一門標志性的面向過程編程語言。

面向對象編程思想(Object Oriented Programming 簡稱OOP )

????????是當前主流的編程思想,將解決問題的所有參與對象 創建出來,賦予對象對應的 行為 屬性
讓這些對象互相配合完成,實現最終效果。 這種思想致力于將計算機中的世界,描述的和現實中一致。

面向對象的三大特性(封裝、繼承、多態)

封裝

使用 private 關鍵字對屬性進行修飾,可以防止除自身類之外的地方對該屬性進行訪問。
這樣可以保護關鍵屬性,隱藏類內部的實現細節,再對外提供一組公開的 get/set 方法用于對該屬性的賦值和讀取。

繼承

A 可以通過 extends 關鍵字繼承類 B
語法: class A extends B。
A 稱為 子類 、派生類、衍生類、 subClass。
B 稱為 父類 、基類、超類、 superClass。
繼承后,子類可以訪問父類中非私有的屬性和方法。
不同的子類中相同的代碼,都可以定義在父類中,減少子類中的代碼冗余。
如小孩類和老人類都有姓名、年齡等屬性,都有吃、睡等方法,那么就可以定義一個人類,將這些屬性和方法寫在里面,讓小孩類和老人類繼承人類。

繼承的特點

如果多個類之中有相同或類似的代碼,可以將這些代碼提出來定義在一個公共的類中,這個類就是
父類。再讓那些類去繼承這個父類,這樣就能減少子類的重復代碼。
子類對象可以直接訪問父類中非私有的屬性和方法。
子類可以對父類中的方法進行拓展或覆蓋,這稱為方法重寫,重寫后,子類對象再調用該方法時,
執行的是重寫后的內容。
java 中是單繼承,一個子類只能有一個父類,一個父類可以有多個子類。
java 中可以多重繼承,類 A 可以繼承類 B ,類 B 也可以繼承類 C ,這時類 A 可以訪問類 B 和類 C 中非私
有的成員。
任何類都是 Object 類的子類。
在創建子類對象時,先執行父類中相應的構造方法。

方法重寫override

當子類繼承父類后,可以對父類中非私有的方法進行拓展。
這個行為稱為方法重寫。
重寫用于子類拓展父類的某個方法。

重寫要求

方法名、參數列表、返回值必須和父類一致
訪問權限不能比父類更嚴格 ( 訪問修飾符的范圍要么相同要么更大 )
不能拋出比父類更大的異常
方法重載 overload
一個類中 ,如果多個方法的 方法名相同 參數列表不同 ( 參數類型不同或參數數量不同 ) 時,這些方法稱 為重載的方法。同名不同參
重載用于在一個類中,某個方法在不同的條件下,執行不同的內容。

重載要求

方法名相同
參數列表 ( 參數類型和數量 ) 不同

重載和重寫相關面試題

說出重載和重寫的異同
構造方法能重載嗎?能重寫嗎?
構造方法能重載不能重寫
構造方法執行時,一定創建對象嗎?
不一定。創建子類時自動調用父類構造方法,不創建父類對象。

作業
簡易的商品管理系統
添加商品
刪除商品
修改商品
查看所有
購買商品
public class Father{ 
    public Father(){ 
        fun(); 
}
    public void fun(){System.out.println("父類中的普通方法");}
}
    
public class Son extends Father{ 
    public Son(){ 
         fun(); 
}

public void fun(){
 System.out.println("子類中的普通方法"); 
} }
public class Test{ 
public static void main(String[] args){ 
//1.創建父類對象,調用父類中的無參構造, 
//2.調用父類中的fun()方法 new Father(); 
//1.創建無參的子類對象,先調用父類中的無參構造, 
//2.父類中的無參構造調用子類重寫后的fun()方法, 
//3.調用子類中的無參構造,調用重寫后的fun()方法 new Son();
 } 
} 
//最終輸出 
父類中的普通方法 
子類中的普通方法 
子類中的普通方法

多態

多態是面向對象語言的一種特性,通常在代碼中用于:需要使用一個父類對象時,實際傳遞的是一個子 類對象,這時可以將子類對象當做父類 對象使用。這種特性稱為 多態
在不使用多態特性的情況下,假如要調用計算圖形面積的方法,參數為圓時,輸出圓的面積,參數為正 方形時,輸出正方形的面積。。。如果有新的圖形出現,就要再重載這個計算面積的方法。
如果使用多態,就可以不用重載那些方法,只需要定義一個參數為所有圖形的父類,調用該父類對象的 計算方法。具體計算方法交給子類重寫。這樣就免去了重載的過程,只定義一個參數為父類對象的方 法,實際傳遞子類對象,調用方法時執行的是子類重寫后的內容。

實現多態特性的前提

必須在繼承關系中
子類的對象保存在父類的變量中(也稱為向上轉型)
//Father類是Son類的父類 
//原本應該是Father類的對象保存到f中,但這里用子類對象也可以 
Father f = new Son();
子類通常會重寫父類的方法

總結

在需要父類對象時,將子類對象當做父類對象使用。
這時父類對象調用的是子類重寫后的方法,不能調用子類中父類沒有的方法

多態案例--"花木蘭替父從軍"

Woman

package com.hqyj.test2; 
public class Woman extends Soldier { 
    public Woman(String name) { 
        super(name); }
        /** 定義化妝的方法 * */ 
    public void dressUp() { 
        System.out.println(getName() + "化妝打扮"); }
        /** 重寫父類的方法 * */
    @Override public void war() { 
        System.out.println(getName() + "男扮女裝上陣殺敵"); 
    } 
}
Soldier
package com.hqyj.test2; 
public class Soldier { 
    private String name; 
    public String getName() { 
        return name; 
    }
    public void setName(String name) { 
        this.name = name; 
    }
    public Soldier(String name) { 
        this.name = name; 
    }
    public void war() { 
        System.out.println(name+"上陣殺敵"); 
    } 
}
測試類
package com.hqyj.test2; 
/** 花木蘭替父從軍 ** */ 
public class Main { 
    public static void main(String[] args) { 
        //原本是直接創建對象,調用方法 
        /*Soldier father = new Soldier("花爸爸"); 
        *father.war();
        */ 
        //突發情況:不能創建父類對象了 
        //創建一個子類對象 
        // Woman hml = new Woman("花木蘭"); 
        //將子類對象保存到父類變量中 
        // Soldier soldier =hml; 
        Soldier soldier=new Woman("花木蘭"); 
        //這時調用的war()方法是子類重寫后的方法 
        soldier.war(); 
        //這里無法調用子類中父類里沒有的方法

抽象abstract

是一個修飾符,用于修飾方法或類。

抽象類的特點

抽象類不能實例化 ( 不能創建抽象類的對象 )。
抽象類中可以有抽象方法,也可以有普通方法、構造方法 ( 除抽象方法外和普通類一樣 )。
抽象類的構造方法在創建其子類對象時自動執行,但不會創建抽象類的對象。
某個類如果繼承了抽象類,那么這個類要么也是抽象類,否則就要重寫抽象類中的所有抽象方法。
通常抽象類都需要子類繼承后重寫其中的抽象方法。

接口interface

java 中,數據類型分為原始類型和引用類型。
引用類型分為:數組、類和接口。所以接口是一種數據類型,類似于類。類使用 class 定義,接口使用

interface定義。

如果一個抽象類中的所有方法都是抽象方法,那么就可以將這個抽象類定義為接口。

定義接口

訪問修飾符 interface 接口名 {
}

二、類和對象

Class

具有相同的屬性和行為的對象的集合,稱為 " 一類 " 類也可以稱為模板
屬性 :描述對象的特征,在程序中,通過 定義變量 的形式表現屬性。
行為 :描述對象的動作,在程序中,通過 定義方法 的形式表現行為。

定義類
[ 修飾符 ] class 類名 {
// 屬性 ( 變量 )
// 行為 ( 方法 )
}

對象Object

創建對象:
類名 對象名 =new 構造方法 ( 參數 );

類和對象的關系

對象是類的具體表現,類是對象的合集 ( 模板 )
如包餃子時的模具就是一個類,每次用模具包出來的餃子都是一個個對象。
先定義模板類,才能通過類創建出對象。

簡述成員變量和局部變量的區別以及生命周期

成員變量定義在類中,有默認值

局部變量定義在方法中,沒有默認值
成員變量的生命周期:隨著類創建對象,成員變量初始化,該對象回收,成員變量銷毀
局部變量的生命周期:隨著方法調用,局部變量初始化,方法調用結束,局部變量銷毀

三、方法

概念

方法可以理解為一段獨立的代碼,能完成一件事,可以被重復調用。方法可以減少重復的代碼。

調用方法

1、通過:“.”調用

Random rd = new Random();

//通過對象調用方法

rd.nextInt();

2、通過類名調用

/*

*math類*/

public class Test2 {

public static void main(String[] args) {

//Math類的使用

//Math類是一個數學工具類,其中包含了很多數學相關常量和運算的方法

//Math類中的方法都是靜態方法,調用時,直接通過類名調用

//求絕對值

int i = Math.abs(-5);

System.out.println(i);

//求最大最小值

System.out.println(Math.max(1, -5));

????????}

}

?3、通過對象調用

Random rd = new Random();

int rdNum=rd.nextInt();

Scanner sc = new Scanner(System.in);

int inp=sc.nextInt();

?自定義方法

?其中返回值方法名參數列表是組成方法的三要素。

返回值可以是任意數據類型(原始類型/引用類型)

參數列表只需寫參數類型和參數名,多個參數用逗號隔開

訪問修飾符可以不寫

方法的分類

無參數無返回值的方法

void fun1(){

System.out.println("hello");

}

有參數無返回值的方法

void fun2(String name){

System.out.println("你好"+name);

}

無參數有返回值的方法

int fun3(){

return 2002;

}

構造方法

概念

是一個特殊的方法,沒有返回值,方法名和類名一致。每個類在定義時,都有一個默認隱藏的無參
數的。構造方法,在創建對象時自動調用,通常用于初始化成員變量。

特點

沒有返回值 ( 沒有返回值,并不是 void) ,方法名和類名必須相同。
每個類默認有一個無參數的構造方法,方法體中沒有內容。
構造方法不能通過 . 操作符調用,在創建對象時自動調用,所以通常用于初始化成員變量。
如果自己寫了有參的構造方法,默認無參的構造方法就會失效,如果想要使用無參的構造方法,需
要再寫出來才能使用。
構造方法可以限制創建對象時的參數。
可以同時存在多個不同參數的構造方法,這稱為構造方法的重載。

繼承時的特點

如果父類中重載了構造方法,默認無參構造方法就會失效,同時子類也會報錯。
這時需要在子類的某個構造方法中,再調用父類的那個重載的構造方法即可。

四、包package

通過包可以將 .java 源文件進行結構化管理,相當于 windows 中的文件夾。
不同的包中,可以保存相同名稱的 .java 源文件。
某個類在某個包中時,會在該類的代碼最上加上 package 包名 ;

五、thissuper

這兩個關鍵字,都可以當做對象或構造方法使用。

this當做對象使用

用法: this. 屬性或 this. 方法。
這時的 this ,表示當前類的對象。只能在方法中使用。
通常用于在方法中區分成員變量和參數。如封裝時的 set 方法就用到了 this 區分

public class Person{ 
    private String name; 
    public void setName(String name){ 
    //這里的this,表示當前類Person的一個對象 
    //相當于Person p = new Person()后的p。 
    this.name=name; 
    } 
}

this當做構造方法使用

用法: this([ 實際參數 ]);
此時的 this() 表示,當前類的一個構造對應的構造方法。
必須要寫在另一個構造方法的第一行才能使用。
public class Father{ 
//任何類都隱藏有這段代碼 
    public Father(){ 
    } 
}
public class Son extends Father{ 
    //對于每個使用了extends關鍵字的類來說,都隱藏有這段代碼 
    public Son(){ 
    //調用父類中無參數的構造方法 
    super(); 
    } 
}
//以上代碼可以看出,在創建子類對象時,會自動執行父類的構造方法。

super當做對象使用

用法同 this ,但 super 表示父類的對象。
可以通過 super 訪問父類對象中的非私有屬性和方法

原文鏈接:https://blog.csdn.net/m0_72954164/article/details/125981754

欄目分類
最近更新