Java基礎總複習(二)

二 面向對象
概述
Java語言是一種面向對象的程序設計語言,而面向對象思想是一種程序設計思想。咱們在面向對象思想的指引下,
使用Java語言去設計、開發計算機程序。 這裏的對象泛指現實中一切事物,每種事物都具有本身的屬性和行爲。面
向對象思想就是在計算機程序設計過程當中,參照現實中事物,將事物的屬性特徵、行爲特徵抽象出來,描述成計算 機事件的設計思想。
它區別於面向過程思想,強調的是經過調用對象的行爲來實現功能,而不是本身一步一步的去 操做實現。
面向過程:強調步驟。
面向對象:強調對象
類:是一組相關屬性和行爲的集合
屬性:該事物的狀態信息
行爲:該事物可以作什麼
類與對象的關係
類是對一類事物的描述,是抽象的
對象是一類事物的實例,是具體的
類是對象的模板,對象是類的實體
三種特性
封裝
原則:將屬性隱藏起來,若須要訪問某個屬性,提供公共方法對其訪問
步驟:使用private關鍵字來修飾成員變量 ; 對須要訪問的成員變量,提供對應的一對一的get××× 和set×××方法
封裝操做private的含義
private是一個權限修飾符,表明最小權限
能夠修飾成員變量和成員方法
被private修飾後的成員變量和成員方法,只在本類中才能訪問
封裝優化this方法
使用 this 修飾方法中的變量,解決成員變量被隱藏的問題
繼承
類的繼承描述的是類與類之間的關係
繼承關係–經過已有的類,建立出新類的機制
已有的類咱們叫父類【超類】 建立出來的新類咱們叫子類
經過extends關鍵字完成一個繼承關係
具體格式:
訪問修飾符 class 子類類名 extends 父類類名{
}
java中只支持單繼承【一個類只能由一個父類】
充當父類的java類絕對不能用final關鍵字修飾【被final關鍵字修飾的類是沒有子類的】
多態
前提是繼承
格式:
父類 對象名稱 = new 子類名稱(); //父類與子類有繼承關係
接口名稱 對象名稱 = new 實現類名稱();
class Dog  extends Animal{
    //狗 是 狗
    Dog d = new Dog();
    //狗 是 動物
    Animal d = new Dog();
}java

抽象
將沒有方法主體的方法稱爲抽象方法
權限修飾符
public
protected
private
default
抽象方法必須在抽象類中
抽象類能夠沒有抽象方法
抽象方法不能new 不是子類不能new
若是子類繼承了父類,就必須繼承抽象方法,必須重寫方法體
抽象類不能new的緣由:
由於有抽象方法,沒有構造方法
接口
                     抽象類                          接 口
構造方法               有                            沒有
成員變量           有普通成員變量                      沒有
普通方法           能夠包含非抽象的                   不可包含
訪問類型         能夠是public protected        只能是public(默public abstract)
靜態方法              能夠                           不能夠
靜態成員變量         訪問類型能夠任意             接口中定義的變量只能是public static final類型數組

一個類能夠實現多個接口
一個類只能夠繼承一個類(單繼承)
一個類只能夠繼承一個類,而且實現多個接口
一個接口能夠繼承另外一個接口
一個接口能夠繼承多個接口
一個接口不能繼承類
一個接口不能夠實現另外一個接口
關鍵字
this 當前的
super 父類的
static 靜態化的安全

優勢
1.可使用【類名 方法名稱】進行調用,沒必要再建立對象
2.優於構造函數先執行------> 任何一個類都會有一個默認的無參數的構造方法
構造方法/函數的做用:爲了使類可實例化【就是爲了能夠new】
3.靜態成員被全部對象所共享(靜態數據達到成爲共享數據)
4.隨着類的加載而加載(也就是說類運行了,靜態成員也就跟隨運行了)多線程

缺點
1.訪問出現侷限性 只能訪問靜態
2.靜態成員的生命週期過長
3.不能夠與this | super關鍵字同用
(1)由於this表明使當前類對象,而靜態存在時,有可能沒有對象
(2)由於super表明的是父親對象,而靜態存在時,有可能沒有對象,並且靜態優先於對象存在
4.靜態方法只能訪問靜態成員,非靜態方法既能夠訪問靜態又能夠訪問非靜態併發

final 最終化的jvm

構造方法
做用:是爲了給對象進行初始化而存在的
沒有構造方法就不能new
當你沒有寫構造方法,jvm會自動給你加上一個無參數的構造方法
成員變量or局部變量
public class Car{
    String color;  //成員變量
    public void driver(){
        int speed = 80; //局部變量
        System.out.println("時速:" + speed);
    }
}函數

在類中的位置不一樣 ★
成員變量:類中,方法外
局部變量:方法中或者方法聲明上(形式參數)
做用範圍不同 ★
成員變量:類中
局部變量:方法中
初始化值的不一樣 ★
成員變量:有默認值【int爲0 boolean爲false】
局部變量:沒有默認值 必須先定義,賦值,最後使用
在內存中的位置不一樣 瞭解
成員變量:堆內存
局部變量:棧內存
生命週期不一樣 瞭解
成員變量:隨着對象的建立而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
補:
若是private私有化了,就必定可以得提供公有方法 Getter and Setter方法 string是類
equals看的是漢字是否同樣
== 看的是兩方漢字的地址值是否同樣
三.集合
單列集合 collection / 表示爲泛型
List【線程不安全性】工具

派生類
ArrayList 查詢塊、增刪慢
LinkedList 查詢慢、增刪塊
Vector 查詢慢、增刪更慢 【線程安全性】優化

特色
使用線性存儲
能夠重複添加
存入與取出順序一致this

Set【線程不安全性】

派生類
HashSet
TreeSet

特色
使用哈希表存儲
不能夠重複添加
存入與取出順序不一致

爲何不能夠重複添加數據?

加入Set裏面的元素必須定義equals()方法以確保對象的惟一性
set插入數據時,先比較hashCode
1.若是hashCode相同纔會比較equals,equals相同,則兩個對象相同,不能插入,equals不一樣,能夠插入;
2.若是hashCode不一樣,就直接插入了,兩個對象hashCode不相等,他們equals必定是false
接口:繼承了Iterable,迭代器

foreach

雙列集合 Map /表示爲泛型 key value鍵值對
泛型:限定類型,泛型中的不可使用基礎數據類型,只能使用引用數據類型

HashMap 【線程不安全性】

迭代器iterator使用
三種迭代器方法
keyset()
先獲取鍵
經過鍵獲取值
打印值 能打印鍵
entryset()
能夠獲取鍵
也能夠獲取值
均可以打印
values()
直接獲取值
打印值 不能打印鍵
都須要使用迭代器

Iterator it = Set.iterator();
      ​               while (it.hasNext()){
      ​              it.next();  
}

TreeMap 【線程不安全性】

HashTable【線程安全性】
properties 既是io流 也是集合

list與Map不能轉換

set與Map能夠轉換 共同點有【都是線程不安全性 都是接口 都間接的繼承了Iterable這個接口】

在雙列集合接口中,並無繼承Iterable,意味着Map集合中沒有迭代器

工具類 Collections
Collections是專門用於對Collection集合進行操做的工具類,它提供了一些便捷的方法,如排序,查找,求最值等等

四. 異常
Error錯誤
CPU中央處理器

單核處理器(並行)

多核處理器(併發線程)

若是是單核處理器,就不是同時在執行

運行速度很是快,快到覺得是同時

多核處理器真的能夠同時在執行,處理器多了能夠分開執行

Exception異常
系統定義好的/官方的預約義
編譯時異常
寫代碼過程當中,寫完未執行時,報錯
運行時異常
已寫完後,已經開始運行時,報錯
自定義異常
致使緣由
算數異常
數組異常
圖片異常
圖標異常
音頻異常
io異常
解決方案
1.捕捉異常
try{
catch{
finally{
}
2.聲明式異常
在方法名稱的括號後加上一個 throws
eg:
ClassNotFoundException 找不到類異常
NoClassDefoundError 沒有定義類的異常
ArrayIndexOutOfBoundsException 數組角標超出範圍的異常
NullPointerException 空指針異常
★ RuntimeException 運行時異常
五.多線程
進程和線程定義和關係:
進程(表面):正在進行中的程序(任務管理器 ctrl+_alt+del)
線程(內在):是存在進程中的一個執行單元(沒有箱子,可是有組件)
進程和線程的關係:每個進程中至少存在一個線程,也可擁有多個線程
多線程
並行:針對於多個線程,在同一時間內發生 (重在指一段時間內)
併發:針對於多個線程,在同一時刻發生 (指的是同時)
線程調度 【Java的繼承機制:僅單繼承,不能夠多繼承】
分時調度
按方式調度
設置線程:Run()方法
開啓線程:Start()方法

實現多線程的三種方法
繼承java.lang.Thread類【extend Thread】

實現java.lang.Runnable接口(重寫Run方法)【implements Runnable】

實現Callable接口(接口中必定不容許存放變量,不可以存放常量)

Thread和Runnable的區別(實現接口比繼承類的優點)
①能夠避免單繼承的侷限性【若一個類繼承 Thread的話,則不適合資源共享;但若實現 Runnable 接口的話,就很容易實現資源共享】

②適合多個相同的程序代碼的線程去處理同一個資源
③加強程序的擴展性,下降耦合性(避免牽一髮而動全身)【代碼能夠被多個線程共享,代碼和數據獨立】
④線程池只能放入實現 Runnable 或 Callable 類的線程,不能直接放入繼承 Thread 的類

線程的狀態能夠分爲5種:
新建new:
當一個線程新建出來,例如 Thread thread = new Thread() 此時,線程狀態就是new。
可運行Runnable:
當新建的線程調用start方法,線程狀態就變爲runnable,此時線程隨時等待CPU調度執行,但未執行。
正在運行running:
CPU開始調度執行此線程,須要注意的是,線程running狀態只能從runnable轉換過來。
阻塞blocked:
當處於正在運行的線程由於一些狀況放棄爭奪CPU資源,此時就進入了阻塞狀態,若是線程須要再次運行必須先轉變成runnable狀態。
死亡dead:
線程運行完成或出現異常,線程S生命週期結束。
線程安全、線程同步、線程互斥、線程通訊
線程安全:
是指多線程執行同一份代碼每次執行結果都和單線程同樣。
線程同步:
對臨界區的共享數據,A線程去操做數據,而且須要另外一線程B的操做才能繼續完成,這種線程之間協做的就是線程同步。
線程互斥:
對臨界區的共享數據,兩個線程都有修改狀況,若是沒有加鎖或cas等的操做會形成數據混亂異常,這種就是線程互斥。
線程通訊:
能夠認爲是線程同步的擴展,由於wait/notify必須獲取了對象鎖才能使用,經過wait/notify這種方式實現兩個線程的等待喚醒。
線程同步的7種方式

  • synchronized同步方法。若是是普通方法會鎖住這個對象,若是是靜態方法鎖住的是整個類。
  • synchronized同步代碼塊。
  • volatile修飾變量。
  • 重入鎖ReenreantLock。實現了Lock接口,可重入,但效率低。
  • ThreadLocal線程級別的變量共享。
  • 阻塞隊列LinkedBlockingQueue。主要經過synchronized的put、take實現。
  • 原子變量。

線程狀態轉換進程的基本狀態新建狀態:建立一個線程對象就緒狀態:等待系統分配處理器運行狀態:佔有處理器正在運行等待狀態(阻塞狀態):等待某個事件的完成進程狀態變化新建態 -------> 就緒態 【進程建立】運行態 -------> 等待態 【等待某個事件發生】等待態 -------> 就緒態 【等待事件完成】就緒態 -------> 運行態 【進程調度】運行態 -------> 就緒態 【時間片完成】

相關文章
相關標籤/搜索