第五週
接口
接口的定義
-
接口相當於特殊的抽象類,定義方式、組成部分與抽象類類似
-
使用interface關鍵字定義接口
-
沒有構造方法,不能創建對象
-
只能定義:公開靜態常量、公開抽象方法
-
例子
interface MyInterface{
public static final String FIELD =“Value”;
public abstract void method();}
-
-
接口一種標準
-
接口是一種標準
接口與類的異同
-
相同:
- 可編譯成字節碼文件
- 不能創建對象
- 可以作爲引用類型
- 具備Object類中所定義的方法
-
不同
- 所有屬性都是公開靜態常量,隱式使用public static fianl 修飾
- 所有屬性都是公開靜態常量,隱式使用 public abstract 修飾
- 沒有構造方法、動態代碼塊、靜態代碼塊
接口的應用
-
什麼是接口:
-
微觀概念:接口是一種能力和約定
- 接口的定義:代表了某種能力
- 方法的定義:能力的具體要求
-
經驗:
- java爲單繼承,當父類的方法種類無法滿足子類需求時,可實現接口擴充子類能力
-
接口支持多實現,可爲類擴充多種能力
-
-
接口的規範
- 任何類在實現接口,必須實現接口中所有的抽象方法,否則此類爲抽象
- 實現接口中的抽象方法時,訪問修飾符必須是public
-
接口的引用
-
同父類一樣,接口也可聲明爲引用,並指向實現類對象
-
注意
- 僅可調用接口中所聲明的方法,不可調用實現類中獨有的方法
- 可強轉回實現類本身類型,進行獨有方法調用
-
接口的多態
-
例子
public class TestPolymorpfic{
public static void main(String[] args){
Dog myDog = new Dog(); Animal a = myDog; Runnable r =myDog; Swimmable s =myDog;
}
}
interface Runnale{
public absrtact void run();}
interface Swimmable{
public abstract void swim();}
abstract class Animal{
public void eat(){}//父類方法
public void sleep(){}//父類方法}
class Dog extends Animal implements Runnable ,Swimmable{
public void run(){}//接口方法
public void swim(){]//接口方法
public void shout(){} //獨有方法}
- 多種類型的引用指向同一個對象時,表示看待對象的視角不同
- 不同引用所能看到的對象範圍不同,只能調用自身類型中所聲明的部分
-
不同引用類型,僅可調用自身類型中所聲明的方法
接口常見關係
-
類與類
- 單繼承
- extends 父類名稱
-
類與接口
- 多實現
- implement 接口名稱1,接口名稱2,接口名稱n
-
接口與接口
- 多繼承
- extends 父接口1,父接口2,父接口n
接口的規範
- 任何類在實現接口時,必須實現接口中所有的抽象方法,否則此類爲抽象類
- 實現接口中的抽象方法時,訪問修飾符必須是public
常量接口
- 將多個常用於代表狀態或固定值的變量,以將靜態常量的形式定義在接口中統一管理,提高代碼
接口回調
- 先有接口的使用者,後有接口的實現者
- 接口的回調:先有接口的使用者,後有接口的實現者 程序員:工具的調用 工具:接口的使用者 接口:標準 接口的實現者:程序員
接口的好處:
- 程序的耦合度降低
- 更自然的使用多態
- 設計與實現完全分離
- 更容易搭建程序框架
- 更容易更換具體的實現
常用類:
內部類
-
成員內部類
- 在類的內部定義,與實例變量、實例方法同級別的類
- 外部類的一個實例部分。創建內部類對象時,必須依賴外部類對象
- 當外部類、內部類存在重名屬性時,會 優先訪問內部類屬性
- 成員內部類不能定義靜態成員
-
靜態內部類
- 不依賴外部類對象,可直接創建或通過類名訪問,可聲明靜態成員
- 只能直接訪問外部類的靜態成員(實例成員需實例化外部類對象) outer.Inner inner = new Outer.Inner() Outer.Inner.show():
-
局部內部類
- 定義在外部類方法中,作用範圍和創建對象範圍僅限於當前方法
- 局部內部類訪問外部類當前方法中的局部變量時,因無法保障變量的生命週期與自身相同,變量必須修飾爲final
- 限制類的使用範圍
-
匿名內部類
-
沒有類名的局部內部類(一切特徵都與局部內部類相同)
-
必須繼承一個父類或者實現一個接口
-
定義類、實現類、創建對象的語法合併,只能創建一個該類的對象
-
優點:
- 減少代碼量
-
缺點
- 可讀性較差
-
-
內部類的概念:在一個類的內部再定義一個完整的類
-
內部類的特點
- 編譯之後可生成獨立的字節碼文件
- 內部類可直接訪問外部類的私有成員,而不破壞封裝
- 可爲外部類提供必要的內部功能組件
object類
-
超類、基類,所有類的直接或間接父類,位於繼續樹的最頂層
-
任何類,如果沒有書寫extends 顯示繼承某個類,都默認直接繼承Object類,否則爲間接繼續
-
Object類中所定義的方法,是所有對象都具備的方法
-
Object類型可以存儲任何對象
- 作爲參數,可接受任何對象
- 作爲返回值,可返回任何對象
getClass() 方法
- public fianl Class<?>get Class(){}
- 返回引用中存儲的實際對象類型
- 應用:通常用於判斷兩個引用中實際存儲對象類型是否一致
hashCode()方法
- public int hashCode(){}
- 返回該對象的十六進制的哈希碼值
- 哈希算法根據對象的地址或字符串或數字計算出來的int類型的數值
- 哈希碼並不唯一,可保證相同對象返回相同哈希碼,儘量保證不同對象返回不同哈希碼
toString()方法
- public String toString(){}
- 返回該對象的字符串表示(表現形式)
- 可以根據程序需求覆蓋方法,如:展示對象各個屬性值
equals() 方法
- public boolean equals (Object obj){}
- 默認實現爲(this==obj),比較兩個對象地址是否相同
- 可進行覆蓋,比較兩個對象的內容是否相同
equals()方法覆蓋步驟
- 比較兩個引用是否指向同一個對象
- 判斷obj 是否爲null
- 判斷;兩個引用指向的實際對象類型是否一致
- 強制類型轉換
- 依次比較各個屬性值是否相同
finalize()方法
- 當對象被判定爲垃圾對象時,由jvn 自動調用此方法,用以標記垃圾對象,進入回收隊列
- 垃圾對象 :沒有有效引用指向此對象時,爲垃圾對象。
- 垃圾回收:由GG銷燬垃圾對象,釋放數據存儲空間
- 自動回收機制:JVM內存耗盡,一次性回收所有垃圾對象
- 手動回收機制:使用System.gc():通知JVM執行垃圾回收
包裝類
-
定義:
- 基本數據類型所對應的引用數據類型
-
Object可統一所有數據,包裝類的默認值是null
-
基本數據類型
類型轉換與裝箱、拆箱
-
8種包裝類提供不同類型間的轉換方式
- Numer父類中 提供的6個共性方法
- parseXXX()靜態方法
- valueOf()靜態方法
-
注意:需包證類型兼容,否則拋出NumberFornamatException異常
-
JDK 5.0之後,自動裝箱、拆箱。基本數據類型和包裝類自動轉換
整數緩存區
- java預先創建了256個常用的整數包裝類型對象
- 在實際應用當中,對已創建的對象進行復用
String類
- 字符串是常量,創建之後不可改變
- 字符串字面值存儲在字符串池,可以共享
- String s =“Hello”;產生一個對象,字符串池中存儲
- String s = new String (“Hello”) ;// 產生兩個對象,堆、池各存儲一個
常用方法
- public char charAt(int index):根據下標獲取字符
- public boolean contains(Stirng str):判斷當前字符串中是否包含str
- public char[] toCharArray():將字符串轉換成數組
- public int indexOf(String str):查找str 首次出現的下標,存在,則返回該下標;不存在。則返回-1
- public int lastIndexOf(Stirng str ):查找字符串在當前字符串中最後一次出現的下標索引
- public int length():返回字符串的長度
- public int length():返回字符串的長度
- public String trim():去掉字符串前後的空格
- public String toUpperCase():將小寫轉成大寫
- public boolean endWith(String str):判斷字符串是否以str結尾
- public String replace(char oldChar,char newChar):將字符串替換成新字符串
- public String[] split(String str):根據str做拆分
可變字符串
- StringBuffer:可變長字符串,JDK1.0提供,運行效率慢、線程安全
- StringBuilder:可變長字符串,JDK5.0提供,運行效率快、線程不安全
BigDecimal
-
除法:Bigdecimal(BigDecimal bd ,int scal,RoundingMode mode)
-
參數scal :指定精確到小數點後幾位
-
參數mode
- 指定小數部分的取捨模式,通常採用四舍五人的模式
- 取值爲BigDecimal.ROUND_HALF_UP
常用類
集合
概念:對象容器。存儲對象的對象,可代替數組
特點:容器的工具類 ,定義了多個對象進行操作的常用方法
位置: java.util.*
Collection 體系集合
該體系結構的根接口,代表一組對象成爲“集合”
-
List
List 接口的特點:有序、有下標、元素可重複
- ArrayList
- LinkedList
- Vector
- 子主題 4
-
Set
Set 接口的特點:無序、無下標‘、元素不能重複
-
hashSet
-
SortedSet
- TreeSet
-
Collection 父接口
-
特點:代表一組任意類型的對象,無序、無下標
-
方法
- boolean add(Object obj)//添加一個對象
- boolean addAll(Collection c)//將一個集合中的所有對象添加到此集合中
- void clear() // 清空此集合中的所有對象
- Boolean contains(Object o)//檢查此集合中是否包含o 對象
- boolean equals(Object o)// 比較此集合是否與指定對象相等
- boolean isEmpty()// 判斷集合是否爲空
- Boolean remove(Object o) //在此集合移除0對象
- int size()// 返回此集合中的元素個數
- Object[] toArray()// 將此集合轉換成數組
List集合
-
List子接口
-
特點:有序、有下標、元素可以重複
-
方法
- void add(int index,Object o) //在index位置插入對象
- boolean addAll(int index ,Coolection c) // 將一個集合中的元素添加到此集合中的index位置
- Object get(int index )// 返回集合中指定位置的元素
- List subList(int fromIndex ,int toIndex) // 返回fromIndex和toIndex之間的集合元素
-
-
List實現類
-
ArrayList【重點】
- 數組結構實現,查詢快、增刪慢
- JDK1.2版本,運行效率快、線程不安全
- 必須開闢連續空間,查詢快,增刪慢
-
Vector
- 數組結構實現,查詢快、增刪慢
- JDK1.0版本,運行效率慢、線程安全
-
LinkedList
- 鏈表結構實現、增刪 快、查詢慢
- 無需開闢連續空間,查詢慢、增刪快
-
泛式集合
-
概念:參數化類型、類型安全的集合,強制集合元素的類型必須一致
-
特點
- 編譯時即可檢查,而非運行時拋出異常
- 訪問時, 不必類型轉換(拆箱)
- 不同泛型之間引用不能相互賦值,泛型不存在多態
Colletions 工具類
-
概念:集合工具類,定義了除了存取以外的集合常用方法
-
方法
- public static void reverse(List<?> list)//反轉集合中元素的順序
- public static void shuffle(List<?> list )// 隨機重置集合元素的順序
- public static void sort(List list) //升序排序(元素類型必須實現 Comparable接口)
Set 集合
-
Set子接口
- 特點:無序、無下標、元素不可重複
- 方法:全部繼承自Collection中的方法
-
Set實現類
-
Hash Set【重點】
- 基於HashCode實現元素不重複
- 當存入元素的哈希碼相同時,會調用equals進行確認,如結果爲true,則拒絕後者存入
-
LinkedHashSet
- 鏈表實現的HashSet,按照鏈表進行存儲,即可保留元素的插入順序
-
TreeSet
- 基於排序順序實現元素不重複
- 實現了SortedSet接口,對集合元素自動排序
- 元素對象的類型必須實現Comparable接口,指定排序規則
- 通過CompareTo 方法確定是否爲重複元素
-
Map體系集合
-
hashMap
-
SortedMap
-
map接口的特點
- 用於存儲任意鍵值對(Key - value)
- 鍵:無序、無下標、不允許重複(唯一)
- 值:無序、無下標、允許重複
-
Map 父接口
-
特點
- 存儲一對數據(key-Value),無序、無下標,鍵不可重複,值可重複
-
方法:
- V put(K key ,V value )// 將對象存入到集合中。關聯鍵值。key 重複覆蓋原值
- Object get(Object key)// 根據鍵獲取對應的值
- Set // 返回包含所有值得Collection集合
- Set<Map.Entry<K,V>>// 鍵值匹配的Set 集合
-
-
Map集合的實現類
-
HashMap【重點】:
- JDK1,2版本,線程不安全,運行效率快;允許用null作爲key 或是value
-
Hashtable
- JDK1.0版本,線程安全,運行效率慢;不允許null 作爲key 或是value
-
Properties
- Hashtable的子類,要求key 和value都是String 。通常用於配置文件的讀取
-
TreeMap
- 實現了SortedMap接口(是Map的子接口),可以對Key 自動排序
-
總結
集合的概念
- 對象的容器,存儲對象的對象,定義了對多個對象進行操作的常用方法
List集合
- 有序、有下標、元素可重複。(ArrayList,LinkedList、Vector)
Set集合
- 無序、無下標、元素不可重複。(HashSet、LinkedList、TreeSet)
Map集合
- 存儲一對數據,無序、無下標,鍵不可重複,值可重複。(hashmap、HashTable)
Collections
- 集合工具類,定義了除了存取以外的集合常用方法