Java語言簡介、基礎組成、封裝、繼承、多態、抽象類、內部類、接口

Java簡介

  • Java版本

J2EE (企業版) J2SE(標準版) J2ME(小型版)

  • Java特性

跨平臺

  • JVM、JRE、JDK介紹
  1. JVM(Java虛擬機)
    不同平臺上裝指定版本虛擬機,就能運行Java程序
  2. JRE(Java運行環境)  
    包括JVM和Java程序所需的核心類庫
  3. JDK(Java開發程序包)
    包括JRE

綜上,所以安裝JDK就可以了
使用JDK開發的java程序,交給JRE運行
JRE=JVM+類庫    
JDK=JRE+java開發工具

  • DOS命令行
  1. dir列出目錄
  2. cd 改變目錄
  3. cd…後退
  4. cd\根目錄
  5. md創建目錄
  6. rd 刪除
  7. del 刪除(文件) *通配符
  8. help尋求幫助,可以查用法
  9. Java -version用來在命令行中查看使用的Java版本
  • 環境變量表示方法

%變量名%

  • 臨時設置

Path=haha(這個haha是代表任意值) 在當前命令行窗口有效

  • 文件夾選項可以選擇不要隱藏擴展名
  • classpath臨時環境變量

Java語言基礎組成

  • 關鍵字(都是小寫, 類名大寫)
  • 標識符

數字不能開頭,不可以使用關鍵字(標識符裏有-和$符號)

  • 註釋

//單行註釋    / * 多行註釋*/   / * * 文檔註釋*/
註釋可以嵌套,但多行不能套多行    
javadoc可提取(Java特有)
可以使用註釋,進行逐段調試

註釋的應用:
/ * 需求:練習…思路:
1、…2、…3、…步驟:
1. 用class關鍵字完成定義;
2. 主函數:固定格式;
3. 輸出語句*/

  • 常量與變量

整數、小數、布爾、字符、字符串、null常量

  • 進制

byte字節=8個二進制位

  • 負數

四個字節表示

  • 變量

變量作用範圍(一對{}之間有效)
格式:數據類型 變量名=值;

  • 數據類型
  1. 整數:byte(1位)、short(2位)、int(默認)(4位),long(8位)
  2. 小數:float(4個字節),double(默認)(8個字節)
  3. 字符:char(2個字節,一箇中文正好兩個字節)
  4. 布爾:boolean(只有True和False)
  • 類型轉換
  1. 自動類型轉換
  2. 強制類型轉換(丟失精度)

字符+數,顯示ACSII碼
字符類型運算過程(Java底層用Unicode碼)

  • 運算符
  1. 類型運算符細節(byte擔心存不下,Integer.Max_VALUE(int 型最大值))
  2. 算數運算符
  • - * / %(取餘) +(連接符)
    ++ --(在原來的基礎上自加自減1)
  1. 賦值運算符

=、+=、-=、*=、…

注意:+=不等於=…+…(+=在賦值中做了強制轉換,=…+…是兩步運算)

  1. 比較運算符

運算完結果必須是True或者False
==   !=  >  <  <=  >=

  1. 邏輯運算符
  1. &用於連接兩個布爾類型的表達式
  2. &與|或  &運算特點
  3. ^異或:兩邊相同爲假
  4. !非
  5. &&和&運算結果一樣,但過程有點小區別
  6. &右邊始終參與,&&左爲假,右不參與
  7. ||左邊爲真,後邊不參與
  1. 位運算符

<<左移  >>右移  >>>無符號右移

左移幾位就是乘以2的幾次方,
右移:以前最高位是啥就拿啥補空位,右移就是該數據除以2的幾次冪
無符號右移:右移,高位出現的空位用0補

例子: 兩個數互換問題:

  1. 引入第三方變量
  2. a=a+b;    b=a-b;    a=a-b;
  3. a=a^b;    b=a^b;    a=a^b;
  1. 三元運算符

(條件表達式)?表達式1:表達式2;

  • 程序流程控制

順序結構  選擇結構  循環結構

  1. 選擇結構
if(條件表達式) 
{    
	執行語句;  
}
if(條件表達式)
{
	執行語句;  
}  
else{  
	執行語句;  
}
if ........
else if...........
else   if........  
else

當if…else…運算後有具體結果,可以用三元運算符代替

代碼塊:局部代碼可以定義局部變量週期

switch(表達式){  
	case  取值1:
		執行語句;
		break;  
	case  取值2:
		執行語句;
		break;  
	default:
		執行語句;
		break}    
//挨着大括號的break可以不用寫
  1. 循環結構
while(條件表達式){ 
	執行語句;  
}
do{  
	執行語句;
}while(條件表達式);
for(初始化表達式;循環條件表達式;循環後表達式){
	...
}

其他流程控制語句:continue(繼續);break(跳出);

  • 函數

定義在類中具有特點功能的一段獨立小程序
函數也稱方法;
可以將代碼封裝,複用;

重載:(重複載入):在同一個類中,允許存在一個以上的同名函數,只要參數個數或者參數類型不同即可;

  • 數組

同一類型數據的集合,其實就是一個容器

當訪問到數組中不存在角標時會發生異常

//格式1:
//元素類型【】  數組名=new  元素類型【元素個數或數組長度】;
int【】  arr=new   int3】;

//格式2:
//元素類型【】  數組名=new  元素類型【】{元素,元素,...};
  • 堆棧

堆特點:存儲實體(一堆數據),不能消失;
棧的特點:先進後出

棧:引入(指向)堆中的數據  引入(指針)
堆: 垃圾回收機制:自動不定時回收堆中的垃圾

內存空間的劃分:局部代碼塊;決定局部變量生命週期

  • 正向遍歷,反向遍歷(數據結構)
  • 排序(選擇排序、冒泡排序、排序位置置換代碼提取)

面向對象

三個特徵:封裝、繼承、多態

對象

用Java語言對現實生活中事物描述,通過類的形式體現
對事物描述兩方面:

  1. 屬性
  2. 行爲

對象就是該類事物實實在在個體
引用數據類型參數傳遞

封裝

private私有,只在本類中有效,其他類就算創建對象也訪問不到

public       void  函數名(){
	....    
}

封裝隱藏實現細節、對象屬性、僅對外提供公共訪問方式
優點:

  1. 安全性;
  2. 便於隔離;
  3. 提高重用性;
    私有僅僅是一種體現形式(封裝的)

Java語言中最小的封裝體是函數

構造函數

  • 特點
  1. 函數名與類名相同
  2. 不用定義返回值類型
  3. 沒有具體返回值

  • 作用

給對象初始化;

一個類中如果沒有定義構造函數,該類中會有一個默認的空參數構造函數

  • 一般函數和構造函數區別
  1. 構造函數:對象創建時就會調用與之對應的構造函數初始化
  2. 一般函數:對象創建後,需要時才調用

  • 什麼時候定義構造函數?

在描述事物時,該事物已存在就具備的一些內容,這些內容都定義在構造函數中;

  • 構造函數細節
  1. 對象改名:p1.setname(“小強”);
  2. 構造函數加void成一般函數;

this關鍵字

  • this(當局部變量和成員變量重名時,可以用關鍵字this區分)

this代表對象,當前對象
this就是所在函數所屬對象的引用
簡單來說,哪個對象調用了所在的函數,this就代表哪個對象

  • 構造函數調用構造函數,用this調用成員

對this的調用必須是構造函數第一個語句,因爲初始化動作要先執行

  • 只要在本類中用本類對象,用this

static(靜態關鍵字)

靜態數據可以被對象調用,類調用

  • 特點
  1. static是一個修飾符,用於修飾成員;
  2. static修飾的成員被所有對象共享;
  3. static優先於對象存在,因爲static隨着類的加載已經存在;
  4. static修飾的成員多了一種調用方式,可以用類名調用;
  5. static存儲共享數據,類中的私有
  • 成員變量(實例變量)和靜態變量(類變量)的區別:
  1. 生命週期:
    成員變量隨着對象的創建而存在,隨着對象的被回收而釋放;
    靜態變量隨着類的加載而存在,隨着類的消失而消失;
  2. 調用方式不同:
    成員變量只能被對象調用;
    靜態變量可以被對象調用,也可以類名調用;
  3. 別名不同:
    成員變量(實例)
    靜態變量(類變量)
  4. 存儲位置:
    成員變量在堆中;
    靜態變量存在方法區(的靜態區)共享數據區;
  • 靜態使用注意事項
  1. 靜態方法只能訪問靜態成員(非靜態方法可以訪問靜態成員,也可以訪問非靜態成員)
  2. 靜態方法不可以使用this,super關鍵字
  3. 主函數是靜態的,只能訪問靜態的;

主函數

public  static  void  main(String[]  args)
  • 主函數特殊之處
  1. 格式是固定的
  2. 被JVM所識別和調用

public:因爲權限必須是最大的
static:不需要對象,直接用主函數所屬類名調用即可;
void:主函數沒有具體返回值;
main:函數名,不是關鍵字,只是JVM識別的名字
String[] args:主函數參數列表是一個數組類型的參數,而且元素都是字符串類型;

靜態什麼時候用呢?

  1. 靜態變量:
    當分析對象中所具備的成員變量的值是相同的,只要數據在對象中都是不同的,就是對象特有數據,必須存儲在對象中;
  2. 靜態函數:
    從源代碼看,該功能是否需要訪問非靜態成員變量(可以加,可以不加的時候,最好加上,不浪費內存)
  3. 靜態代碼塊:
    隨着類的加載而執行,而且只執行一次 作用:用於給類進行初始化;
  4. 構造函數代碼塊:
    構造函數具有初始化對象針對性;

面向對象(數組工具對象建立)

  • 文檔註釋:建立一個用於操作數組工具類,其中包含着常見的數組的函數,如最值,排序等
  • 文檔能提取的是公有的

設計模式

對問題行之有效的解決辦法,其實他是一種思想;

繼承

好處:

  1. 提高代碼複用性;
  2. 讓類之間產生關係,給多態提供了前提;
  • 父類
  • 子類

Java中支持單繼承,不直接支持多繼承,但對C++的多繼承進行了改良

  • 單繼承:一個子類只能有一個直接復類

  • 多繼承:一個子類可以有多個直接父類(Java中不允許,進行了改良)會產生不確定性,不直接支持,因爲父類中有相同成員會產生調用的不確定性;

  • Java支持多重繼承:C繼承B,B繼承A

因此出現繼承體系:

  1. 查看體系頂層類,瞭解體系基本功能;
  2. 創建體系最子類對象,完成功能使用。
  • 什麼時候定義繼承呢?

當類與類之間存在所屬關係時候,就定義繼承;

  • 在子父類中,成員的特點體現:

1、成員變量;2、成員函數;3、構造函數;

成員變量

當本類的成員和局部變量同名用this區分;
當子父類中的成員變量同名用super區分父類;

this和super用法很相似:
this代表一個本類對象的引用
super代表一個父類空間

子父類中成員函數特點

1. 覆蓋:當子父類中出現成員函數一模一樣,會運行子類情況,這種現象稱爲覆蓋;  

函數兩個特點:

  1. 重載:在同一類中
  2. 覆蓋:子類中,覆蓋也稱爲重寫;

覆蓋注意事項:

  1. 子類方法覆蓋父類方法時,子類權限必須大於等於父類權限;
  2. 靜態只能覆蓋靜態,或被靜態覆蓋;
  • 什麼時候覆蓋操作?

當對一個類進行子類擴展時,子類需保留父類功能,但要定義子類特有

子父類中的構造函數——子類的實例化過程

  • 在子類構造對象時,發現訪問子類構造函數時,父類也運行了;

原因:在子類中構造函數中第一行有一個默認隱式語句,super()

  • 子類的實例化過程:子類中所有構造函數都默認訪問父類構造函數
  • 爲什麼子類繼承父類要訪問他們的構造函數?

那是因爲子類繼承父類,獲取了父類內容,所以使用父類內容前,先看父類如何對自己內容初始化

注意:super語句必須定義在子類構造函數第一行

一個對象實例化過程

person.p=new person()
  1. JVM會讀取指定路徑下person.class文件,並加載進內存,並會先加載person父類;
  2. 在堆內存中開闢空間,分配地址;
  3. 並在對象空間中,對對象屬性默認初始化;
  4. 調用對應構造函數初始化;
  5. 構造函數中,第一行先調用父類構造函數;
  6. 父類初始化完後,對子類屬性初始化;
  7. 在進行子類構造函數特定初始化;
  8. 初始化完畢後,將地址值賦給引用變量;

final關鍵字:繼承的弊端:打破了封裝性;

  1. final是一個修飾符,可以修飾類、方法、變量;
  2. final修飾的類不可以被繼承;
  3. final修飾的方法不可以被覆蓋;
  4. final修飾變量是一個常量,只能賦值一次;
  • 爲什麼要用final修飾變量,其實在程序中如果數據固定,則直接用就可以?

爲了區別;

抽象類

  • 抽象:abstract /抽象關鍵字/

沒有足夠的信息描述一個類就是抽象類;

  • 特點
  1. 抽象類:方法只有聲明沒有實現時,該方法就是抽象方法,抽象方法必須在抽象類中;
  2. 抽象類不能被實例化,因爲調用抽象方法沒有意義;
  3. 抽象類必須由子類覆蓋抽象類方法,否則,子類還是抽象類;
  • 抽象類是構造函數嗎?

是,用於給子類對象初始化;

  • 抽象類可以不定義抽象方法?

可以,但是少見,通常類中有很多方法,但是卻沒有內容;

  • 抽象類不能和哪些關鍵字?

private、final、static

  • 抽象類和一般類異同點:

相同點:
抽象類和一般類都是用來描述事物的,都在內部定義了成員;
不同點:

  1. 一般類有足夠信息描述事物;
  2. 一般類不能定義抽象方法;
  3. 一般類可以被實例化;
  • 抽象類是一個父類嗎?

對.

接口

interface() 當抽象類中方法都是抽象時,這時可以將該抽象類用接口、

定義接口使用的關鍵字不是class,是interface

  • 對於接口常見的成員:
  1. 全局變量(public static final)
  2. 抽象方法(public abstract)

由此得出結論,接口成員都是公共的權限

  • 實現

類與類之間是繼承關係;類與接口之間是實現關係;

接口不可以實例化,只能由實現了接口的子類並覆蓋了接口中所有抽象方法後,纔可以實例化;

在Java中不直接支持多繼承,因爲會調用不確定性,所以改良多實現

一個類中可以實現多接口

class  Test   implements  A,Z   //多實現
  • 細節:
  • 一個類在繼承另一個類的同時,還可以實現多個接口
  • 接口出現避免了單繼承的侷限性
  • 接口與接口之間是繼承關係,而且接口可以多繼承;
  • 接口的特點

是對外暴露的規則,是程序的功能拓展,可以用來多實現;

類與接口之間是實現規則,類繼承的同時可以實現多個接口,降低耦合性

  • 接口與抽象類區別:

相同點:都是不斷向上抽取而來;
不同點:

  1. 抽象類需要被繼承,接口需要被實現;
  2. 抽象類中可以定義抽象方法和非抽象方法,接口中只可以定義抽象方法;

多態

  • 定義

某一類事物的多種存在形態;

  • 對象的多態性

一個對象對應着不同類型;

多態在代碼中體現,父類或接口的引用指向其子類的對象;

  • 多態的好處

提高了代碼擴展性,前期定義的代碼,可以使用後期的內容;

  • 多態弊端

前期定義的內容不能調用後期子類特有內容;

  • 多態前提
  1. 必須由關心:繼承,實現;
  2. 必須要有覆蓋;
  • 多態轉型
  1. 自動類型提升,但是特有功能無法訪問;作用就是限制對特有功能訪問;
  2. 向下轉型的目的是爲了使用子類中的特有語法;
  • 類型轉換異常

注意:對於轉型,自始至終都是子類對象在做着類型變化;

多態成員:

  1. 成員變量;
  2. 成員函數;
  3. 靜態函數;
  • 多態成員變量
  1. 編譯時,參考引用型變量所屬類中是否有調用的成員變量;有,編譯通過,沒有,編譯失敗;
  2. 運行時,參考引用型變量所屬類中是否有調用的成員變量;並運行該所屬類中的成員變量;
  • 多態成員函數
  1. 參考引用型變量所屬類中是否有調用的成員函數,有,編譯通過;
  2. 運行時,參考的是對象所屬類中是否有調用的成員函數;
  • 靜態函數:誰調用顯示誰;

其實對靜態方法,直接用類名調用即可;

內部類:類定義在類中

  • 訪問特點:內部類可以直接訪問外部類中成員,包括私有成員;

外部類訪問內部類中成員,必須建立內部類對象;

一般用於類的設計
分析事物時,發現事物描述中還有事物;

  • 內部類——修飾符
  1. 如果內部類是靜態的,相當於一個外部類;
  2. 如果內部類是靜態的,成員是靜態的;
  3. 如果內部類中定義了靜態成員,這個類也是靜態類;
  • 爲什麼內部類能直接訪問外部類成員?

因爲內部類持有外部類引用;

  • 內部類可以放在局部位置上,只能訪問局部被final修飾的局部變量;

  • 匿名內部類:就是內部類簡寫格式:必須有前提,內部類必須繼承或實現一個外部類或接口;

其實就是一個匿名子類對象;

//格式:new 父類 or    接口(){子類內容}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章