Java面向對象筆記

類和對象

  • 對象的概念
  • 什么是面向對象
  • 什么是對象的屬性
  • 什么是對象的方法
  • 類與對象的關系/與區別

什么是對象

萬物皆對象, 客觀存在的事物皆為對象  

什么是類

類是模子, 確定對象將會擁有的特征(屬性)和行為(方法)
類的特點:
      類是對象的類型
      具有相同的屬性和方法的一組對象的集合
其實類在客觀世界里是不存在的, 只是用來描述對象信息

什么是對象的屬性

屬性--對象具有的各種特征
       每個對象的每個屬性都擁有特定的值

類和對象的關系

類是抽象的概念, 僅僅是模板, 比如說 : "手機";
對象是一個能看得到, 摸得著的具體實物

定義類

1.類的重要性 : 所有Java程序都以類class為組織單元
2.什么是類?
    類是模子, 確定對象將會擁有的特征(屬性)和行為(方法)
3.類的組成 : 屬性和方法
4.定義一個類的步驟 : 
    a. 定義類名
    b. 編寫類的屬性
    c. 編寫類的方法  

Java對象

使用對象的步驟 : 
    1. 創建對象 : 
          類名 對象名 = new 類名();
          Telephone phone = new Telephone();
      ps: 類是以代碼的形式保存在文件中, 當把文件信息放到內存中, 此時,這些信息的集合就叫對象, 這個過程叫做實例化.
    2. 使用對象
          引用對象啊的屬性 : 對象名.屬性
          phone.screen = 5; // 賦值
          引用對象的方法 : 對象名 . 方法名();
          phone.send(); // 調用send方法

成員變量和局部變量

1.成員變量
      在類中定義, 用來描述對象將要有什么
      成員變量可以被本類的所有方法使用, 也可以被與本類有關系的其他方法使用
2.局部變量
      在類的方法中定義, 在方法中臨時保存數據
      只能在本方法中使用
區別 : 
      1.作用域不同
        局部變量的作用域僅限于定義它的方法
        成員變量的作用域在整個類的內部都是可見的
      2.初始值不同
        Java會給成員變量一個初始值
        Java不會給局部變量賦予初始值
      3.在同一個方法中不允許有同名局部變量
        在不同的方法中, 可以有同名局部變量
      4.兩類變量同名時, 局部變量具有更高的優先級

構造方法

1.使用new + 構造方法 創建一個新的對象
2.構造方法是定義在Java類中的一個用來初始化對象的方法
    構造方法的類名同名且沒有返回值
3.語法格式
public 構造方法名() {
  // 初始化代碼
}
無參構造方法 : 當沒有指定構造方法時, 系統會自動添加無參的構造方法
有參構造方法 : 為了初始化成員變量的值, 當有指定構造方法, 無論是有參, 無參的構造方法, 都不會自動添加無參構造方法
構造方法的重載 : 方法名相同, 但參數不同的多個方法, 調用時會自動根據不同的參數選擇相應的方法
構造方法不但可以給對象的屬性賦值, 還可以保證給對象的屬性賦一個合理的值

Java中的static使用之----靜態變量

Java 中被 static 修飾的成員稱為靜態成員或類成員。它屬于整個類所有,而不是某個對象所有,即被類的所有對象所共享。
靜態成員可以使用類名直接訪問,也可以使用對象名進行訪問。當然,鑒于他作用的特殊性更推薦用類名訪問~~
static 可以修飾變量、方法和代碼塊
PS : 靜態成員屬于整個類,當系統第一次使用該類時,就會為其分配內存空間直到該類被卸載才會進行資源回收!~~

Java中的static使用之----靜態方法

1.靜態方法中可以直接調用同類中的靜態成員,但不能直接調用非靜態成員。
    如果希望在靜態方法中調用非靜態變量,可以通過創建類的對象,然后通過對象來訪問非靜態變量。
2.在普通成員方法中,則可以直接訪問同類的非靜態變量和靜態變量
3.靜態方法中不能直接調用非靜態方法,需要通過對象來訪問非靜態方法。

Java中的static使用之----初始化塊

Java 中可以通過初始化塊進行數據賦值
在類的聲明中,可以包含多個初始化塊,當創建類的實例時,就會依次執行這些代碼塊。如果使用 static 修飾初始化塊,就稱為靜態初始化塊
PS : 靜態初始化塊只在類加載時執行,且只會執行一次,同時靜態初始化塊只能給靜態變量賦值,不能初始化普通的成員變量。
程序運行時靜態初始化塊最先被執行,然后執行普通初始化塊,最后才執行構造方法。由于靜態初始化塊只在類加載時執行一次

面向對象特性

  1. 封裝
  2. 繼承
  3. 多肽

封裝

1.概念 : 
  將類的某些信息隱藏在類內部, 不允許外部程序直接訪問, 而是通過該類提供的方法來實現對隱藏信息的操作和訪問
2.好處 : 
  a.只能通過規定的方法訪問數據
  b.隱藏類的實例細節, 方便修改和實現
3.封裝的實現步驟 : 
  第一步, 修改屬性的可見性---設為private
  第二步, 創建getter/setter方法---用于屬性讀寫
  第三步, 在getter/setter方法中加入屬性控制語句---對屬性值的合法性進行判斷

Java中的包

1. 包的作用:
    管理Java文件
    解決同名文件沖突
2. 定義包 : package 包名
    注 : 必須放在Java源程序的第一行
          包名可以用"."號隔開
3. 系統中的包
    java.(功能).(類)
    java.lang.(類)  包含java語言基礎的類
    java.util.(類)  包含java語言中各種工具類
    java.io.(類)  包含輸入,輸出相關功能
4. 包的使用
    (1),可以通過import關鍵字, 在某個文件使用其他文件中的類.
    (2),Java中, 包的命名規范全是小寫字母拼寫
    (3),使用的時候不但可以加載某個包下的所有文件, 也可以加載某個具體子包下的所有文件

Java中的訪問修飾符

訪問修飾符 --- 可以修飾屬性和方法的訪問范圍
訪問修飾符  本類  同包  子類  其他
private     √
默認         √     √
protected   √      √    √
public      √      √    √    √

Java中的this關鍵字

1. this關鍵字代表當前對象
   this.屬性  操作當前對象的屬性
   this.方法  調用當前對象的方法
2. 封裝對象的屬性的時候, 經常會使用this關鍵字

Java中的內部類

1. 概念 : 
   內部類( Inner Class )就是定義在另外一個類里面的類。與之對應,包含內部類的類被稱為外部類
2. 作用 : 
   1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
   2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
   3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
3. 種類 : 
   成員內部類
   靜態內部類
   方法內部類
   匿名內部類
PS : 
   1.外部類是不能直接使用內部類的成員和方法的
     可先創建內部類的對象,然后通過內部類的對象來訪問其成員變量和方法。
   2.如果外部類和內部類具有相同的成員變量或方法,內部類默認訪問自己的成員變量或方法
     如果要訪問外部類的成員變量,可以使用 this 關鍵字。
Java 中的靜態內部類
   靜態內部類是 static 修飾的內部類,這種內部類的特點是:
      1.靜態內部類不能直接訪問外部類的非靜態成員,但可以通過new 外部類().成員的方式訪問 
      2.如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;
        如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
      3.創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
Java 中的方法內部類
   方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
   ps : 由于方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。

繼承

1. 繼承的概念 : 
   繼承是類與類的一種關系, 是一種"is a"的關系
   ps : Java中的繼承是單繼承
2. 繼承的好處 : 
   1.子類擁有父類所有的屬性和方法
     ps : 屬性和方法的修飾符不能是"private"
   2.實現代碼復用
3. 語法規則 : 
   class 子類 extends 父類

方法重寫

1. 什么是方法重寫?
   如果子類對繼承父類的方法不滿意, 是可以重寫父類繼承的方法的, 當調用方法時會優先調用子類的方法
2. 語法規則 : 
   a. 返回值類型
   b. 方法名
   c. 參數類型及個數
   都要與父類繼承的方法相同, 才叫方法重寫

繼承的初始化順序

1. 初始化父類, 再初始化子類
2. 先執行初始化對象中屬性, 再執行構造方法中的初始化
   eg : 父類對象 ---> 屬性初始化 ---> 構造方法 ---> 子類對象 ---> 屬性初始化 ---> 構造方法

final的使用

final關鍵字
   使用final關鍵字做標識有"最終的"含義
final可以修飾類, 方法, 屬性和變量
   final修飾類, 則該類不允許被繼承
   final修飾方法, 則該方法不允許被覆蓋(重寫)
   final修飾屬性
      則該類的屬性不會進行隱式的初始化(類的初始化屬性必須有值)
      或者在構造方法中賦值(但只能選其一)
   final修飾變量, 則該變量的值只能賦一次值, 即為常量

super關鍵字

super關鍵字 : 在對象的內部使用, 可以代表父類對象
1. 訪問父類的屬性
   super.父類屬性;
2. 訪問父類方法
   super.父類方法()
ps : 子類的構造過程當中必須調用其父類的構造方法
     如果子類構造方法中沒有顯式調用父類的構造方法, 則系統默認調用父類無參構造方法
     如果顯式的調用構造方法, 必須在子類的構造方法的第一行
     如果子類構造方法中既沒有顯式調用父類的構造方法, 而父類又沒有無參構造方法, 則編譯出錯

Object類

1. toString()方法
   在Object類里面定義toString()方法的時候,返回的對象的哈希code碼(對象地址字符串)
   可以通過重寫toString() 方法表示出對象的屬性
2. equals()方法
   比較的是對象的引用是否是指向同一塊內存地址

多肽

概念 : 
   對象的多種形態
1. 引用多肽
   父類的引用可以指向本類的對象
   父類的引用可以指向子類的對象
   (子類的引用不可以指向父類)
ps : 繼承是多肽的實現基礎
2. 方法多肽
   創建本類對象時, 調用的方法為本類的方法
   創建子類對象時, 調用的方法為子類重寫的方法或者繼承的方法

引用類型轉換

1. 向上類型轉換(隱式/自動類型轉換), 是小類型到大類型的轉換
2. 向下類型轉換(強制類型轉換), 是大類型到小類型
   ps : 向上類型轉換(無風險), 向下類型轉換(有風險)
3. instanceof運算符, 來解決引用對象的類型, 避免類型轉換的安全性問題

抽象類

1. 語法定義 : 
   抽象類前使用abstract關鍵字修飾, 則該類為抽象類
2. 應用場景 : 
   a.在某些情況下, 某個父類只是知道其子類應該包含怎樣的方法, 但無法準確知道這些子類如何實現這些方法
     也就是說抽象類是約束子類必須有哪些方法, 而并不關注子類是如何實現的
   b.從多個具有相同特征的類中抽象出一個抽象類, 以這個抽象類作為子類的模板, 從而避免了子類設計的隨意性
3. 作用 : 
   限制規定子類必須實現某些方法, 但不關注實現細節
4. 使用規則 : 
   a. abstract定義抽象類
   b. abstract定義抽象方法, 只有聲明, 不需要實現
   c. 包含抽象方法的類是抽象類
   d. 抽象類中可以包含普通方法, 也可以沒有抽象方法
   e. 抽象類不能直接創建, 可以定義引用變量

接口

1. 接口概念 :  (是一種規范, 是用來約束類的)
   接口可以理解為一種特殊的類, 由全局常量和公共的抽象方法所組成
   類是一種具體的實現體, 而接口定義了某一批類所需要遵守的規范, 接口不關心這些類的內部數據, 
   也不關心這些類里方法的實現細節, 它只規定這些類里必須提供某些方法
2. 接口定義 
   和類定義不同, 定義接口不再使用class關鍵字, 而是使用interface關鍵字
接口定義的基本語法 : 
   [修飾符] (abstract 此關鍵字肯定有, 如果沒有,系統會默認加上) interface 接口名 [extends 父接口1, 父接口2...]
   {
     零到多個常量定義...
     零到多個抽象方法的定義...  
   }
   接口就是用來被繼承, 被實現的, 修飾符一般建議用public
   ps : 不能使用private和protected修飾接口
3. 常量 : 
   接口中的屬性是常量, 即使定義時不添加 public static final 修飾符, 系統也會自動加上
4. 方法 : 
   接口中的方法只能是抽象方法, 即使定義時不添加public abstract 修飾符, 系統也會自動加上
5. 使用接口 : 
   一個類可以實現一個或者多個接口, 實現接口可以使用implements關鍵字. Java中的一個類只能繼承一個父類,
   是不夠靈活的, 通過實現過個接口可以做補充
   繼承父類實現接口的語法為 : 
   [修飾符] class 類名 extends 父類 implements 接口1, 接口2...
   {
      類體部分  // 如果繼承了抽象類, 需要實現繼承的抽象方法; 要實現接口中的抽象方法
   }
   如果要繼承父類, 繼承父類必須在實現接口之前
使用接口 : 
   接口在使用過程當中, 還經常與匿名內部類配合使用
   匿名內部類就是沒有名字的內部類
   多用于關注實現而不關注實現類的名稱
語法格式 : 
   Interface i = new Interface(){
     public void method(){
       ...
     }
   }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容