Java學習日記day11
内部類:
一個類中存在另一個類
内部類的分類:
成員内部類(非靜态内部類) 靜态内部類 局部内部類(匿名内部類)
内部類的成員方法中調用同名外部類的成員變量:外部類.this.變量名
調用同名内部類的成員變量:this.變量名
調用方法内的局部變量:直接變量名
成員内部類特點:
可以使用的内部修飾符:public private protected default
1. 内部類中,可以随意調用外部類成員
2. 外部類中,使用内部類成員是,需要建立内部類對象
3. 無關類中使用成員内部類
A.間接調用 在外部類中的方法建立類的對象
b. 直接調用 建立内部類對象
局部内部類[匿名内部類]
局部變量:
- 在方法内部定義的類,隻在方法中有效
- 在局部内部類中,使用局部變量,必須是final修飾的
- 一次性的類,隻能使用一次
- 沒有通路修飾符
- 作用:結合抽象類/接口使用
[*匿名内部類]
作用:實作接口/繼承抽象類
缺點:一次性使用
文法: 接口/抽象類 引用名 = new 接口/抽象類(){實作類實作的抽象方法}
Lambda表達式:特殊用法,需要一個隻有一個抽象方法的接口
用法:定義一個參數為接口的方法 調用這個方法 例如:
接口:public interface InterfaceA {
void doSomething();
}
方法 :public void lambda(InterfaceA Interface){
Interface.doSomething();
}
具體實作
lambda(()->{System.out.println("use lambda do something!!!!");});
匿名對象:
隻能使用一次,隻能調用一次方法(可以在所有類的範圍内适用)
靜态内部類
靜态内部類不能調用非靜态的成員變量和方法
複習:
面向對象
類和對象
類
類是抽象的,不真實存在
類的結構:class 類名{成員變量,成員方法,構造方法,靜态變量,靜态方法,代碼塊,靜态代碼塊}
類的特點:具有相同的屬性和方法
對象
對象是真實存在的,是類的執行個體化
建立對象:對象都是通過new建立出來的
類名 對象名 = new 類名();
使用對象
使用變量 : 對象.屬性
使用方法 : 對象.方法名()
類和對象的關系
1.先定義/聲明類 ps: class Student{ }
2.再建立類的對象 -> main方法中建立 ps: Student stu = new Student
變量
局部變量
聲明位置
形參(方法參數中定義的變量)
方法中
代碼塊中
初始化
使用前必須初始化,否則通不過編譯,局部變量沒有預設初始值
個數
聲明個數
JVM記憶體圖中位置:存在棧記憶體中
注意:局部變量不能加static,包括protected, private, public這些也不能加。局部變量儲存在棧中。
局部程式設計必須在聲明時初始化。
成員變量
執行個體變量
聲明位置:類中
初始化
聲明同時初始化
代碼塊中初始化
構造方法中初始化
個數:由對象決定,有幾個對象就有幾個成員變量
JVM記憶體圖中位置:存在于堆記憶體中
靜态變量
聲明位置:類中
初始化
在聲明同時初始化
靜态代碼塊中初始化
個數
隻有1個
JVM記憶體圖中位置:存在于方法區中
執行個體變量的靜态變量的差別
文法上
靜态變量:前面要加static關鍵詞
執行個體變量:不用加
程式上
靜态變量:屬于類,隻要進行了類加載,就會配置設定空間并使用
執行個體變量:屬于對象,必須建立對象,才會配置設定空間,才能使用這個執行個體變量
代碼塊
靜态代碼塊
結構: static { }
位置:存在類中
執行時機:在虛拟機加載類的時候就會進行加載,并且隻執行一次
作用:有些代碼需要在項目啟動時就執行的,就需要使用靜态代碼塊
比如一個項目啟動需要加載很多配置檔案等資源,就可以都放在靜态代碼塊中。
代碼塊
結構: { }
位置:存在類中
執行時機:在建立對象的時候執行,每次建立對象都會執行一次
作用:提取構造方法中相同部分,并且初始化成員變量,會在構造方法之前執行
構造方法
作用
給成員變量初始化
文法:修飾符 沒有傳回值類型 類名(參數){ }
無參數是無參構造器
有參數是有參構造器
使用
1.對象建立時調用相對應的構造方法
2.預設調用無參構造器
3.如果指定添加有參構造器,無參構造器就不添加
4.建議:什麼情況下都建議手動添加無參構造器,友善調用
構造方法和普通方法的差別
執行時間不同
構造方法:對象建立時調用相對應的構造構造方法
2.普通方法:隻有被調用時才會執行
方法
普通成員方法
文法上:沒有static修飾的方法
位置:存在于類中
方法的調用: 對象.成員方法
靜态成員方法
文法上:有static修飾的方法
位置:存在于類中
方法的調用: 類.靜态方法
注意
1.靜态方法隻能通路靜态成員(即靜态成員變量和靜态方法)
2.普通方法可以通路靜态成員,也可以通路其它普通方法
繼承
繼承的概念
繼承就是⼦類繼承⽗類的屬性和⾏為,使得⼦類對象具有與⽗類相同的屬性、相同的⾏為。
繼承的特點
1.子類擁有父類中非private的屬性和方法
2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充
3.java中的繼承隻能單繼承,即子類隻能有一個父類
4.父類可以有多個子類,并且子類之間沒有直接聯系
5.子類可以用自己的方式實作父類方法 - 重寫
繼承的關鍵字
extends 和 implements 繼承類 和實作接口
super 和 this 關鍵字
this
指目前對象
1.this可以調用自己的成員變量,也可以調用自己的成員方法
2.this可以調用自己的構造方法,this關鍵詞不能省,調用時隻能放在構造方法的第一行,并且不能同時互相調用
super
對父類對象的引用 - (在對象内部使用)
1.子類構造方法中一定都會先預設調用父類的無參構造器,使用super關鍵詞調用
2.super()隻能放在構造方法中的第一行
final關鍵詞
final:表示最終的,不可被改變的
final修飾的特點
1.final修飾的類,不能被繼承
2.final修飾的方法,不能被覆寫
3.final修飾的變量,不能被修改 - 變量的值隻能賦一次值,即變為常量
繼承中的構造器
1.子類不能繼承父類中的構造方法
2.子類會預設調用父類的無參構造器
3.如果父類中隻有,有參構造器,則需要在子類構造器中手動調用父類的有參構造器
方法的重寫和方法的重載
方法的重寫
重寫的規則
1.子類中定義的方法, 方法傳回值類型\方法名\參數清單都和父類中定義的方法完全一緻
2.子類重寫方法的通路權限不能比父類中被重寫方法的通路權限低
3.聲明為final的方法不能被重寫
4.構造方法不能被重寫
5.存在父類和子類中,子類重寫父類中相同的方法
方法的重載
重載的規則
1.重載的隻跟方法名和方法參數有關(參數:個數/順序/類型)
2.重載跟傳回值類型無關
3.存在同一個類中
封裝
概念
1.封裝戲就是把屬性私有化,不讓外部可以通路
2.給外部提供一個公開的方法:get/set方法
通路修飾符
public
全部可見
protected
同一個包下,子類,本類
default
隻能在本類和同一個包中可以見
private
本類可見
多态
存在的必要條件
1.必須有繼承關系存在
2.方法重寫
3.父類引用指向子類對象(向上造型)
例如: Animal an = new Dog();
多态的轉型
向上轉型
ps: Animal an = new Dog();
父類型的引用 指向 子類型的對象
注意:隻可以調用父類中所聲明的屬性和方法
向下轉型
ps: Dog d = (Dog)an; ->通過父類執行個體化子類
注意:隻有轉換回子類真實類型,才能調用子類獨有的屬性和方法
instanceof關鍵詞
作用:防止發生類型轉換異常(ClassCastException)
用法: if(對象 instanceof 類型){ }
傳回結果:boolean類型
成員通路特點
成員變量:編譯看左邊,運作看左邊
成員方法:編譯看左邊,運作看右邊
靜态方法:編譯看左邊,運作看左邊
抽象
抽象類
abstract修飾
類
抽象類,不具體的類(沒有包含足夠的資訊來描繪一個具體的對象)
特征
1.抽象類不能被執行個體化,也就是不能new對象,隻能被繼承
2.含有抽象方法的類,一定是抽象類。反之,抽象類中可以沒有抽象方法
3.抽象類可以包含屬性、方法、構造方法,但構造方法不能用來執行個體化對象,隻能被子類調用。
方法
抽象方法
特征
1.隻有方法聲明沒有方法體
2.抽象方法必須存在抽象類中
3.子類重寫父類時,必須重寫父類中所有的抽象方法
4.使用抽象方法時不能使用private修飾,因為抽象方法必須被子類重寫,如果使用了private聲明,則子類無法重寫
5.abstract隻能用于修飾普通方法,不能用于static方法或構造方法中
變量 -> 沒有意義
接口(interface)
定義:接口是一種特殊的抽象類
特點
1.接口中包含
變量
變量名前面預設添加:public static final ->靜态常量
聲明的同時初始化
方法
抽象方法
沒有方法體的方法
方法前面預設添加:public abstract
作用:供子類重寫
靜态方法
有方法體的方法
使用static修飾,供接口直接調用
預設方法
有方法體的方法
使用default修飾,不可省略,供子類調用或子類重寫
改成預設方法後可以選擇重寫與否
default修飾方法隻能在接口中使用,标記為普通方法
私有方法
有方法體的方法
使用private修飾,供接口中的預設方法或靜态方法調用
靜态私有
private static 修飾
普通私有
private 修飾
2.接口沒有構造方法,不能被執行個體化
3.接口支援多繼承,但接口隻能繼承接口,不能繼承類
4.一個類可以同時實作多個接口,使用時必須實作接口中的所有抽象方法,否則該類必須被定義為抽象類
内部類
作用:間接解決java中類不能多繼承的問題
種類
成員内部類
1.作為成員存在,可以被權限修飾符修飾
2.可以調用外部所有資訊
3.可以和外部類屬性/方法重名, 調用時:外部類名。this。屬性/方法
靜态内部類
1.作為靜态成員屬性存在,可以被任意權限修飾符修飾
2.可以直接調用外部類static相關的屬性和方法
3.通路外部類普通屬性和方法,則需要通過new外部類去通路
局部内部類
1.存在方法之中,隻能在方法中使用,類前不能有通路權限
2.局部内部類隻在目前方法中有效
3.不能定義static成員,因為在方法結束後,記憶體需要釋放
4.局部内部類中可以通路外部類的所有成員
2.可以直接通路方法的局部變量,但無法修改,編譯會出錯
匿名内部類
1.作用:繼承抽象類/實作接口
2.沒有類名的内部類,必須在建立時使用new語句來聲明類
ps:Outer o = new Outer(){ 重寫 }
3.匿名類和局部内部類一樣,存在方法中,可以通路外部類的所有成員。
4.匿名類中允許使用非靜态代碼塊進行成員初始化操作
5.匿名類的非靜态代碼塊會在父類的構造方法之後被執行