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

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

面向?qū)ο驩OP基礎(chǔ)理解

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

一、兩種編程思想

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

????????是一種基本的編程思想,是將一件事情按流程逐步實現(xiàn)。這種思想強調(diào)事情完成的過程,分析步驟寫出相應(yīng)的代碼。

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

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

面向?qū)ο缶幊趟枷?Object Oriented Programming 簡稱OOP )

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

面向?qū)ο蟮娜筇匦?/strong>(封裝、繼承、多態(tài))

封裝

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

繼承

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

繼承的特點

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

方法重寫override

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

重寫要求

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

重載要求

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

重載和重寫相關(guān)面試題

說出重載和重寫的異同
構(gòu)造方法能重載嗎?能重寫嗎?
構(gòu)造方法能重載不能重寫
構(gòu)造方法執(zhí)行時,一定創(chuàng)建對象嗎?
不一定。創(chuàng)建子類時自動調(diào)用父類構(gòu)造方法,不創(chuàng)建父類對象。

作業(yè)
簡易的商品管理系統(tǒng)
添加商品
刪除商品
修改商品
查看所有
購買商品
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.創(chuàng)建父類對象,調(diào)用父類中的無參構(gòu)造, 
//2.調(diào)用父類中的fun()方法 new Father(); 
//1.創(chuàng)建無參的子類對象,先調(diào)用父類中的無參構(gòu)造, 
//2.父類中的無參構(gòu)造調(diào)用子類重寫后的fun()方法, 
//3.調(diào)用子類中的無參構(gòu)造,調(diào)用重寫后的fun()方法 new Son();
 } 
} 
//最終輸出 
父類中的普通方法 
子類中的普通方法 
子類中的普通方法

多態(tài)

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

實現(xiàn)多態(tài)特性的前提

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

總結(jié)

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

多態(tài)案例--"花木蘭替父從軍"

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) { 
        //原本是直接創(chuàng)建對象,調(diào)用方法 
        /*Soldier father = new Soldier("花爸爸"); 
        *father.war();
        */ 
        //突發(fā)情況:不能創(chuàng)建父類對象了 
        //創(chuàng)建一個子類對象 
        // Woman hml = new Woman("花木蘭"); 
        //將子類對象保存到父類變量中 
        // Soldier soldier =hml; 
        Soldier soldier=new Woman("花木蘭"); 
        //這時調(diào)用的war()方法是子類重寫后的方法 
        soldier.war(); 
        //這里無法調(diào)用子類中父類里沒有的方法

抽象abstract

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

抽象類的特點

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

接口interface

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

interface定義。

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

定義接口

訪問修飾符 interface 接口名 {
}

二、類和對象

Class

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

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

對象Object

創(chuàng)建對象:
類名 對象名 =new 構(gòu)造方法 ( 參數(shù) );

類和對象的關(guān)系

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

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

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

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

三、方法

概念

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

調(diào)用方法

1、通過:“.”調(diào)用

Random rd = new Random();

//通過對象調(diào)用方法

rd.nextInt();

2、通過類名調(diào)用

/*

*math類*/

public class Test2 {

public static void main(String[] args) {

//Math類的使用

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

//Math類中的方法都是靜態(tài)方法,調(diào)用時,直接通過類名調(diào)用

//求絕對值

int i = Math.abs(-5);

System.out.println(i);

//求最大最小值

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

????????}

}

?3、通過對象調(diào)用

Random rd = new Random();

int rdNum=rd.nextInt();

Scanner sc = new Scanner(System.in);

int inp=sc.nextInt();

?自定義方法

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

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

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

訪問修飾符可以不寫

方法的分類

無參數(shù)無返回值的方法

void fun1(){

System.out.println("hello");

}

有參數(shù)無返回值的方法

void fun2(String name){

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

}

無參數(shù)有返回值的方法

int fun3(){

return 2002;

}

構(gòu)造方法

概念

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

特點

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

繼承時的特點

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

四、包package

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

五、thissuper

這兩個關(guān)鍵字,都可以當做對象或構(gòu)造方法使用。

this當做對象使用

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

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

this當做構(gòu)造方法使用

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

super當做對象使用

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

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