面向對象語言是基于面向過程的!
面向過程:代表:c語言
面試題:
面向對象思想的特點: 千萬不要說:萬物皆對象!
面向對象設計原則:
就是不斷建立對象,使用對象,指揮對象做事情
面向對象的三個特征:
封裝:
繼承
多态
類和對象的關系
類是描述現實世界的事物
學生---->學生事物 ---->學生類:student
屬性:姓名,年齡,性别,學号
成員變量:在類中方法外
行為:主要工作學習
成員方法:去掉static
代碼塊:
在java語言,用{}括起來的内容,簡稱為代碼塊!
代碼塊的分類:
局部代碼塊
書寫的位置,是在方法中定義的{代碼...}
作用:限定變量的生命周期的
構造代碼塊
在類的成員位置,每次在執行構造方法之前,如果目前類中有構造代碼塊,優先執行構造代碼塊,在執行構造方法
作用:如果多個類的構造方法中有共有的内容,可以将抽取到構造代碼塊中
靜态代碼塊
在類的成員位置,在{} 外面被static,靜态代碼塊
優先于對象存在!
靜态代碼塊隻執行一次,優先執行
類的成員:
1)成員變量
2)構造方法: 無參構造方法/有參構造方法
3)成員方法
如何使用文檔說明書?
進入jdk文檔之後
點選顯示--->索引---->查詢哪個類 比如scanner
static的特點:
随着類的加載而加載(static跟類有關系)
1)被static修身的變量/方法,它都是優先于對象存在
2)static可以被多個對象共享
舉例:
我們java班共享一個班級号
static關鍵字的注意:
1)在靜态方法中,是沒有this關鍵字
被靜态修飾的是随着類的加載而加載,this随着對象的建立而存在
靜态優先于對象存在!
被靜态修飾的内容一般稱為:類成員
2)通路的問題
在靜态方法中,
針對成員變量:隻能通路靜态的成員變量
針對成員方法:隻能通路靜态的成員方法
在非靜态方法中
成員變量:既可以通路靜态成員變量,也可以通路非靜态的成員變量
成員方法:既可以通路靜态的成員方法,也可以通路非靜态的成員方法
繼承:将一些類共性内容抽取出來,封裝到一個獨立的類中,并且讓這個獨立的類和這些類産生一種關系,叫做繼承!
将上述代碼改進:使用繼承
抽象類:
比如動物吃的功能,每個具體的動物吃的功能不一樣,在目前類中隻是給出一個方法聲明(抽象的,不帶方法體)
在一個類中,給出一個抽象功能,就必須将這個類定義為抽象類!
抽象類的格式
abstract class 父類名(animal){
}
抽象方法的格式:
public abstract(必須寫) 方法名() ; //抽象方法
注意:
1)如果一個類中有抽象方法,那麼這個類一定抽象類
2)抽象類中一定有抽象方法嗎? 還可以非抽象的
抽象類的特點:
1)抽象類不能直接執行個體化(不能直接建立對象)
2)子類必須重寫父類的抽象功能
抽象類的子類:
1)抽象類的子類如果是抽象類呢? 沒有任何意義,因為使用的就是通過具體類建立對象,具體類都抽象類,沒意義!
實際工作中:
1)接口多态(用的最多)
2)抽象類多态
3)具體類對象的建立
抽象類成員的特點:
成員變量:
可以是變量,也可以是一個常量(自定義常量)
構造方法:
所有的構造方法都是給對象進行初始話:1)預設初始化 2)顯示初始化
成員方法:
可以是抽象的方法,也可以非抽象的方法
多态:某個事物在不同時刻展現出來的不同狀态!
水: 事物
液态 氣态 固态
多态的前提條件:
1)必須有繼承關系
2)必須方法重寫
貓狗案例:每個動物具體的吃的功能是不一樣,必須有方法重寫,将父類的功能覆寫掉!
3)必須有父類引用指向子類對象 :向上轉型
格式:
父類名 對象名 = new 子類名() ;
多态中的成員通路特點
1)成員變量的通路特點:
編譯看左,運作看左 (左:父類)
2)成員方法(一般沒有強調靜态方法都是非靜态的)的通路特點:
編譯看左,運作看右
3)構造方法:作用:就是給對象進行初始化的
4)靜态的成員方法的通路特點:
編譯看左,運作看左(靜态的成員方法算不上方法重寫,因為靜态的都和類有直接關系!)
多态的好處:
1)提高代碼的擴充性(由多态保證)
2)提高代碼的維護性(由繼承關系)
多态的弊端:
不能通路子類特有功能
最優秀的方式:使用向下轉型:将父類對象強制轉換為子類的引用
子類名 子類對象名 = (子類名)父類的對象;
向下轉型使用不當的時候,會出現一個異常:classcastexceptino:類轉換異常
類的初始化
繼承過程中,分層初始化;首先父類初始化,然後是子類
建立一個類的對象的時候,是通過構造方法建立對象,構造方法的作用:給對象進行初始化話的
繼承中的成員方法通路特點:
子類繼承父類,當成員方法名稱不一緻的時候,分别調用
當成員方法名稱一緻的情況,首先在子類中有麼有該方法,如果有,就調用;如果沒有,就調用父類的成員方法;
法重寫:override:繼承裡面的技術
當子類出現了和父類一模一樣的方法的時候,子類的方法會重寫(覆寫,複寫)父類的方法,調用的子類的功能
方法重載:overload:方法裡面的
在方法中,多個方法名相同,并且他的參數清單不同,與傳回值無關
參數清單不同:
1)參數個數不同
2)參數類型不同
接口:(開發過程中要遵循面向接口程式設計!)
将一些額外(擴充)功能,暴露出來,隻要哪些類實作了這個接口,就一定要取實作接口中的功能!
接口的實作類和接口之間是一種實作關系
class 類名 implements(實作) 接口名{
接口的子實作類:
1)如果接口的實作類是一個抽象類;沒有意義,接口本身不能執行個體化,需要通過子實作類來進行執行個體化,如果子實作類
都被抽象了,不能建立對象了,這種沒意義!
2)接口的實作類是具體類,接口名 對象名 = new 子實作類名() ; 接口多态(推薦方式:開發中這種方式最多)
接口不能執行個體化(不能建立對象)
實際開發中命名規則:
實作類命名規則:接口名+impl :實作類
接口的成員特點:
存在預設的修飾符: public static finla
構造方法:接口中沒有構造方法
預設的修飾符:public abstract
關系的差別:
類與類的關系
extends:繼承關系 單繼承,不能多繼承,但是可以多層繼承
類與接口的關系:implements :實作關系 ,并且一個類繼承另一個類的同時還能實作多個接口
任何類都需要繼承自object類,代表所有類的根類.
形式參數問題
基本資料類型(不做研究,比較簡單)
引用類型
(具體)類 :需要該具體類對象
抽象類的情況:形參是一個抽象類,那麼實際需要該抽象類子類對象 (抽象類多态)
@author administrator
多态: fu f = new zi() ;
方法傳回值的情況:
1)傳回基本類型 :比較簡單 (傳回什麼基本類型資料,用什麼基本類型接收)
string(特殊的引用類型)
2)引用類型:
(具體)類:需要傳回的是該具體類 具體對象(或者匿名對象)
抽象類:需要傳回的是該抽象類的子類對象
抽象類
接口
(具體)類:需要該具體類 具體對象(或者匿名對象)
方法的形式參數
接口類型:需要該接口的子實作類的對象
方法的傳回值