Java目錄
Java簡介
- Java版本
J2EE (企業版) J2SE(標準版) J2ME(小型版)
- Java特性
跨平臺
- JVM、JRE、JDK介紹
- JVM(Java虛擬機)
不同平臺上裝指定版本虛擬機,就能運行Java程序- JRE(Java運行環境)
包括JVM和Java程序所需的核心類庫- JDK(Java開發程序包)
包括JRE
綜上,所以安裝JDK就可以了
使用JDK開發的java程序,交給JRE運行
JRE=JVM+類庫
JDK=JRE+java開發工具
- DOS命令行
- dir列出目錄
- cd 改變目錄
- cd…後退
- cd\根目錄
- md創建目錄
- rd 刪除
- del 刪除(文件) *通配符
- help尋求幫助,可以查用法
- Java -version用來在命令行中查看使用的Java版本
- 環境變量表示方法
%變量名%
- 臨時設置
Path=haha(這個haha是代表任意值) 在當前命令行窗口有效
- 文件夾選項可以選擇不要隱藏擴展名
- classpath臨時環境變量
Java語言基礎組成
- 關鍵字(都是小寫, 類名大寫)
- 標識符
數字不能開頭,不可以使用關鍵字(標識符裏有-和$符號)
- 註釋
//單行註釋 / * 多行註釋*/ / * * 文檔註釋*/
註釋可以嵌套,但多行不能套多行
javadoc可提取(Java特有)
可以使用註釋,進行逐段調試
註釋的應用:
/ * 需求:練習…思路:
1、…2、…3、…步驟:
1. 用class關鍵字完成定義;
2. 主函數:固定格式;
3. 輸出語句*/
- 常量與變量
整數、小數、布爾、字符、字符串、null常量
- 進制
byte字節=8個二進制位
- 負數
四個字節表示
- 變量
變量作用範圍(一對{}之間有效)
格式:數據類型 變量名=值;
- 數據類型
- 整數:byte(1位)、short(2位)、int(默認)(4位),long(8位)
- 小數:float(4個字節),double(默認)(8個字節)
- 字符:char(2個字節,一箇中文正好兩個字節)
- 布爾:boolean(只有True和False)
- 類型轉換
- 自動類型轉換
- 強制類型轉換(丟失精度)
字符+數,顯示ACSII碼
字符類型運算過程(Java底層用Unicode碼)
- 運算符
- 類型運算符細節(byte擔心存不下,Integer.Max_VALUE(int 型最大值))
- 算數運算符
- - * / %(取餘) +(連接符)
++ --(在原來的基礎上自加自減1)
- 賦值運算符
=、+=、-=、*=、…
注意:+=不等於=…+…(+=在賦值中做了強制轉換,=…+…是兩步運算)
- 比較運算符
運算完結果必須是True或者False
== != > < <= >=
- 邏輯運算符
- &用於連接兩個布爾類型的表達式
- &與|或 &運算特點
- ^異或:兩邊相同爲假
- !非
- &&和&運算結果一樣,但過程有點小區別
- &右邊始終參與,&&左爲假,右不參與
- ||左邊爲真,後邊不參與
- 位運算符
<<左移 >>右移 >>>無符號右移
左移幾位就是乘以2的幾次方,
右移:以前最高位是啥就拿啥補空位,右移就是該數據除以2的幾次冪
無符號右移:右移,高位出現的空位用0補
例子: 兩個數互換問題:
- 引入第三方變量
- a=a+b; b=a-b; a=a-b;
- a=a^b; b=a^b; a=a^b;
- 三元運算符
(條件表達式)?表達式1:表達式2;
- 程序流程控制
順序結構 選擇結構 循環結構
- 選擇結構
if(條件表達式)
{
執行語句;
}
if(條件表達式)
{
執行語句;
}
else{
執行語句;
}
if ........
else if...........
else if........
else
當if…else…運算後有具體結果,可以用三元運算符代替
代碼塊:局部代碼可以定義局部變量週期
switch(表達式){
case 取值1:
執行語句;
break;
case 取值2:
執行語句;
break;
default:
執行語句;
break;
}
//挨着大括號的break可以不用寫
- 循環結構
while(條件表達式){
執行語句;
}
do{
執行語句;
}while(條件表達式);
for(初始化表達式;循環條件表達式;循環後表達式){
...
}
其他流程控制語句:continue(繼續);break(跳出);
- 函數
定義在類中具有特點功能的一段獨立小程序
函數也稱方法;
可以將代碼封裝,複用;
重載:(重複載入):在同一個類中,允許存在一個以上的同名函數,只要參數個數或者參數類型不同即可;
- 數組
同一類型數據的集合,其實就是一個容器
當訪問到數組中不存在角標時會發生異常
//格式1:
//元素類型【】 數組名=new 元素類型【元素個數或數組長度】;
int【】 arr=new int【3】;
//格式2:
//元素類型【】 數組名=new 元素類型【】{元素,元素,...};
- 堆棧
堆特點:存儲實體(一堆數據),不能消失;
棧的特點:先進後出
棧:引入(指向)堆中的數據 引入(指針)
堆: 垃圾回收機制:自動不定時回收堆中的垃圾
內存空間的劃分:局部代碼塊;決定局部變量生命週期
- 正向遍歷,反向遍歷(數據結構)
- 排序(選擇排序、冒泡排序、排序位置置換代碼提取)
面向對象
三個特徵:封裝、繼承、多態
對象
用Java語言對現實生活中事物描述,通過類的形式體現
對事物描述兩方面:
- 屬性
- 行爲
對象就是該類事物實實在在個體
引用數據類型參數傳遞
封裝
private私有,只在本類中有效,其他類就算創建對象也訪問不到
public void 函數名(){
....
}
封裝隱藏實現細節、對象屬性、僅對外提供公共訪問方式
優點:
- 安全性;
- 便於隔離;
- 提高重用性;
私有僅僅是一種體現形式(封裝的)
Java語言中最小的封裝體是函數
構造函數
- 特點
- 函數名與類名相同
- 不用定義返回值類型
- 沒有具體返回值
- 作用
給對象初始化;
一個類中如果沒有定義構造函數,該類中會有一個默認的空參數構造函數
- 一般函數和構造函數區別
- 構造函數:對象創建時就會調用與之對應的構造函數初始化
- 一般函數:對象創建後,需要時才調用
- 什麼時候定義構造函數?
在描述事物時,該事物已存在就具備的一些內容,這些內容都定義在構造函數中;
- 構造函數細節
- 對象改名:p1.setname(“小強”);
- 構造函數加void成一般函數;
this關鍵字
- this(當局部變量和成員變量重名時,可以用關鍵字this區分)
this代表對象,當前對象
this就是所在函數所屬對象的引用
簡單來說,哪個對象調用了所在的函數,this就代表哪個對象
- 構造函數調用構造函數,用this調用成員
對this的調用必須是構造函數第一個語句,因爲初始化動作要先執行
- 只要在本類中用本類對象,用this
static(靜態關鍵字)
靜態數據可以被對象調用,類調用
- 特點
- static是一個修飾符,用於修飾成員;
- static修飾的成員被所有對象共享;
- static優先於對象存在,因爲static隨着類的加載已經存在;
- static修飾的成員多了一種調用方式,可以用類名調用;
- static存儲共享數據,類中的私有
- 成員變量(實例變量)和靜態變量(類變量)的區別:
- 生命週期:
成員變量隨着對象的創建而存在,隨着對象的被回收而釋放;
靜態變量隨着類的加載而存在,隨着類的消失而消失;- 調用方式不同:
成員變量只能被對象調用;
靜態變量可以被對象調用,也可以類名調用;- 別名不同:
成員變量(實例)
靜態變量(類變量)- 存儲位置:
成員變量在堆中;
靜態變量存在方法區(的靜態區)共享數據區;
- 靜態使用注意事項
- 靜態方法只能訪問靜態成員(非靜態方法可以訪問靜態成員,也可以訪問非靜態成員)
- 靜態方法不可以使用this,super關鍵字
- 主函數是靜態的,只能訪問靜態的;
主函數
public static void main(String[] args)
- 主函數特殊之處
- 格式是固定的
- 被JVM所識別和調用
public:因爲權限必須是最大的
static:不需要對象,直接用主函數所屬類名調用即可;
void:主函數沒有具體返回值;
main:函數名,不是關鍵字,只是JVM識別的名字
String[] args:主函數參數列表是一個數組類型的參數,而且元素都是字符串類型;
靜態什麼時候用呢?
- 靜態變量:
當分析對象中所具備的成員變量的值是相同的,只要數據在對象中都是不同的,就是對象特有數據,必須存儲在對象中;- 靜態函數:
從源代碼看,該功能是否需要訪問非靜態成員變量(可以加,可以不加的時候,最好加上,不浪費內存)- 靜態代碼塊:
隨着類的加載而執行,而且只執行一次 作用:用於給類進行初始化;- 構造函數代碼塊:
構造函數具有初始化對象針對性;
面向對象(數組工具對象建立)
- 文檔註釋:建立一個用於操作數組工具類,其中包含着常見的數組的函數,如最值,排序等
- 文檔能提取的是公有的
設計模式
對問題行之有效的解決辦法,其實他是一種思想;
繼承
好處:
- 提高代碼複用性;
- 讓類之間產生關係,給多態提供了前提;
- 父類
- 子類
Java中支持單繼承,不直接支持多繼承,但對C++的多繼承進行了改良
-
單繼承:一個子類只能有一個直接復類
-
多繼承:一個子類可以有多個直接父類(Java中不允許,進行了改良)會產生不確定性,不直接支持,因爲父類中有相同成員會產生調用的不確定性;
-
Java支持多重繼承:C繼承B,B繼承A
因此出現繼承體系:
- 查看體系頂層類,瞭解體系基本功能;
- 創建體系最子類對象,完成功能使用。
- 什麼時候定義繼承呢?
當類與類之間存在所屬關係時候,就定義繼承;
- 在子父類中,成員的特點體現:
1、成員變量;2、成員函數;3、構造函數;
成員變量
當本類的成員和局部變量同名用this區分;
當子父類中的成員變量同名用super區分父類;
this和super用法很相似:
this代表一個本類對象的引用
super代表一個父類空間
子父類中成員函數特點
1. 覆蓋:當子父類中出現成員函數一模一樣,會運行子類情況,這種現象稱爲覆蓋;
函數兩個特點:
- 重載:在同一類中
- 覆蓋:子類中,覆蓋也稱爲重寫;
覆蓋注意事項:
- 子類方法覆蓋父類方法時,子類權限必須大於等於父類權限;
- 靜態只能覆蓋靜態,或被靜態覆蓋;
- 什麼時候覆蓋操作?
當對一個類進行子類擴展時,子類需保留父類功能,但要定義子類特有
子父類中的構造函數——子類的實例化過程
- 在子類構造對象時,發現訪問子類構造函數時,父類也運行了;
原因:在子類中構造函數中第一行有一個默認隱式語句,super()
- 子類的實例化過程:子類中所有構造函數都默認訪問父類構造函數
- 爲什麼子類繼承父類要訪問他們的構造函數?
那是因爲子類繼承父類,獲取了父類內容,所以使用父類內容前,先看父類如何對自己內容初始化
注意:super語句必須定義在子類構造函數第一行
一個對象實例化過程
person.p=new person()
- JVM會讀取指定路徑下person.class文件,並加載進內存,並會先加載person父類;
- 在堆內存中開闢空間,分配地址;
- 並在對象空間中,對對象屬性默認初始化;
- 調用對應構造函數初始化;
- 構造函數中,第一行先調用父類構造函數;
- 父類初始化完後,對子類屬性初始化;
- 在進行子類構造函數特定初始化;
- 初始化完畢後,將地址值賦給引用變量;
final關鍵字:繼承的弊端:打破了封裝性;
- final是一個修飾符,可以修飾類、方法、變量;
- final修飾的類不可以被繼承;
- final修飾的方法不可以被覆蓋;
- final修飾變量是一個常量,只能賦值一次;
- 爲什麼要用final修飾變量,其實在程序中如果數據固定,則直接用就可以?
爲了區別;
抽象類
- 抽象:abstract /抽象關鍵字/
沒有足夠的信息描述一個類就是抽象類;
- 特點
- 抽象類:方法只有聲明沒有實現時,該方法就是抽象方法,抽象方法必須在抽象類中;
- 抽象類不能被實例化,因爲調用抽象方法沒有意義;
- 抽象類必須由子類覆蓋抽象類方法,否則,子類還是抽象類;
- 抽象類是構造函數嗎?
是,用於給子類對象初始化;
- 抽象類可以不定義抽象方法?
可以,但是少見,通常類中有很多方法,但是卻沒有內容;
- 抽象類不能和哪些關鍵字?
private、final、static
- 抽象類和一般類異同點:
相同點:
抽象類和一般類都是用來描述事物的,都在內部定義了成員;
不同點:
- 一般類有足夠信息描述事物;
- 一般類不能定義抽象方法;
- 一般類可以被實例化;
- 抽象類是一個父類嗎?
對.
接口
interface() 當抽象類中方法都是抽象時,這時可以將該抽象類用接口、
定義接口使用的關鍵字不是class,是interface
- 對於接口常見的成員:
- 全局變量(public static final)
- 抽象方法(public abstract)
由此得出結論,接口成員都是公共的權限
- 實現
類與類之間是繼承關係;類與接口之間是實現關係;
接口不可以實例化,只能由實現了接口的子類並覆蓋了接口中所有抽象方法後,纔可以實例化;
在Java中不直接支持多繼承,因爲會調用不確定性,所以改良多實現
一個類中可以實現多接口
class Test implements A,Z //多實現
- 細節:
- 一個類在繼承另一個類的同時,還可以實現多個接口
- 接口出現避免了單繼承的侷限性
- 接口與接口之間是繼承關係,而且接口可以多繼承;
- 接口的特點
是對外暴露的規則,是程序的功能拓展,可以用來多實現;
類與接口之間是實現規則,類繼承的同時可以實現多個接口,降低耦合性
- 接口與抽象類區別:
相同點:都是不斷向上抽取而來;
不同點:
- 抽象類需要被繼承,接口需要被實現;
- 抽象類中可以定義抽象方法和非抽象方法,接口中只可以定義抽象方法;
多態
- 定義
某一類事物的多種存在形態;
- 對象的多態性
一個對象對應着不同類型;
多態在代碼中體現,父類或接口的引用指向其子類的對象;
- 多態的好處
提高了代碼擴展性,前期定義的代碼,可以使用後期的內容;
- 多態弊端
前期定義的內容不能調用後期子類特有內容;
- 多態前提
- 必須由關心:繼承,實現;
- 必須要有覆蓋;
- 多態轉型
- 自動類型提升,但是特有功能無法訪問;作用就是限制對特有功能訪問;
- 向下轉型的目的是爲了使用子類中的特有語法;
- 類型轉換異常
注意:對於轉型,自始至終都是子類對象在做着類型變化;
多態成員:
- 成員變量;
- 成員函數;
- 靜態函數;
- 多態成員變量
- 編譯時,參考引用型變量所屬類中是否有調用的成員變量;有,編譯通過,沒有,編譯失敗;
- 運行時,參考引用型變量所屬類中是否有調用的成員變量;並運行該所屬類中的成員變量;
- 多態成員函數
- 參考引用型變量所屬類中是否有調用的成員函數,有,編譯通過;
- 運行時,參考的是對象所屬類中是否有調用的成員函數;
- 靜態函數:誰調用顯示誰;
其實對靜態方法,直接用類名調用即可;
內部類:類定義在類中
- 訪問特點:內部類可以直接訪問外部類中成員,包括私有成員;
外部類訪問內部類中成員,必須建立內部類對象;
一般用於類的設計
分析事物時,發現事物描述中還有事物;
- 內部類——修飾符
- 如果內部類是靜態的,相當於一個外部類;
- 如果內部類是靜態的,成員是靜態的;
- 如果內部類中定義了靜態成員,這個類也是靜態類;
- 爲什麼內部類能直接訪問外部類成員?
因爲內部類持有外部類引用;
-
內部類可以放在局部位置上,只能訪問局部被final修飾的局部變量;
-
匿名內部類:就是內部類簡寫格式:必須有前提,內部類必須繼承或實現一個外部類或接口;
其實就是一個匿名子類對象;
//格式:new 父類 or 接口(){子類內容}