久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 基础知识总结

發布時間:2024/4/17 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 基础知识总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java基礎知識總結

寫代碼:

1,明確需求。我要做什么?

2,分析思路。我要怎么做?1,2,3。

3,確定步驟。每一個思路部分用到哪些語句,方法,和對象。

4,代碼實現。用具體的java語言代碼把思路體現出來。

?

學習新技術的四點:

1,該技術是什么?

2,該技術有什么特點(使用注意):

3,該技術怎么使用。demo

4,該技術什么時候用?test。

-----------------------------------------------------------------------------------------------

一:java概述:

1991 年Sun公司的James Gosling等人開始開發名稱為 Oak 的語言,希望用于控制嵌入在有線電視交換盒、PDA等的微處理器;

1994年將Oak語言更名為Java;

?

Java的三種技術架構:

JAVAEEJava Platform Enterprise Edition,開發企業環境下的應用程序,主要針對web程序開發;

JAVASEJava Platform Standard Edition,完成桌面應用程序的開發,是其它兩者的基礎;

JAVAMEJava Platform Micro Edition,開發電子消費產品和嵌入式設備,如手機中的程序;

?

1JDKJava Development Kitjava的開發和運行環境,java的開發工具和jre。

2JREJava Runtime Environmentjava程序的運行環境,java運行的所需的類庫+JVM(java虛擬機)。

3,配置環境變量:讓java jdk\bin目錄下的工具,可以在任意目錄下運行,原因是,將該工具所在目錄告訴了系統,當使用該工具時,由系統幫我們去找指定的目錄。

環境變量的配置:

??? 1):永久配置方式:JAVA_HOME=%安裝路徑%\Java\jdk

??? ????????????????? path=%JAVA_HOME%\bin

??? 2):臨時配置方式:set path=%path%;C:\Program Files\Java\jdk\bin

特點:系統默認先去當前路徑下找要執行的程序,如果沒有,再去path中設置的路徑下找。

classpath的配置:

??? 1):永久配置方式:classpath=.;c:\;e:\

??? 2):臨時配置方式:set classpath=.;c:\;e:\

?

注意:在定義classpath環境變量時,需要注意的情況

如果沒有定義環境變量classpath,java啟動jvm后,會在當前目錄下查找要運行的類文件;

如果指定了classpath,那么會在指定的目錄下查找要運行的類文件。

還會在當前目錄找嗎?兩種情況:

??? 1):如果classpath的值結尾處有分號,在具體路徑中沒有找到運行的類,會默認在當前目錄再找一次。

??? 2):如果classpath的值結果出沒有分號,在具體的路徑中沒有找到運行的類,不會再當前目錄找。

??? 一般不指定分號,如果沒有在指定目錄下找到要運行的類文件,就報錯,這樣可以調試程序。

?

4javac命令和java命令做什么事情呢?

??? 要知道java是分兩部分的:一個是編譯,一個是運行。

??? javac負責的是編譯的部分,當執行javac時,會啟動java的編譯器程序。對指定擴展名的.java文件進行編譯。 生成了jvm可以識別的字節碼文件。也就是class文件,也就是java的運行程序。

??? java負責運行的部分.會啟動jvm.加載運行時所需的類庫,并對class文件進行執行.

??? 一個文件要被執行,必須要有一個執行的起始點,這個起始點就是main函數.

----------------------------------------------------------------------------------------------

二:java語法基礎:

1,關鍵字:其實就是某種語言賦予了特殊含義的單詞。

??? 保留字:其實就是還沒有賦予特殊含義,但是準備日后要使用過的單詞。

2,標示符Java中的包、類、方法、參數和變量的名字,可由任意順序的大小寫字母、數字、下劃線(_)和美元符號($)組成,但標識符不能以數字開頭,不能是Java中的保留關鍵字。

·下面是合法的標識符:

yourname

your_name

_yourname

$yourname

·下面是非法的標識符:

class

67.9

Hello Careers

??? 1),數字不可以開頭。

??? 2),不可以使用關鍵字。

3,常量:是在程序中的不會變化的數據。

4,變量:其實就是內存中的一個存儲空間,用于存儲常量數據。

??? 作用:方便于運算。因為有些數據不確定。所以確定該數據的名詞和存儲空間。

??? 特點:變量空間可以重復使用。

什么時候定義變量?只要是數據不確定的時候,就定義變量。

變量空間的開辟需要什么要素呢?

??? 1,這個空間要存儲什么數據?數據類型。

??? 2,這個空間叫什么名字啊?變量名稱。

??? 3,這個空間的第一次的數據是什么? 變量的初始化值。

變量的作用域和生存期:

變量的作用域:

??? 作用域從變量定義的位置開始,到該變量所在的那對大括號結束;

生命周期:

??? 變量從定義的位置開始就在內存中活了;

??? 變量到達它所在的作用域的時候就在內存中消失了;

數據類型

???

??? 1):基本數據類型:byte、short、int、long、float、double、char、boolean

??? 2):引用數據類型: 數組、類、接口。

級別從低到高為:byte,char,short(這三個平級)-->int-->float-->long-->double

自動類型轉換:從低級別到高級別,系統自動轉的;

強制類型轉換:什么情況下使用?把一個高級別的數賦給一個別該數的級別低的變量;

?

運算符號:

??? 1)、算術運算符。

??????? + - * / %?? %:任何整數模2不是0就是1,所以只要改變被模數就可以實現開關運算。

??????? +:連接符。

??????? ++,--

??? 2)、賦值運算符。

??????? =? += -= *= /= %=

??? 3)、比較運算符。

??????? 特點:該運算符的特點是:運算完的結果,要么是true,要么是false。

??? 4)、邏輯運算符。

??????? &? |? ^? !?? &&?? ||

??????? 邏輯運算符除了 !? 外都是用于連接兩個boolean類型表達式。

??????? &: 只有兩邊都為true結果是true。否則就是false。

??????? |:只要兩邊都為false結果是false,否則就是true

??????? ^:異或:和或有點不一樣。

??????????? ?兩邊結果一樣,就為false。

??????????? ?兩邊結果不一樣,就為true.

??????? & &&區別: & :無論左邊結果是什么,右邊都參與運算。

??????????????????? ??&&:短路與,如果左邊為false,那么右邊不參數與運算。

??????? | || 區別:|:兩邊都運算。

??????????????????? ||:短路或,如果左邊為true,那么右邊不參與運算。

??? 5)、位運算符:用于操作二進制位的運算符。

??????? &? |? ^

??????? <<? >>?? >>>(無符號右移)

??? 練習:對兩個變量的數據進行互換。不需要第三方變量。

??????????? int a? = 3,b = 5;-->b = 3,a = 5;

??????????? a = a + b; a = 8;

??????????? b = a - b; b = 3;

??????????? a = a - b; a = 5;

??????????? a = a ^ b;//

??????????? b = a ^ b;//b = a ^ b ^ b = a

??????????? a = a ^ b;//a = a ^ b ^ a = b;

??????? 練習:高效的算出 2*8 = 2<<3;

5,語句。

??? If? switch? do while?? while? for

??? 這些語句什么時候用?

??? 1)、當判斷固定個數的值的時候,可以使用if,也可以使用switch。建議使用switch,效率相對較高

switch(變量){

? ?case 值:要執行的語句;break;

? ?…

? ?default:要執行的語句;

}

?工作原理:用小括號中的變量的值依次和case后面的值進行對比,和哪個case后面的值相同了

?????????? 就執行哪個case后面的語句,如果沒有相同的則執行default后面的語句;

?細節:1):break是可以省略的,如果省略了就一直執行到遇到break為止;

??? ?? 2):switch 后面的小括號中的變量應該是byte,char,short,int四種類型中的一種;

??? ?? 3):default可以寫在switch結構中的任意位置;如果將default語句放在了第一行,則不管expressioncase中的value是否匹配,程序會從default開始執行直到第一個break出現。

??? 2)、當判斷數據范圍,獲取判斷運算結果boolean類型時,需要使用if。

??? 3)、當某些語句需要執行很多次時,就用循環結構。

??? while和for可以進行互換。

??? 區別在于:如果需要定義變量控制循環次數。建議使用for。因為for循環完畢,變量在內存中釋放。

?

break:作用于switch ,和循環語句,用于跳出,或者稱為結束。

break語句單獨存在時,下面不要定義其他語句,因為執行不到,編譯會失敗。當循環嵌套時,break只跳出當前所在循環。要跳出嵌套中的外部循環,只要給循環起名字即可,這個名字稱之為標號

?

continue:只作用于循環結構,繼續循環用的。

作用:結束本次循環,繼續下次循環。該語句單獨存在時,下面不可以定義語句,執行不到。

?

6,函 數:為了提高代碼的復用性,可以將其定義成一個單獨的功能,該功能的體現就是java中的函數。函數就是體現之一。

java中的函數的定義格式:

??? 修飾符 返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數1…){

?????? 執行語句;

?????? return 返回值;

??? }

當函數沒有具體的返回值時,返回的返回值類型用void關鍵字表示。

如果函數的返回值類型是void時,return語句可以省略不寫的,系統會幫你自動加上。

return的作用:結束函數。結束功能。

?

如何定義一個函數?

??? 函數其實就是一個功能,定義函數就是實現功能,通過兩個明確來完成:

??? 1)、明確該功能的運算完的結果,其實是在明確這個函數的返回值類型。

??? 2)、在實現該功能的過程中是否有未知內容參與了運算,其實就是在明確這個函數的參數列表(參數類型&參數個數)。

函數的作用:

1)、用于定義功能。

2)、用于封裝代碼提高代碼的復用性。

注意:函數中只能調用函數,不能定義函數。

主函數:

??? 1)、保證該類的獨立運行。

??? 2)、因為它是程序的入口。

??? 3)、因為它在被jvm調用。

?

函數定義名稱是為什么呢?

答:1)、為了對該功能進行標示,方便于調用。

??? 2)、為了通過名稱就可以明確函數的功能,為了增加代碼的閱讀性。

?

重載的定義是:在一個類中,如果出現了兩個或者兩個以上的同名函數,只要它們的參數的個數,或者參數的類型不同,即可稱之為該函數重載了。

如何區分重載:當函數同名時,只看參數列表。和返回值類型沒關系。

?

7一維數組:用于存儲同一類型數據的一個容器。好處:可以對該容器中的數據進行編號,從0開始。數組用于封裝數據,就是一個具體的實體。

如何在java中表現一個數組呢?兩種表現形式。

1)、元素類型[] 變量名 = new 元素類型[元素的個數];

2)、元素類型[] 變量名 = {元素1,元素2...};

3)、System.arrayCopy(source,0,dest,0,x):語句的意思就是:復制源數組從下標0開始的x個元素到目標數組,從目標數組的下標0所對應的位置開始存取。

4)、Arrays.sort(數組名)為數組排序的操作,但這個方法在java.util這個包里面,所以在用到的時候需要先將它導入

---------------------------------------------------------

//二分查找法。必須有前提:數組中的元素要有序。

public class BubbleTest

{

public static int binary(int[] array, int value)

{

int low = 0;

int high = array.length - 1;

?

while(low <= high)

{

int middle = (low + high) / 2;

if(value == array[middle])

{

return middle;

}

if(value > array[middle])

{

low = middle + 1;

}

if(value < array[middle])

{

high = middle - 1;

}

}

return -1;

}

public static void main(String[] args)

{

int[] a = {1, 2, 3, 4, 5, 6, 7, 8, 9};

int value = binary(a, 9);

System.out.println(value);

}

}

?

Java把內存劃分為4個部分 1. 代碼區 1、棧區 3、堆區 4、靜態區域

1、棧區(stacksegment)—由編譯器自動分配釋放,存放函數的參數值,局部變量的值等,具體方法執行結束之后,系統自動釋放JVM內存資源

2、堆區(heapsegment)—一般由程序員分配釋放,存放由new創建的對象和數組,jvm不定時查看這個對象,如果沒有引用指向這個對象就回收
3、靜態區(datasegment)—存放全局變量,靜態變量和字符串常量,不釋放
4、代碼區(codesegment)—存放程序中方法的二進制代碼,而且是多個對象共享一個代碼空間區域

----------------------------------------------------------------------------------------------

三:面向對象:★★★★★

特點:1:將復雜的事情簡單化。

2:面向對象將以前的過程中的執行者,變成了指揮者。

3:面向對象這種思想是符合現在人們思考習慣的一種思想。

?

過程和對象在我們的程序中是如何體現的呢?過程其實就是函數;對象是將函數等一些內容進行了封裝。

?

匿名對象使用場景

1當對方法只進行一次調用的時候,可以使用匿名對象。

2當對象對成員進行多次調用時,不能使用匿名對象。必須給對象起名字。

?

在類中定義其實都稱之為成員。成員有兩種:

1:成員變量:其實對應的就是事物的屬性。

2:成員函數:其實對應的就是事物的行為。

?

所以,其實定義類,就是在定義成員變量和成員函數。但是在定義前,必須先要對事物進行屬性和行為的分析,才可以用代碼來體現。

?

private int age;//私有的訪問權限最低,只有在本類中的訪問有效。

注意:私有僅僅是封裝的一種體現形式而已。

?

私有的成員:其他類不能直接創建對象訪問,所以只有通過本類對外提供具體的訪問方式來完成對私有的訪問,可以通過對外提供函數的形式對其進行訪問。

好處:可以在函數中加入邏輯判斷等操作,對數據進行判斷等操作。

?

總結:開發時,記住,屬性是用于存儲數據的,直接被訪問,容易出現安全隱患,所以,類中的屬性通常被私有化,并對外提供公共的訪問方法。

這個方法一般有兩個,規范寫法:對于屬性 xxx,可以使用setXXX(),getXXX()對其進行操作。

?

類中怎么沒有定義主函數呢?

注意:主函數的存在,僅為該類是否需要獨立運行,如果不需要,主函數是不用定義的。

主函數的解釋:保證所在類的獨立運行,是程序的入口,被jvm調用。

?

成員變量和局部變量的區別:

1:成員變量直接定義在類中。

?? 局部變量定義在方法中,參數上,語句中。

2:成員變量在這個類中有效。

局部變量只在自己所屬的大括號內有效,大括號結束,局部變量失去作用域。

3:成員變量存在于堆內存中,隨著對象的產生而存在,消失而消失。

局部變量存在于棧內存中,隨著所屬區域的運行而存在,結束而釋放。

?

構造函數:用于給對象進行初始化,是給與之對應的對象進行初始化,它具有針對性,函數中的一種。

特點

1該函數的名稱和所在類的名稱相同。

2不需要定義返回值類型。

3該函數沒有具體的返回值。

記住:所有對象創建時,都需要初始化才可以使用。

?

注意事項:一個類在定義時,如果沒有定義過構造函數,那么該類中會自動生成一個空參數的構造函數,為了方便該類創建對象,完成初始化。如果在類中自定義了構造函數,那么默認的構造函數就沒有了。

?

一個類中,可以有多個構造函數,因為它們的函數名稱都相同,所以只能通過參數列表來區分。所以,一個類中如果出現多個構造函數。它們的存在是以重載體現的。

?

構造函數和一般函數有什么區別呢?

1兩個函數定義格式不同。

2構造函數是在對象創建時,就被調用,用于初始化,而且初始化動作只執行一次。

??? 一般函數,是對象創建后,需要調用才執行,可以被調用多次。

??

什么時候使用構造函數呢

分析事物時,發現具體事物一出現,就具備了一些特征,那就將這些特征定義到構造函數內。

?

構造代碼塊和構造函數有什么區別?

構造代碼塊:是給所有的對象進行初始化,也就是說,所有的對象都會調用一個代碼塊。只要對象一建立。就會調用這個代碼塊。

構造函數:是給與之對應的對象進行初始化。它具有針對性。

?

Person p = new Person();

創建一個對象都在內存中做了什么事情?

1先將硬盤上指定位置的Person.class文件加載進內存。

2執行main方法時,在棧內存中開辟了main方法的空間(壓棧-進棧),然后在main方法的棧區分配了一個變量p。

3在堆內存中開辟一個實體空間,分配了一個內存首地址值。new

4在該實體空間中進行屬性的空間分配,并進行了默認初始化。

5對空間中的屬性進行顯示初始化。

6進行實體的構造代碼塊初始化。

7調用該實體對應的構造函數,進行構造函數初始化。()

8將首地址賦值給p ,p變量就引用了該實體。(指向了該對象)

--------------------------------------------------------------------------------------------

封 裝(面向對象特征之一)是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

好處:將變化隔離;便于使用;提高重用性;安全性。

封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。

?

this:代表對象。就是所在函數所屬對象的引用。

this到底代表什么呢?哪個對象調用了this所在的函數,this就代表哪個對象,就是哪個對象的引用。

開發時,什么時候使用this呢?

在定義功能時,如果該功能內部使用到了調用該功能的對象,這時就用this來表示這個對象。

?

this 還可以用于構造函數間的調用。

調用格式:this(實際參數)

this對象后面跟上 .? 調用的是成員屬性和成員方法(一般方法);

this對象后面跟上 () 調用的是本類中的對應參數的構造函數。

?

注意:用this調用構造函數,必須定義在構造函數的第一行。因為構造函數是用于初始化的,所以初始化動作一定要執行。否則編譯失敗。

?

static★★★ 關鍵字,是一個修飾符,用于修飾成員(成員變量和成員函數)

特點:

1,想要實現對象中的共性數據的對象共享。可以將這個數據進行靜態修飾。

2,被靜態修飾的成員,可以直接被類名所調用。也就是說,靜態的成員多了一種調用方式。類名.靜態方式

3,靜態隨著類的加載而加載。而且優先于對象存在。

?

弊端:

1,有些數據是對象特有的數據,是不可以被靜態修飾的。因為那樣的話,特有數據會變成對象的共享數據。這樣對事物的描述就出了問題。所以,在定義靜態時,必須要明確,這個數據是否是被對象所共享的。

2,靜態方法只能訪問靜態成員,不可以訪問非靜態成員。

因為靜態方法加載時,優先于對象存在,所以沒有辦法訪問對象中的成員。

3,靜態方法中不能使用thissuper關鍵字。

因為this代表對象,而靜態在時,有可能沒有對象,所以this無法使用。

4,主函數是靜態的。

?

什么時候定義靜態成員呢?或者說:定義成員時,到底需不需要被靜態修飾呢?

成員分兩種:

1,成員變量。數據共享時靜態化

該成員變量的數據是否是所有對象都一樣:

如果是,那么該變量需要被靜態修飾,因為是共享的數據。

如果不是,那么就說這是對象的特有數據,要存儲到對象中。

2,成員函數。方法中沒有調用特有數據時就定義成靜態

??? 如果判斷成員函數是否需要被靜態修飾呢?

??? 只要參考,該函數內是否訪問了對象中的特有數據:

??? 如果有訪問特有數據,那方法不能被靜態修飾。

??? 如果沒有訪問過特有數據,那么這個方法需要被靜態修飾。

?

成員變量和靜態變量的區別:

1,成員變量所屬于對象。所以也稱為實例變量。

靜態變量所屬于類。所以也稱為類變量。

2,成員變量存在于堆內存中。

靜態變量存在于方法區中。

3,成員變量隨著對象創建而存在。隨著對象被回收而消失。

靜態變量隨著類的加載而存在。隨著類的消失而消失。

4,成員變量只能被對象所調用 。

靜態變量可以被對象調用,也可以被類名調用。

所以,成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。

?

靜態的注意:靜態的生命周期很長。

靜態代碼塊:就是一個有靜態關鍵字標示的一個代碼塊區域。定義在類中。

作用:可以完成類的初始化。靜態代碼塊隨著類的加載而執行,而且只執行一次(new 多個對象就只執行一次)。如果和主函數在同一類中,優先于主函數執行。

?

Public訪問權限最大。

static不需要對象,直接類名即可。

void主函數沒有返回值。

Main主函數特定的名稱。

(String[] args)主函數的參數,是一個字符串數組類型的參數,jvm調用main方法時,傳遞的實際參數是 new String[0]。

?

jvm默認傳遞的是長度為0的字符串數組,我們在運行該類時,也可以指定具體的參數進行傳遞。可以在控制臺,運行該類時,在后面加入參數。參數之間通過空格隔開。jvm會自動將這些字符串參數作為args數組中的元素,進行存儲。

?

靜態代碼塊、構造代碼塊、構造函數同時存在時的執行順序:靜態代碼塊 à構造代碼塊 à構造函數;

?

生成Java幫助文檔:命令格式:javadoc –d 文件夾名 –auther –version *.java

/**???? //格式

*類描述

*@author 作者名

*@version 版本號

*/

/**

*方法描述

*@param? 參數描述

*@return? 返回值描述

*/

---------------------------------------------------------------------------------------------

設計模式:解決問題最行之有效的思想。是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

?

java中有23種設計模式:

單例設計模式:★★★★★

解決的問題:保證一個類在內存中的對象唯一性。

比如:多程序讀取一個配置文件時,建議配置文件封裝成對象。會方便操作其中數據,又要保證多個程序讀到的是同一個配置文件對象,就需要該配置文件對象在內存中是唯一的。

?

Runtime()方法就是單例設計模式進行設計的。

?

如何保證對象唯一性呢?

思想:

1,不讓其他程序創建該類對象。

2,在本類中創建一個本類對象。

3,對外提供方法,讓其他程序獲取這個對象。

?

步驟:

1,因為創建對象都需要構造函數初始化,只要將本類中的構造函數私有化,其他程序就無法再創建該類對象;

2,就在類中創建一個本類的對象;

3,定義一個方法,返回該對象,讓其他程序可以通過方法就得到本類對象。(作用:可控)

?

代碼體現:

1,私有化構造函數;

2,創建私有并靜態的本類對象;

3,定義公有并靜態的方法,返回該對象。

---------------------------------------------

//餓漢式

class Single{

??? private Single(){} //私有化構造函數。

private static Single s = new Single(); //創建私有并靜態的本類對象。

??? public static Single getInstance(){ //定義公有并靜態的方法,返回該對象。

??????? return s;

??? }

}

---------------------------------------------

//懶漢式:延遲加載方式。

class Single2{

??? private Single2(){}

private static Single2 s = null;

??? public static Single2 getInstance(){

??????? if(s==null)

??????????? s = new Single2();

??????? return s;

??? }

}

-------------------------------------------------------------------------------------------------

繼 承(面向對象特征之一)

好處:

1:提高了代碼的復用性。

2:讓類與類之間產生了關系,提供了另一個特征多態的前提。

?

父類的由來:其實是由多個類不斷向上抽取共性內容而來的。

java中對于繼承,java只支持單繼承。java雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。

?

單繼承:一個類只能有一個父類。

多繼承:一個類可以有多個父類。

?

為什么不支持多繼承呢?

因為當一個類同時繼承兩個父類時,兩個父類中有相同的功能,那么子類對象調用該功能時,運行哪一個呢?因為父類中的方法中存在方法體。

但是java支持多重繼承。A繼承B? B繼承C? C繼承D。

多重繼承的出現,就有了繼承體系。體系中的頂層父類是通過不斷向上抽取而來的。它里面定義的該體系最基本最共性內容的功能。

所以,一個體系要想被使用,直接查閱該系統中的父類的功能即可知道該體系的基本用法。那么想要使用一個體系時,需要建立對象。建議建立最子類對象,因為最子類不僅可以使用父類中的功能。還可以使用子類特有的一些功能。

?

簡單說:對于一個繼承體系的使用,查閱頂層父類中的內容,創建最底層子類的對象。

?

子父類出現后,類中的成員都有了哪些特點:

1:成員變量。

??? ?當子父類中出現一樣的屬性時,子類類型的對象,調用該屬性,值是子類的屬性值。

??? ?如果想要調用父類中的屬性值,需要使用一個關鍵字:super

??? ?This代表是本類類型的對象引用。

??? ?Super代表是子類所屬的父類中的內存空間引用。

??? ?注意:子父類中通常是不會出現同名成員變量的,因為父類中只要定義了,子類就不用在定義了,直接繼承過來用就可以了。

2:成員函數。

當子父類中出現了一模一樣的方法時,建立子類對象會運行子類中的方法。好像父類中的方法被覆蓋掉一樣。所以這種情況,是函數的另一個特性:覆蓋(復寫,重寫)

什么時候使用覆蓋呢?當一個類的功能內容需要修改時,可以通過覆蓋來實現。

3:構造函數。

發現子類構造函數運行時,先運行了父類的構造函數。為什么呢?

原因:子類的所有構造函數中的第一行,其實都有一條隱身的語句super();

super(): 表示父類的構造函數,并會調用于參數相對應的父類中的構造函數。而super():是在調用父類中空參數的構造函數。

為什么子類對象初始化時,都需要調用父類中的函數?(為什么要在子類構造函數的第一行加入這個super()?)

因為子類繼承父類,會繼承到父類中的數據,所以必須要看父類是如何對自己的數據進行初始化的。所以子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程

?

注意:子類中所有的構造函數都會默認訪問父類中的空參數的構造函數,因為每一個子類構造內第一行都有默認的語句super();

如果父類中沒有空參數的構造函數,那么子類的構造函數內,必須通過super語句指定要訪問的父類中的構造函數。

如果子類構造函數中用this來指定調用子類自己的構造函數,那么被調用的構造函數也一樣會訪問父類中的構造函數。

?

問題:super()this()是否可以同時出現的構造函數中。

兩個語句只能有一個定義在第一行,所以只能出現其中一個。

?

super()或者this():為什么一定要定義在第一行?

因為super()或者this()都是調用構造函數,構造函數用于初始化,所以初始化的動作要先完成。

?

繼承的細節:

什么時候使用繼承呢?

當類與類之間存在著所屬關系時,才具備了繼承的前提。a是b中的一種。a繼承b。狼是犬科中的一種。

英文書中,所屬關系:" is a "

注意:不要僅僅為了獲取其他類中的已有成員進行繼承。

?

所以判斷所屬關系,可以簡單看,如果繼承后,被繼承的類中的功能,都可以被該子類所具備,那么繼承成立。如果不是,不可以繼承。

?

細節二:

在方法覆蓋時,注意兩點:

1:子類覆蓋父類時,必須要保證,子類方法的權限必須大于等于父類方法權限可以實現繼承。否則,編譯失敗。

2:覆蓋時,要么都靜態,要么都不靜態。 (靜態只能覆蓋靜態,或者被靜態覆蓋)

?

繼承的一個弊端:打破了封裝性。對于一些類,或者類中功能,是需要被繼承,或者復寫的。

這時如何解決問題呢?介紹一個關鍵字,final:最終。

?

final特點:

1:這個關鍵字是一個修飾符,可以修飾類,方法,變量。

2:被final修飾的類是一個最終類,不可以被繼承。

3:被final修飾的方法是一個最終方法,不可以被覆蓋。

4:被final修飾的變量是一個常量,只能賦值一次。

?

??? 其實這樣的原因的就是給一些固定的數據起個閱讀性較強的名稱。

??? 不加final修飾不是也可以使用嗎?那么這個值是一個變量,是可以更改的。加了final,程序更為嚴謹。常量名稱定義時,有規范,所有字母都大寫,如果由多個單詞組成,中間用 _ 連接。

?

抽象類:abstract

抽象:不具體,看不明白。抽象類表象體現。

在不斷抽取過程中,將共性內容中的方法聲明抽取,但是方法不一樣,沒有抽取,這時抽取到的方法,并不具體,需要被指定關鍵字abstract所標示,聲明為抽象方法。

抽象方法所在類一定要標示為抽象類,也就是說該類需要被abstract關鍵字所修飾。

?

抽象類的特點:

1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由abstract關鍵字修飾(可以描述類和方法,不可以描述變量)。

2:抽象方法只定義方法聲明,并不定義方法實現。

3:抽象類不可以被創建對象(實例化)

4:只有通過子類繼承抽象類并覆蓋了抽象類中的所有抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。

?

抽象類的細節:

1:抽象類中是否有構造函數?有,用于給子類對象進行初始化。

2:抽象類中是否可以定義非抽象方法?

??? 可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數。而且比一般類少了一個創建對象的部分。

3:抽象關鍵字abstract和哪些不可以共存?final , private , static

4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創建對象。

-----------------------------------------------------------------------------------------------

模板方法設計模式:

解決的問題:當功能內部一部分實現時確定,一部分實現是不確定的。這時可以把不確定的部分暴露出去,讓子類去實現。

abstract class GetTime{

??? public final void getTime(){ //此功能如果不需要復寫,可加final限定

??????? long start = System.currentTimeMillis();

??????? code(); //不確定的功能部分,提取出來,通過抽象方法實現

??????? long end = System.currentTimeMillis();

??????? System.out.println("毫秒是:"+(end-start));

??? }

??? public abstract void code(); //抽象不確定的功能,讓子類復寫實現

}

class SubDemo extends GetTime{

??? public void code(){ //子類復寫功能方法

??????? for(int y=0; y<1000; y++){

??????????? System.out.println("y");

??????? }

??? }

}

---------------------------------------------------------------------------------------------

接 口:★★★★★

1:是用關鍵字interface定義的。

2:接口中包含的成員,最常見的有全局常量、抽象方法。

注意:接口中的成員都有固定的修飾符。

??? 成員變量:public static final

??? 成員方法:public abstract

interface Inter{

??? public static final int x = 3;

??? public abstract void show();

}

3:接口中有抽象方法,說明接口不可以實例化接口的子類必須實現了接口中所有的抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。

4:類與類之間存在著繼承關系,類與接口中間存在的是實現關系。

??? 繼承用extends? ;實現用implements

5:接口和類不一樣的地方,就是,接口可以被多實現,這就是多繼承改良后的結果。java將多繼承機制通過多現實來體現。

6:一個類在繼承另一個類的同時,還可以實現多個接口。所以接口的出現避免了單繼承的局限性。還可以將類進行功能的擴展。

7:其實java中是有多繼承的。接口與接口之間存在著繼承關系,接口可以多繼承接口

?

接口都用于設計上,設計上的特點:(可以理解主板上提供的接口)

1:接口是對外提供的規則。

2:接口是功能的擴展。

3:接口的出現降低了耦合性。

?

抽象類與接口:

抽象類:一般用于描述一個體系單元,將一組共性內容進行抽取,特點:可以在類中定義抽象內容讓子類實現,可以定義非抽象內容讓子類直接使用。它里面定義的都是一些體系中的基本內容。

接口:一般用于定義對象的擴展功能,是在繼承之外還需這個對象具備的一些功能。

?

抽象類和接口的共性:都是不斷向上抽取的結果。

?

抽象類和接口的區別:

1:抽象類只能被繼承,而且只能單繼承。

接口需要被實現,而且可以多實現。

2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。

接口中都有抽象方法,需要子類去實現。

3:抽象類使用的是? is a 關系。

接口使用的 like a 關系。

4:抽象類的成員修飾符可以自定義。

接口中的成員修飾符是固定的。全都是public的。

?

在開發之前,先定義規則,A和B分別開發,A負責實現這個規則,B負責使用這個規則。至于A是如何對規則具體實現的,B是不需要知道的。這樣這個接口的出現就降低了A和B直接耦合性。

?

------------------------------------------------------------------------------------------------

多 態★★★★★(面向對象特征之一):函數本身就具備多態性,某一種事物有不同的具體的體現。

?

體現:父類引用或者接口的引用指向了自己的子類對象。//Animal a = new Cat();

多態的好處:提高了程序的擴展性。

多態的弊端:當父類引用指向子類對象時,雖然提高了擴展性,但是只能訪問父類中具備的方法,不可以訪問子類中特有的方法。(前期不能使用后期產生的功能,即訪問的局限性)

多態的前提:

??? 1:必須要有關系,比如繼承、或者實現。

??? 2:通常會有覆蓋操作。

?

多態的出現思想上也做著變化:以前是創建對象并指揮對象做事情。有了多態以后,我們可以找到對象的共性類型,直接操作共性類型做事情即可,這樣可以指揮一批對象做事情,即通過操作父類或接口實現。

--------------------------------------------------------------

class 畢姥爺{

??? void 講課(){

??????? System.out.println("企業管理");

??? }

??? void 釣魚(){

??????? System.out.println("釣魚");

??? }

}

class 畢老師 extends 畢姥爺{

??? void 講課(){

??????? System.out.println("JAVA");

??? }

??? void 看電影(){

??????? System.out.println("看電影");

??? }

}

class {

??? public static void main(String[] args) {

??????? 畢姥爺 x = new 畢老師(); //畢老師對象被提升為了畢姥爺類型。

//????? x.講課();

//????? x.看電影();? //錯誤.

??????? 畢老師 y = (畢老師)x; //將畢姥爺類型強制轉換成畢老師類型。

??????? y.看電影();//在多態中,自始自終都是子類對象在做著類型的變化。

??? }

}

---------------------------------------------------------------

如果想用子類對象的特有方法,如何判斷對象是哪個具體的子類類型呢?

可以可以通過一個關鍵字 instanceof ;//判斷對象是否實現了指定的接口或繼承了指定的類

?

格式:<對象 instanceof 類型> ,判斷一個對象是否所屬于指定的類型。

Student instanceof Person = true;//student繼承了person類

?

多態在子父類中的成員上的體現的特點:

1,成員變量:在多態中,子父類成員變量同名。

??? 在編譯時期:參考的是引用型變量所屬的類中是否有調用的成員。(編譯時不產生對象,只檢查語法錯誤

??? 運行時期:也是參考引用型變量所屬的類中是否有調用的成員。

??? 簡單一句話:無論編譯和運行,成員變量參考的都是引用變量所屬的類中的成員變量。

??? 再說的更容易記憶一些:成員變量 --- 編譯運行都看 = 左邊。

2,成員函數。

??? 編譯時期:參考引用型變量所屬的類中是否有調用的方法。

??? 運行事情:參考的是對象所屬的類中是否有調用的方法。

??? 為什么是這樣的呢?因為在子父類中,對于一模一樣的成員函數,有一個特性:覆蓋。

??? 簡單一句:成員函數,編譯看引用型變量所屬的類,運行看對象所屬的類。

??? 更簡單:成員函數 --- 編譯看 = 左邊,運行看 = 右邊。

3,靜態函數。

??? 編譯時期:參考的是引用型變量所屬的類中是否有調用的成員。

??? 運行時期:也是參考引用型變量所屬的類中是否有調用的成員。

??? 為什么是這樣的呢?因為靜態方法,其實不所屬于對象,而是所屬于該方法所在的類。

??? 調用靜態的方法引用是哪個類的引用調用的就是哪個類中的靜態方法。

??? 簡單說:靜態函數 --- 編譯運行都看 = 左邊。

-----------------------------------------------------------------------------------------------

------java.lang.Object

Object所有類的直接或者間接父類,Java認為所有的對象都具備一些基本的共性內容,這些內容可以不斷的向上抽取,最終就抽取到了一個最頂層的類中的,該類中定義的就是所有對象都具備的功能。

?

具體方法:

1boolean equals(Object obj)用于比較兩個對象是否相等,其實內部比較的就是兩個對象地址。

而根據對象的屬性不同,判斷對象是否相同的具體內容也不一樣。所以在定義類時,一般都會復寫equals方法,建立本類特有的判斷對象是否相同的依據。

? public boolean equals(Object obj){

????? if(!(obj instanceof Person))

????????? return false;

????? Person p = (Person)obj;

????? return this.age == p.age;

? }

2String toString()將對象變成字符串;默認返回的格式:類名@哈希值 = getClass().getName() + '@' + Integer.toHexString(hashCode())

? 為了對象對應的字符串內容有意義,可以通過復寫,建立該類對象自己特有的字符串表現形式。

? public String toString(){

????? return "person : "+age;

? }

3Class getClass()獲取任意對象運行時的所屬字節碼文件對象。

4int hashCode()返回該對象的哈希碼值。支持此方法是為了提高哈希表的性能。

?

通常equalstoStringhashCode,在應用中都會被復寫,建立具體對象的特有的內容。

------------------------------------------------------------------------------------------------

內部類:如果A類需要直接訪問B類中的成員,而B類又需要建立A類的對象。這時,為了方便設計和訪問,直接將A類定義在B類中。就可以了。A類就稱為內部類。內部類可以直接訪問外部類中的成員。而外部類想要訪問內部類,必須要建立內部類的對象。

-----------------------------------------------------

class Outer{

??? int num = 4;???

??? class? Inner {

??????? void show(){

??????????? System.out.println("inner show run "+num);?????????

??????? }

??? }

??? public void method(){

??????? Inner in = new Inner();//創建內部類的對象。

??????? in.show();//調用內部類的方法。

??? }

}

-------------------------------------------------------

當內部類定義在外部類中的成員位置上,可以使用一些成員修飾符修飾 privatestatic

1:默認修飾符。

直接訪問內部類格式:外部類名.內部類名 變量名 =? 外部類對象.內部類對象;

Outer.Inner in = new Outer.new Inner();//這種形式很少用。

? 但是這種應用不多見,因為內部類之所以定義在內部就是為了封裝。想要獲取內部類對象通常都通過外部類的方法來獲取。這樣可以對內部類對象進行控制。

2:私有修飾符。

? 通常內部類被封裝,都會被私有化,因為封裝性不讓其他程序直接訪問。

3:靜態修飾符。

? 如果內部類被靜態修飾,相當于外部類,會出現訪問局限性,只能訪問外部類中的靜態成員。

? 注意;如果內部類中定義了靜態成員,那么該內部類必須是靜態的。

?

內部類編譯后的文件名為:外部類名$內部類名.java”

?

為什么內部類可以直接訪問外部類中的成員呢?

那是因為內部中都持有一個外部類的引用。這個是引用是 外部類名.this

內部類可以定義在外部類中的成員位置上,也可以定義在外部類中的局部位置上。

當內部類被定義在局部位置上,只能訪問局部中被final修飾的局部變量。

?

匿名內部類:沒有名字的內部類。就是內部類的簡化形式。一般只用一次就可以用這種形式。匿名內部類其實就是一個匿名子類對象想要定義匿名內部類:需要前提,內部類必須繼承一個類或者實現接口。

?

匿名內部類的格式:new 父類名&接口名(){ 定義子類成員或者覆蓋父類方法 }.方法。

?

匿名內部類的使用場景:

當函數的參數是接口類型引用時,如果接口中的方法不超過3個。可以通過匿名內部類來完成參數的傳遞。

其實就是在創建匿名內部類時,該類中的封裝的方法不要過多,最好兩個或者兩個以內。

--------------------------------------------------------

//面試

??????? //1

??????? new Object(){

??????????? void show(){

??????????????? System.out.println("show run");????????????

??????????? }

??????? }.show();

??????? //2

??????? Object obj = new Object(){

??????????? void show(){

??????????????? System.out.println("show run");

??????????? }

??????? };

??????? obj.show();

???????

??????? 1和2的寫法正確嗎?有區別嗎?說出原因。

??????? 寫法是正確,1和2都是在通過匿名內部類建立一個Object類的子類對象。

??????? 區別:

??????? 第一個可是編譯通過,并運行。

??????? 第二個編譯失敗,因為匿名內部類是一個子類對象,當用Object的obj引用指向時,就被提升為了

??????? Object類型,而編譯時檢查Object類中是否有show方法,所以編譯失敗。

-------------------------------------------------------

class InnerClassDemo6 {

??? +(static)class Inner{

??????? void show(){}

??? }

??? public void method(){

??????? this.new Inner().show();//可以

??? }

??? public static void main(String[] args) {//static不允許this

??????? This.new Inner().show();//錯誤,Inner類需要定義成static

??? }

}

------------------------------------------------------

interface Inter{

??? void show();

}

class Outer{//通過匿名內部類補足Outer類中的代碼。

??? public static Inter method(){

??????? return new Inter(){

??????????? public void show(){}

??????? };

??? }

}

class InnerClassDemo7 {

??? public static void main(String[] args) {

??????? Outer.method().show();

??? /*

??????? Outer.method():意思是:Outer中有一個名稱為method的方法,而且這個方法是靜態的。

??????? Outer.method().show():當Outer類調用靜態的method方法運算結束后的結果又調用了show方法,意味著:method()方法運算完一個是對象,而且這個對象是Inter類型的。

??? */

??????? function (new Inter(){

??????????? public void show(){}

??????? }); //匿名內部類作為方法的參數進行傳遞。

??? }

??? public static void function(Inter in){

??????? in.show();

??? }

}

------------------------------------------------------------------------------------------------

異 常:★★★★

異常:就是不正常。程序在運行時出現的不正常情況。其實就是程序中出現的問題。這個問題按照面向對象思想進行描述,并封裝成了對象。因為問題的產生有產生的原因、有問題的名稱、有問題的描述等多個屬性信息存在。當出現多屬性信息最方便的方式就是將這些信息進行封裝。異常就是java按照面向對象的思想將問題進行對象封裝。這樣就方便于操作問題以及處理問題。

?

出現的問題有很多種,比如角標越界,空指針等都是。就對這些問題進行分類。而且這些問題都有共性內容比如:每一個問題都有名稱,同時還有問題描述的信息,問題出現的位置,所以可以不斷的向上抽取。形成了異常體系

?

--------java.lang.Throwable

Throwable可拋出的。

??? |--Error錯誤,一般情況下,不編寫針對性的代碼進行處理,通常是jvm發生的,需要對程序進行修正。

??? |--Exception異常,可以有針對性的處理方式

?

無論是錯誤還是異常,它們都有具體的子類體現每一個問題,它們的子類都有一個共性,就是都以父類名才作為子類的后綴名

?

這個體系中的所有類和對象都具備一個獨有的特點;就是可拋性。

可拋性的體現:就是這個體系中的類和對象都可以被throws和throw兩個關鍵字所操作。

------------------------------------------------------

class? ExceptionDemo{

??? public static void main(String[] args) {

//????? byte[] buf = new byte[1024*1024*700];//java.lang.OutOfMemoryError內存溢出錯誤

??? }

}

------------------------------------------------------

在開發時,如果定義功能時,發現該功能會出現一些問題,應該將問題在定義功能時標示出來,這樣調用者就可以在使用這個功能的時候,預先給出處理方式。

?

如何標示呢?通過throws關鍵字完成,格式:throws 異常類名,異常類名...

這樣標示后,調用者,在使用該功能時,就必須要處理,否則編譯失敗。

?

處理方式有兩種:1、捕捉;2、拋出。

對于捕捉:java有針對性的語句塊進行處理。

try {

??? 需要被檢測的代碼;

}

catch(異常類 變量名){

??? 異常處理代碼;

}

fianlly{

??? 一定會執行的代碼;

}

--------------------------------------------------------

catch (Exception e) { //e用于接收try檢測到的異常對象。

??? System.out.println("message:"+e.getMessage());//獲取的是異常的信息。

??? System.out.println("toString:"+e.toString());//獲取的是異常的名字+異常的信息。

??? e.printStackTrace();//打印異常在堆棧中信息;異常名稱+異常信息+異常的位置。

}

---------------------------------------------------------

異常處理原則:功能拋出幾個異常,功能調用如果進行try處理,需要與之對應的catch處理代碼塊,這樣的處理有針對性,拋幾個就處理幾個。

?

特殊情況:try對應多個catch時,如果有父類的catch語句塊,一定要放在下面。

?

throw throws關鍵字的區別:

throw用于拋出異常對象,后面跟的是異常對象;throw用在函數內。

throws用于拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。throws用在函數上。

?

通常情況:函數內容如果有throw,拋出異常對象,并沒有進行處理,那么函數上一定要聲明,否則編譯失敗。但是也有特殊情況。

?

異常分兩種:

1:編譯時被檢查的異常,只要是Exception及其子類都是編譯時被檢測的異常。

2:運行時異常,其中Exception有一個特殊的子類RuntimeException,以及RuntimeException的子類是運行異常,也就說這個異常是編譯時不被檢查的異常。

?

編譯時被檢查的異常和運行時異常的區別:

編譯被檢查的異常在函數內被拋出,函數必須要聲明,否編譯失敗。

聲明的原因:是需要調用者對該異常進行處理。

運行時異常如果在函數內被拋出,在函數上不需要聲明。

不聲明的原因:不需要調用者處理,運行時異常發生,已經無法再讓程序繼續運行,所以,不讓調用處理的,直接讓程序停止,由調用者對代碼進行修正。

?

定義異常處理時,什么時候定義try,什么時候定義throws呢?

功能內部如果出現異常,如果內部可以處理,就用try

如果功能內部處理不了,就必須聲明出來,讓調用者處理。

?

自定義異常:當開發時,項目中出現了java中沒有定義過的問題時,這時就需要我們按照java異常建立思想,將項目的中的特有問題也進行對象的封裝。這個異常,稱為自定義異常。

?

對于除法運算,0作為除數是不可以的。java中對這種問題用ArithmeticException類進行描述。對于這個功能,在我們項目中,除數除了不可以為0外,還不可以為負數。可是負數的部分java并沒有針對描述。所以我們就需要自定義這個異常。

?

自定義異常的步驟:

1:定義一個子類繼承Exception或RuntimeException,讓該類具備可拋性。

2:通過throw 或者throws進行操作。

?

異常的轉換思想:當出現的異常是調用者處理不了的,就需要將此異常轉換為一個調用者可以處理的異常拋出。

?

try? catch? finally的幾種結合方式:

?

2,

try

catch

?

3,

try

finally

?

1,

try

catch

finally

?

這種情況,如果出現異常,并不處理,但是資源一定關閉,所以try? finally集合只為關閉資源

記住:finally很有用,主要用戶關閉資源。無論是否發生異常,資源都必須進行關閉。

System.exit(0); //退出jvm,只有這種情況finally不執行。

?

當異常出現后,在子父類進行覆蓋時,有了一些新的特點:

1:當子類覆蓋父類的方法時,如果父類的方法拋出了異常,那么子類的方法要么不拋出異常要么拋出父類異常或者該異常的子類,不能拋出其他異常。

2:如果父類拋出了多個異常,那么子類在覆蓋時只能拋出父類的異常的子集。

?

注意:

如果父類或者接口中的方法沒有拋出過異常,那么子類是不可以拋出異常的,如果子類的覆蓋的方法中出現了異常,只能try不能throws

如果這個異常子類無法處理,已經影響了子類方法的具體運算,這時可以在子類方法中,通過throw拋出RuntimeException異常或者其子類,這樣,子類的方法上是不需要throws聲明的。

?

常見異常:

1、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串;

空指針異常(NullPointerException)

2、類型轉換異常:ClassCastException

3、沒有這個元素異常:NullPointerException

4、不支持操作異常;

異常要盡量避免,如果避免不了,需要預先給出處理方式。比如家庭備藥,比如滅火器。

-----------------------------------------------------------------------------------------------

包:定義包用package關鍵字。

1:對類文件進行分類管理。

2:給類文件提供多層名稱空間。

?

如果生成的包不在當前目錄下,需要最好執行classpath,將包所在父目錄定義到classpath變量中即可。

一般在定義包名時,因為包的出現是為了區分重名的類。所以包名要盡量唯一。怎么保證唯一性呢?可以使用url域名來進行包名稱的定義。

package pack;//定義了一個包,名稱為pack。 注意:包名的寫法規范:所有字母都小寫。

//package cn.itcast.pack.demo;

?

類的全名稱是 包名.類名

??? 編譯命令:javac –d 位置(.當前路徑) java源文件 (就可以自動生成包)

?

包是一種封裝形式,用于封裝類,想要被包以外的程序訪問,該類必須public;

類中的成員,如果被包以外訪問,也必須public;

?

包與包之間訪問可以使用的權限有兩種:

1:public

2:protected:只能是不同包中的子類可以使用的權限。

?

總結java中的四種權限:

??? 范圍?????? public???? protected???? default?????? private

同一個類中?????? ok???????????? ok????????????? ok????????? ok

同一包中??????? ok???????????? ok????????????? ok?????

子類??????????? ok????????

不同包中???????? ok

-----------------------------------------------------------------------------------------------

Import - 導入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個關鍵字:import,可以使用這個關鍵字導入指定包中的類。記住:實際開發時,到的哪個類就導入哪個類,不建議使用*.

import packa.*;//這個僅僅是導入了packa當前目錄下的所有的類。不包含子包。

import packa.abc.*;//導入了packa包中的子包abc下的當前的所有類。

?

如果導入的兩個包中存在著相同名稱的類。這時如果用到該類,必須在代碼中指定包名。

?

常見的軟件包:

java.lang : language java的核心包,Object System? String Throwable jdk1.2版本后,該包中的類自動被導入。

java.awt : 定義的都是用于java圖形界面開發的對象。

javax.swing: 提供所有的windows桌面應用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的圖形界面庫。

java.net : 用于java網絡編程方面的對象都在該包中。

java.io : input? output 用于操作設備上數據的對象都在該包中。比如:讀取硬盤數據,往硬盤寫入數據。

java.util : java的工具包,時間對象,集合框架。

java.applet: application+let 客戶端java小程序。server+let? -->? servlet 服務端java小程序。

?

jar java的壓縮包,主要用于存儲類文件,或者配置文件等。

命令格式:jar –cf 包名.jar 包目錄

?? 解壓縮:jar –xvf 包名.jar

?jar包目錄列表重定向到一個文件中:jar –tf 包名.jar >c:\1.txt

-----------------------------------------------------------------------------------------------

多線程:★★★★

進程:正在進行中的程序。其實進程就是一個應用程序運行時的內存分配空間。

線程:其實就是進程中一個程序執行控制單元,一條執行路徑。進程負責的是應用程序的空間的標示。線程負責的是應用程序的執行順序。

?

一個進程至少有一個線程在運行,當一個進程中出現多個線程時,就稱這個應用程序是多線程應用程序,每個線程在棧區中都有自己的執行空間,自己的方法區、自己的變量。

jvm在啟動的時,首先有一個主線程,負責程序的執行,調用的是main函數。主線程執行的代碼都在main方法中。

當產生垃圾時,收垃圾的動作,是不需要主線程來完成,因為這樣,會出現主線程中的代碼執行會停止,會去運行垃圾回收器代碼,效率較低,所以由單獨一個線程來負責垃圾回收。

?

隨機性的原理:因為cpu的快速切換造成,哪個線程獲取到了cpu的執行權,哪個線程就執行。

?

返回當前線程的名稱:Thread.currentThread().getName()

線程的名稱是由:Thread-編號定義的。編號從0開始。

線程要運行的代碼都統一存放在了run方法中。

?

線程要運行必須要通過類中指定的方法開啟。start方法。(啟動后,就多了一條執行路徑)

start方法:1)、啟動了線程;2)、讓jvm調用了run方法。

?

創建線程的第一種方式:繼承Thread ,由子類復寫run方法。

步驟:

1,定義類繼承Thread類;

2,目的是復寫run方法,將要讓線程運行的代碼都存儲到run方法中;

3,通過創建Thread類的子類對象,創建線程對象;

4,調用線程的start方法,開啟線程,并執行run方法。

?

線程狀態:

被創建:start()

運行:具備執行資格,同時具備執行權;

凍結:sleep(time),wait()—notify()喚醒;線程釋放了執行權,同時釋放執行資格;

臨時阻塞狀態:線程具備cpu的執行資格,沒有cpu的執行權;

消亡:stop()

?

創建線程的第二種方式:實現一個接口Runnable

步驟:

1,定義類實現Runnable接口。

2,覆蓋接口中的run方法(用于封裝線程要運行的代碼)。

3,通過Thread類創建線程對象;

4,將實現了Runnable接口的子類對象作為實際參數傳遞給Thread類中的構造函數。

為什么要傳遞呢?因為要讓線程對象明確要運行的run方法所屬的對象。

5,調用Thread對象的start方法。開啟線程,并運行Runnable接口子類中的run方法。

Ticket t = new Ticket();

??????? /*

??????? 直接創建Ticket對象,并不是創建線程對象。

??????? 因為創建對象只能通過new Thread類,或者new Thread類的子類才可以。

??????? 所以最終想要創建線程。既然沒有了Thread類的子類,就只能用Thread類。

??????? */

??????? Thread t1 = new Thread(t); //創建線程。

??????? /*

??????? 只要將t作為Thread類的構造函數的實際參數傳入即可完成線程對象和t之間的關聯

??????? 為什么要將t傳給Thread類的構造函數呢?其實就是為了明確線程要運行的代碼run方法。

??????? */

??????? t1.start();

???????

為什么要有Runnable接口的出現?

1通過繼承Thread類的方式,可以完成多線程的建立。但是這種方式有一個局限性,如果一個類已經有了自己的父類,就不可以繼承Thread類,因為java單繼承的局限性。

可是該類中的還有部分代碼需要被多個線程同時執行。這時怎么辦呢?

只有對該類進行額外的功能擴展,java就提供了一個接口Runnable。這個接口中定義了run方法,其實run方法的定義就是為了存儲多線程要運行的代碼。

所以,通常創建線程都用第二種方式。

因為實現Runnable接口可以避免單繼承的局限性。

?

2其實是將不同類中需要被多線程執行的代碼進行抽取。將多線程要運行的代碼的位置單獨定義到接口中。為其他類進行功能擴展提供了前提。

所以Thread類在描述線程時,內部定義的run方法,也來自于Runnable接口。

?

實現Runnable接口可以避免單繼承的局限性。而且,繼承Thread,是可以對Thread類中的方法,進行子類復寫的。但是不需要做這個復寫動作的話,只為定義線程代碼存放位置,實現Runnable接口更方便一些。所以Runnable接口將線程要執行的任務封裝成了對象

-------------------------------------------------------

//面試

??????? new Thread(new Runnable(){? //匿名

??????????? public void run(){

??????????????? System.out.println("runnable run");

??????????? }

??????? })

??????? {

??????????? public void run(){

??????????????? System.out.println("subthread run");

??????????? }

??????? }.start();? //結果:subthread run

---------------------------------------------------------

Try {

Thread.sleep(10);

}catch(InterruptedException e){}// 當刻意讓線程稍微停一下,模擬cpu 切換情況。

?

多線程安全問題的原因

通過圖解:發現一個線程在執行多條語句時,并運算同一個數據時,在執行過程中,其他線程參與進來,并操作了這個數據。導致到了錯誤數據的產生。

?

涉及到兩個因素:

1,多個線程在操作共享數據。

2,有多條語句對共享數據進行運算。

原因:這多條語句,在某一個時刻被一個線程執行時,還沒有執行完,就被其他線程執行了。

?

解決安全問題的原理

只要將操作共享數據的語句在某一時段讓一個線程執行完,在執行過程中,其他線程不能進來執行就可以解決這個問題。

?

如何進行多句操作共享數據代碼的封裝呢?

java中提供了一個解決方式:就是同步代碼塊。

格式:

synchronized(對象) {? // 任意對象都可以。這個對象就是鎖。

??? 需要被同步的代碼;

}

---------------------------------------------------------------

同步:★★★★★

好處:解決了線程安全問題。

弊端:相對降低性能,因為判斷鎖需要消耗資源,產生了死鎖。

?

定義同步是有前提的

1,必須要有兩個或者兩個以上的線程,才需要同步。

2,多個線程必須保證使用的是同一個鎖。

?

同步的第二種表現形式:

同步函數:其實就是將同步關鍵字定義在函數上,讓函數具備了同步性。

?

同步函數是用的哪個鎖呢?

通過驗證,函數都有自己所屬的對象this,所以同步函數所使用的鎖就是this

?

當同步函數被static修飾時,這時的同步用的是哪個鎖呢?

靜態函數在加載時所屬于類,這時有可能還沒有該類產生的對象,但是該類的字節碼文件加載進內存就已經被封裝成了對象,這個對象就是該類的字節碼文件對象

所以靜態加載時,只有一個對象存在,那么靜態同步函數就使用的這個對象。

這個對象就是 類名.class

?

同步代碼塊和同步函數的區別?

同步代碼塊使用的鎖可以是任意對象。

同步函數使用的鎖是this,靜態同步函數的鎖是該類的字節碼文件對象

?

在一個類中只有一個同步,可以使用同步函數。如果有多同步,必須使用同步代碼塊,來確定不同的鎖。所以同步代碼塊相對靈活一些。

-------------------------------------------------------

考點問題:請寫一個延遲加載的單例模式?寫懶漢式;當出現多線程訪問時怎么解決?加同步,解決安全問題;效率高嗎?不高;怎樣解決?通過雙重判斷的形式解決。

//懶漢式:延遲加載方式。

當多線程訪問懶漢式時,因為懶漢式的方法內對共性數據進行多條語句的操作。所以容易出現線程安全問題。為了解決,加入同步機制,解決安全問題。但是卻帶來了效率降低。

為了效率問題,通過雙重判斷的形式解決。

class Single{

??? private static Single s = null;

??? private Single(){}

??? public static Single getInstance(){ //鎖是誰?字節碼文件對象;

??? ??? if(s == null){

?????????? synchronized(Single.class){

????????????? if(s == null)

????????????????? s = new Single();

?????????? }

?????? }

??????? return s;

??? }

}

---------------------------------------------------------

同步死鎖:通常只要將同步進行嵌套,就可以看到現象。同步函數中有同步代碼塊,同步代碼塊中還有同步函數。

?

線程間通信:思路:多個線程在操作同一個資源,但是操作的動作卻不一樣。

1:將資源封裝成對象。

2:將線程執行的任務(任務其實就是run方法。)也封裝成對象。

?

等待喚醒機制:涉及的方法:

wait:將同步中的線程處于凍結狀態。釋放了執行權,釋放了資格。同時將線程對象存儲到線程池中。

notify喚醒線程池中某一個等待線程。

notifyAll:喚醒的是線程池中的所有線程。

?

注意:

1:這些方法都需要定義在同步中。

2:因為這些方法必須要標示所屬的鎖。

??? 你要知道 A鎖上的線程被wait了,那這個線程就相當于處于A鎖的線程池中,只能A鎖的notify喚醒。

3:這三個方法都定義在Object類中。為什么操作線程的方法定義在Object類中?

??? 因為這三個方法都需要定義同步內,并標示所屬的同步鎖,既然被鎖調用,而鎖又可以是任意對象,那么能被任意對象調用的方法一定定義在Object類中。

?

waitsleep區別: 分析這兩個方法:從執行權和鎖上來分析:

wait:可以指定時間也可以不指定時間。不指定時間,只能由對應的notify或者notifyAll來喚醒。

sleep:必須指定時間,時間到自動從凍結狀態轉成運行狀態(臨時阻塞狀態)。

wait:線程會釋放執行權,而且線程會釋放鎖。

Sleep:線程會釋放執行權,但不是不釋放鎖。

?

線程的停止:通過stop方法就可以停止線程。但是這個方式過時了。

停止線程:原理就是:讓線程運行的代碼結束,也就是結束run方法。

怎么結束run方法?一般run方法里肯定定義循環。所以只要結束循環即可。

第一種方式:定義循環的結束標記。

第二種方式:如果線程處于了凍結狀態,是不可能讀到標記的,這時就需要通過Thread類中的interrupt方法,將其凍結狀態強制清除。讓線程恢復具備執行資格的狀態,讓線程可以讀到標記,并結束。

?

---------< java.lang.Thread >----------

interrupt()中斷線程。

setPriority(int?newPriority)更改線程的優先級。

getPriority()返回線程的優先級。

toString()返回該線程的字符串表示形式,包括線程名稱、優先級和線程組。

Thread.yield()暫停當前正在執行的線程對象,并執行其他線程。

setDaemon(true)將該線程標記為守護線程或用戶線程。將該線程標記為守護線程或用戶線程。當正在運行的線程都是守護線程時,Java 虛擬機退出。該方法必須在啟動線程前調用。

join:臨時加入一個線程的時候可以使用join方法。

當A線程執行到了B線程的join方式。A線程處于凍結狀態,釋放了執行權,B開始執行。A什么時候執行呢?只有當B線程運行結束后,A才從凍結狀態恢復運行狀態執行。

-----------------------------------------------------------

Lock接口:多線程在JDK1.5版本升級時,推出一個接口Lock接口

解決線程安全問題使用同步的形式,(同步代碼塊,要么同步函數)其實最終使用的都是鎖機制。

?

到了后期版本,直接將鎖封裝成了對象。線程進入同步就是具備了鎖,執行完,離開同步,就是釋放了鎖。

在后期對鎖的分析過程中,發現,獲取鎖,或者釋放鎖的動作應該是鎖這個事物更清楚。所以將這些動作定義在了鎖當中,并把鎖定義成對象。

?

所以同步是隱示的鎖操作,而Lock對象是顯示的鎖操作,它的出現就替代了同步。

?

在之前的版本中使用Object類中wait、notify、notifyAll的方式來完成的。那是因為同步中的鎖是任意對象,所以操作鎖的等待喚醒的方法都定義在Object類中。

?

而現在鎖是指定對象Lock。所以查找等待喚醒機制方式需要通過Lock接口來完成。而Lock接口中并沒有直接操作等待喚醒的方法,而是將這些方式又單獨封裝到了一個對象中。這個對象就是Condition,將Object中的三個方法進行單獨的封裝。并提供了功能一致的方法 await()signal()signalAll()體現新版本對象的好處。

< java.util.concurrent.locks >Condition接口:await()signal()signalAll()

--------------------------------------------------------

class BoundedBuffer {

?? final Lock lock = new ReentrantLock();

?? final Condition notFull? = lock.newCondition();

?? final Condition notEmpty = lock.newCondition();

?? final Object[] items = new Object[100];

?? int putptr, takeptr, count;

?? public void put(Object x) throws InterruptedException {

???? lock.lock();

???? try {

?????? while (count == items.length)

???????? notFull.await();

?????? items[putptr] = x;

?????? if (++putptr == items.length) putptr = 0;

?????? ++count;

?????? notEmpty.signal();

???? }

??? finally {

?????? lock.unlock();

???? }

?? }

?? public Object take() throws InterruptedException {

???? lock.lock();

???? try {

?????? while (count == 0)

???????? notEmpty.await();

?????? Object x = items[takeptr];

?????? if (++takeptr == items.length) takeptr = 0;

?????? --count;

?????? notFull.signal();

?????? return x;

???? }

finally {

?????? lock.unlock();

???? }

?? }

?}

------------------------------------------------------------------------------------------------

API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。

?

--< java.lang >-- String字符串:★★★☆

java中用String類進行描述。對字符串進行了對象的封裝。這樣的好處是可以對字符串這種常見數據進行方便的操作。對象封裝后,可以定義N多屬性和行為。

?

如何定義字符串對象呢?String s = "abc";只要是雙引號引起的數據都是字符串對象。

?

特點字符串一旦被初始化,就不可以被改變,存放在方法區中的常量池中。

------------------------------------------------------

String s1 = "abc"; // s1指向的內存中只有一個對象abc

String s2 = new String("abc"); // s2指向的內容中有兩個對象abcnew

?

System.out.println(s1==s2);//false

System.out.println(s1.equals(s2));//true ,字符串中equals比較的是字符串內容是否相同。

-------------------------------------------------------

字符串的方法:

?

1:構造方法:將字節數組或者字符數組轉成字符串。

String s1 = new String();//創建了一個空內容的字符串。

String s2 = null;//s2沒有任何對象指向,是一個null常量值。

String s3 = "";//s3指向一個具體的字符串對象,只不過這個字符串中沒有內容。

//一般在定義字符串時,不用new

String s4 = new String("abc");

String s5 = "abc"; 一般用此寫法

new String(char[]);//將字符數組轉成字符串。

new String(char[],offset,count);//將字符數組中的一部分轉成字符串。

?

2:一般方法:

??? 按照面向對象的思想:

2.1 獲取:

??? 2.1.1:獲取字符串的長度。length();

??? 2.1.2:指定位置的字符。char charAt(int index);

??? 2.1.3:獲取指定字符的位置。如果不存在返回-1,所以可以通過返回值-1來判斷某一個字符不存在的情況。

??????????? int indexOf(int ch);//返回第一次找到的字符角標

??????????? int indexOf(int ch,int fromIndex); //返回從指定位置開始第一次找到的角標

??????????? int indexOf(String str); //返回第一次找到的字符串角標

??????????? int indexOf(String str,int fromIndex);

?

??????????? int lastIndexOf(int ch);

??????????? int lastIndexOf(int ch,int fromIndex);

??????????? int lastIndexOf(String str);

??????????? int lastIndexOf(String str,int fromIndex);

??? 2.1.4:獲取子串。

??????????? String substring(int start);//從start位開始,到length()-1為止.

??????????? String substring(int start,int end);//從start開始到end為止。//包含start位,不包含end位。

??????????? substring(0,str.length());//獲取整串

2.2 判斷:

??? 2.2.1:字符串中包含指定的字符串嗎?

??????????? boolean contains(String substring);

??? 2.2.2:字符串是否以指定字符串開頭啊?

??????????? boolean startsWith(string);

??? 2.2.3:字符串是否以指定字符串結尾啊?

??????????? boolean endsWith(string);

??? 2.2.4:判斷字符串是否相同

??????????? boolean equals(string);//覆蓋了Object中的方法,判斷字符串內容是否相同。

??? 2.2.5:判斷字符串內容是否相同,忽略大小寫。

??????????? boolean equalsIgnoreCase(string) ;

?

2.3 轉換:

??? 2.3.1:通過構造函數可以將字符數組或者字節數組轉成字符串。

??? 2.3.2:可以通過字符串中的靜態方法,將字符數組轉成字符串。

??????????? static String copyValueOf(char[] );

??????????? static String copyValueOf(char[],int offset,int count);

??????????? static String valueOf(char[]);

??????????? static String valueOf(char[],int offset,int count);

??? 2.3.3:將基本數據類型或者對象轉成字符串。

??????????? static String valueOf(char);

??????????? static String valueOf(boolean);

??????????? static String valueOf(double);

??????????? static String valueOf(float);

??????????? static String valueOf(int);

??????????? static String valueOf(long);

??????????? static String valueOf(Object);

??? 2.3.4:將字符串轉成大小寫。

??????????? String toLowerCase();

??????????? String toUpperCase();

??? 2.3.5:將字符串轉成數組。

??????????? char[] toCharArray();//轉成字符數組。

??????????? byte[] getBytes();//可以加入編碼表。轉成字節數組。

??? 2.3.6:將字符串轉成字符串數組。切割方法。

??????????? String[] split(分割的規則-字符串);

??? 2.3.7:將字符串進行內容替換。注意:修改后變成新字符串,并不是將原字符串直接修改。

??????????? String replace(oldChar,newChar);

??????????? String replace(oldstring,newstring);

??? 2.3.8: String concat(string); //對字符串進行追加。

??????????? String trim();//去除字符串兩端的空格

?? int compareTo();//如果參數字符串等于此字符串,則返回值 0;如果此字符串按字典順序小于字符串參數,則返回一個小于 0 的值;如果此字符串按字典順序大于字符串參數,則返回一個大于 0 的值。

------------------------------------------------------------------------------------------------

--< java.lang >-- StringBuffer字符串緩沖區:★★★☆

構造一個其中不帶字符的字符串緩沖區,初始容量為 16 個字符。

特點:

1:可以對字符串內容進行修改。

2:是一個容器。

3:是可變長度的。

4:緩沖區中可以存儲任意類型的數據。

5:最終需要變成字符串。

?

容器通常具備一些固定的方法:

1,添加。

??? StringBuffer append(data):在緩沖區中追加數據。追加到尾部。

??? StringBuffer insert(index,data):在指定位置插入數據。

2,刪除。

??? StringBuffer delete(start,end);刪除從start至end-1范圍的元素

??? StringBuffer deleteCharAt(index);刪除指定位置的元素

//sb.delete(0,sb.length());//清空緩沖區。

3,修改。

??? StringBuffer replace(start,end,string);將start至end-1替換成string

??? void setCharAt(index,char);替換指定位置的字符

??? void setLength(len);將原字符串置為指定長度的字符串

4,查找。(查不到返回-1)

??? int indexOf(string); 返回指定子字符串在此字符串中第一次出現處的索引。

??? int indexOf(string,int fromIndex);從指定位置開始查找字符串

??? int lastIndexOf(string); 返回指定子字符串在此字符串中最右邊出現處的索引。

??? int lastIndexOf(string,int fromIndex); 從指定的索引開始反向搜索

5,獲取子串。

??? string substring(start); 返回start到結尾的子串

??? string substring(start,end); 返回start至end-1的子串

6,反轉。

??? StringBuffer reverse();字符串反轉

------------------------------------------------------------------------------------------------

--< java.lang >-- StringBuilder字符串緩沖區:★★★☆

JDK1.5出現StringBuiler構造一個其中不帶字符的字符串生成器,初始容量為 16 個字符。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。

方法和StringBuffer一樣;

?

StringBuffer StringBuilder 的區別:

StringBuffer線程安全。

StringBuilder線程不安全。

?

單線程操作,使用StringBuilder 效率高。

多線程操作,使用StringBuffer 安全。

---------------------------------------------------------

??????? StringBuilder sb = new StringBuilder("abcdefg");

??????? sb.append("ak");? //abcdefgak

??????? sb.insert(1,"et");//aetbcdefg

??????? sb.deleteCharAt(2);//abdefg

??????? sb.delete(2,4);//abefg

??????? sb.setLength(4);//abcd

??????? sb.setCharAt(0,'k');//kbcdefg

??????? sb.replace(0,2,"hhhh");//hhhhcdefg

???????

//想要使用緩沖區,先要建立對象。

??????? StringBuffer sb = new StringBuffer();??????

??????? sb.append(12).append("haha");//方法調用鏈。

??????? String s = "abc"+4+'q';

??????? s = new StringBuffer().append("abc").append(4).append('q').toString();

---------------------------------------------------------

class? Test{

??? public static void main(String[] args) {

??????? String s1 = "java";

??????? String s2 = "hello";

??????? method_1(s1,s2);

??????? System.out.println(s1+"...."+s2); //java....hello

???????

??????? StringBuilder s11 = new StringBuilder("java");

??????? StringBuilder s22 = new StringBuilder("hello");

??????? method_2(s11,s22);

??????? System.out.println(s11+"-----"+s22); //javahello-----hello

??? }

??? public static void method_1(String s1,String s2){

??????? s1.replace('a','k');

??????? s1 = s2;

??? }

??? public static void method_2(StringBuilder s1,StringBuilder s2){

??????? s1.append(s2);

??????? s1 = s2;

??? }

}

---------------------------------------------------------

基本數據類型對象包裝類:是按照面向對象思想將基本數據類型封裝成了對象。

好處:

1:可以通過對象中的屬性和行為操作基本數據。

2:可以實現基本數據類型和字符串之間的轉換。

?

關鍵字 ??對應的類名

byte? ? Byte

short ? Short???? paserShort(numstring);

int?? ? Integer?? 靜態方法:parseInt(numstring)

long? ? Long

float ? Float

double??? Double

char? ? Character

Boolean?? Boolean

?

基本數據類型對象包裝類:都有 XXX parseXXX 方法

只有一個類型沒有parse方法:Character ;

--------------------------------------------------------

Integer對象: ★★★☆

數字格式的字符串轉成基本數據類型的方法:

1:將該字符串封裝成了Integer對象,并調用對象的方法intValue();

2:使用Integer.parseInt(numstring):不用建立對象,直接類名調用;

?

將基本類型轉成字符串:

1:Integer中的靜態方法 String toString(int);

2:int+"";

?

將一個十進制整數轉成其他進制:

??? 轉成二進制:toBinaryString

??? 轉成八進制:toOctalString

??? 轉成十六進制:toHexString

??? toString(int num,int radix);

?

將其他進制轉換十進制:

parseInt(string,radix); //將給定的數轉成指定的基數進制;

?

jdk1.5版本后,對基本數據類型對象包裝類進行升級。在升級中,使用基本數據類型對象包裝類可以像使用基本數據類型一樣,進行運算。

??? Integer i = new Integer(4); //1.5版本之前的寫法;0

??? Integer i = 4; //自動裝箱,1.5版本后的寫法;

??? i = i + 5;

??? //i對象是不能直接和5相加的,其實底層先將i轉成int類型,在和5相加。而轉成int類型的操作是隱式的。自動拆箱:拆箱的原理就是i.intValue();i+5運算完是一個int整數。如何賦值給引用類型i呢?其實有對結果進行裝箱。

Integer c = 127;

??? Integer d = 127;

??? System.out.println(c = = d); //true

??? //在裝箱時,如果數值在byte范圍之內,那么數值相同,不會產生新的對象,也就是說多個數值相同的引用指向的是同一個對象。

------------------------------------------------------------------------------------------------

集合框架:★★★★★用于存儲數據的容器。

特點:

1:對象封裝數據,對象多了也需要存儲。集合用于存儲對象。

2:對象的個數確定可以使用數組,但是不確定怎么辦?可以用集合。因為集合是可變長度的。

?

集合和數組的區別:

1:數組是固定長度的;集合可變長度的。

2:數組可以存儲基本數據類型,也可以存儲引用數據類型;集合只能存儲引用數據類型。

3:數組存儲的元素必須是同一個數據類型;集合存儲的對象可以是不同數據類型。

?

數據結構:就是容器中存儲數據的方式。

?

對于集合容器,有很多種。因為每一個容器的自身特點不同,其實原理在于每個容器的內部數據結構不同。

集合容器在不斷向上抽取過程中。出現了集合體系。

在使用一個體系時,原則:參閱頂層內容。建立底層對象。

?

?

------------------------------------------------------------

--< java.util >-- Collection接口:

Collection

??? |--List:有序(元素存入集合的順序和取出的順序一致),元素都有索引。元素可以重復。

??? |--Set:無序(存入和取出順序有可能不一致),不可以存儲重復元素。必須保證元素唯一性。

?

1,添加:

??? add(object):添加一個元素

??? addAll(Collection) :添加一個集合中的所有元素。

2,刪除:

??? clear():將集合中的元素全刪除,清空集合

??? remove(obj) :刪除集合中指定的對象。注意:刪除成功,集合的長度會改變。

??? removeAll(collection) :刪除部分元素。部分元素和傳入Collection一致。

3,判斷:

??? boolean contains(obj) :集合中是否包含指定元素 。

??? boolean containsAll(Collection) :集合中是否包含指定的多個元素。

??? boolean isEmpty():集合中是否有元素。

4,獲取:

??? int size():集合中有幾個元素。

5,取交集:

??? boolean? retainAll(Collection) :對當前集合中保留和指定集合中的相同的元素。如果兩個集合元素相同,返回flase;如果retainAll修改了當前集合,返回true。

6,獲取集合中所有元素:

??? Iterator? iterator()迭代器

7,將集合變成數組:

??? toArray();

------------------------------------------------------------

--< java.util >-- Iterator接口:

迭代器:是一個接口。作用:用于取集合中的元素。

?boolean

hasNext() ?如果仍有元素可以迭代,則返回 true。

?E

next() ??返回迭代的下一個元素。

?void

remove() ?從迭代器指向的 collection 中移除迭代器返回的最后一個元素(可選操作)。

?

每一個集合都有自己的數據結構,都有特定的取出自己內部元素的方式。為了便于操作所有的容器,取出元素。將容器內部的取出方式按照一個統一的規則向外提供,這個規則就是Iterator接口

也就說,只要通過該接口就可以取出Collection集合中的元素,至于每一個具體的容器依據自己的數據結構,如何實現的具體取出細節,這個不用關心,這樣就降低了取出元素和具體集合的耦合性。

?

Iterator it = coll.iterator();//獲取容器中的迭代器對象,至于這個對象是是什么不重要。這對象肯定符合一個規則Iterator接口。

-----------------------------------------------------------------------------

public static void main(String[] args) {

??????? Collection coll = new ArrayList();

??????? coll.add("abc0");

??????? coll.add("abc1");

??????? coll.add("abc2");

??????? //--------------方式1----------------------

??????? Iterator it = coll.iterator();

??????? while(it.hasNext()){

??????????? System.out.println(it.next());

??????? }

??????? //---------------方式2用此種----------------------

??????? for(Iterator it = coll.iterator();it.hasNext(); ){

??????????? System.out.println(it.next());

??????? }

??? }

-----------------------------------------------------------------------------

--< java.util >-- List接口:

List本身是Collection接口的子接口,具備了Collection的所有方法。現在學習List體系特有的共性方法,查閱方法發現List的特有方法都有索引,這是該集合最大的特點。

?

List有序(元素存入集合的順序和取出的順序一致),元素都有索引。元素可以重復。

??? |--ArrayList底層的數據結構是數組,線程不同步,ArrayList替代了Vector,查詢元素的速度非常快。

??? |--LinkedList底層的數據結構是鏈表,線程不同步,增刪元素的速度非常快。

??? |--Vector底層的數據結構就是數組,線程同步的,Vector無論查詢和增刪都巨慢。

?

1,添加:

??? add(index,element) :在指定的索引位插入元素。

??? addAll(index,collection) :在指定的索引位插入一堆元素。

2,刪除:

??? remove(index) :刪除指定索引位的元素。 返回被刪的元素。

3,獲取:

??? Object get(index) :通過索引獲取指定元素。

??? int indexOf(obj) :獲取指定元素第一次出現的索引位,如果該元素不存在返回-1;

??????????????????? ? 所以,通過-1,可以判斷一個元素是否存在。

??? int lastIndexOf(Object o) :反向索引指定元素的位置。

??? List subList(start,end) :獲取子列表。

4,修改:

??? Object set(index,element) :對指定索引位進行元素的修改。

5,獲取所有元素:

??? ListIterator listIterator():list集合特有的迭代器。

?

List集合支持對元素的增、刪、改、查。

?

List集合因為角標有了自己的獲取元素的方式: 遍歷。

for(int x=0; x<list.size(); x++){

? sop("get:"+list.get(x));

}

在進行list列表元素迭代的時候,如果想要在迭代過程中,想要對元素進行操作的時候,比如滿足條件添加新元素。會發生.ConcurrentModificationException并發修改異常。

導致的原因是:

集合引用和迭代器引用在同時操作元素,通過集合獲取到對應的迭代器后,在迭代中,進行集合引用的元素添加,迭代器并不知道,所以會出現異常情況。

如何解決呢?

既然是在迭代中對元素進行操作,找迭代器的方法最為合適.可是Iterator中只有hasNext,next,remove方法.通過查閱的它的子接口,ListIterator,發現該列表迭代器接口具備了對元素的增、刪、改、查的動作。

?

ListIteratorList集合特有的迭代器

ListIterator it = list.listIterator;//取代Iterator it = list.iterator;

方法摘要

?void

add(E?e) 將指定的元素插入列表(可選操作)。

?boolean

hasNext() 以正向遍歷列表時,如果列表迭代器有多個元素,則返回 true(換句話說,如果 next 返回一個元素而不是拋出異常,則返回 true)。

?boolean

hasPrevious() 如果以逆向遍歷列表,列表迭代器有多個元素,則返回 true。

?E

next() 返回列表中的下一個元素。

?int

nextIndex() 返回對 next 的后續調用所返回元素的索引。

?E

previous() 返回列表中的前一個元素。

?int

previousIndex() 返回對 previous 的后續調用所返回元素的索引。

?void

remove() 從列表中移除由 next 或 previous 返回的最后一個元素(可選操作)。

?void

set(E?e) 用指定元素替換 next 或 previous 返回的最后一個元素(可選操作)。

?

可變長度數組的原理:

當元素超出數組長度,會產生一個新數組,將原數組的數據復制到新數組中,再將新的元素添加到新數組中。

ArrayList:是按照原數組的50%延長。構造一個初始容量為 10 的空列表。

Vector:是按照原數組的100%延長。

?

注意:對于list集合,底層判斷元素是否相同,其實用的是元素自身的equals方法完成的。所以建議元素都要復寫equals方法,建立元素對象自己的比較相同的條件依據。

?

LinkedList的特有方法。

addFirst();

addLast();

在jdk1.6以后。

offerFirst();

offerLast();

?

getFirst():獲取鏈表中的第一個元素。如果鏈表為空,拋出NoSuchElementException;

getLast();

在jdk1.6以后。

peekFirst();獲取鏈表中的第一個元素。如果鏈表為空,返回null。

peekLast();

?

removeFirst():獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,拋出NoSuchElementException

removeLast();

在jdk1.6以后。

pollFirst();獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,返回null。

pollLast();

------------------------------------------------------------

--< java.util >-- Set接口

Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一種,迭代器

? |--HashSet底層數據結構是哈希表,線程是不同步的無序,高效;

????? HashSet集合保證元素唯一性:通過元素的hashCode方法,和equals方法完成的。

????? 當元素的hashCode值相同時,才繼續判斷元素的equals是否為true。

????? 如果為true,那么視為相同元素,不存。如果為false,那么存儲。

????? 如果hashCode值不同,那么不判斷equals,從而提高對象比較的速度。

????? |--LinkedHashSet有序,hashset的子類。

? |--TreeSet對Set集合中的元素的進行指定順序的排序。不同步。TreeSet底層的數據結構就是二叉樹。

?

哈希表的原理:

1,對對象元素中的關鍵字(對象中的特有數據),進行哈希算法的運算,并得出一個具體的算法值,這個值 稱為哈希值

2,哈希值就是這個元素的位置。

3,如果哈希值出現沖突,再次判斷這個關鍵字對應的對象是否相同。如果對象相同,就不存儲,因為元素重復。如果對象不同,就存儲,在原來對象的哈希值基礎 +1順延。

4,存儲哈希值的結構,我們稱為哈希表。

5,既然哈希表是根據哈希值存儲的,為了提高效率,最好保證對象的關鍵字是唯一的。

? 這樣可以盡量少的判斷關鍵字對應的對象是否相同,提高了哈希表的操作效率。

?

對于ArrayList集合,判斷元素是否存在,或者刪元素底層依據都是equals方法。

對于HashSet集合,判斷元素是否存在,或者刪除元素,底層依據的是hashCode方法和equals方法。

?

TreeSet:

? 用于對Set集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。

? 如果元素不具備比較性,在運行時會發生ClassCastException異常。

? 所以需要元素實現Comparable接口,強制讓元素具備比較性,復寫compareTo方法

? 依據compareTo方法的返回值,確定元素在TreeSet數據結構中的位置。

? TreeSet方法保證元素唯一性的方式:就是參考比較方法的結果是否為0,如果return 0,視為兩個對象重復,不存。

?

注意:在進行比較時,如果判斷元素不唯一,比如,同姓名,同年齡,才視為同一個人。

? 在判斷時,需要分主要條件和次要條件,當主要條件相同時,再判斷次要條件,按照次要條件排序。

?

TreeSet集合排序有兩種方式,ComparableComparator區別:

1:讓元素自身具備比較性,需要元素對象實現Comparable接口,覆蓋compareTo方法。

2:讓集合自身具備比較性,需要定義一個實現了Comparator接口的比較器,并覆蓋compare方法,并將該類對象作為實際參數傳遞給TreeSet集合的構造函數。

第二種方式較為靈活。

?

------------------------------------------------------------

Map集合:

|--Hashtable底層是哈希表數據結構,是線程同步的。不可以存儲null鍵,null值。

|--HashMap底層是哈希表數據結構,是線程不同步的。可以存儲null鍵,null值。替代了Hashtable.

|--TreeMap底層是二叉樹結構,可以對map集合中的鍵進行指定順序的排序。

?

Map集合存儲和Collection有著很大不同:

Collection一次存一個元素;Map一次存一對元素。

Collection是單列集合;Map是雙列集合。

Map中的存儲的一對元素:一個是鍵,一個是值,鍵與值之間有對應(映射)關系。

特點:要保證map集合中鍵的唯一性。

?

1,添加。

?put(key,value):當存儲的鍵相同時,新的值會替換老的值,并將老值返回。如果鍵沒有重復,返回null。

? void putAll(Map);

2,刪除。

? void clear():清空

? value remove(key) :刪除指定鍵。

3,判斷。

? boolean isEmpty():

? boolean containsKey(key):是否包含key

? boolean containsValue(value) :是否包含value

4,取出。

? int size():返回長度

? value get(key) :通過指定鍵獲取對應的值。如果返回null,可以判斷該鍵不存在。當然有特殊情況,就是在hashmap集合中,是可以存儲null鍵null值的。

? Collection values():獲取map集合中的所有的值。

5,想要獲取map中的所有元素:

? 原理:map中是沒有迭代器的,collection具備迭代器,只要將map集合轉成Set集合,可以使用迭代器了。之所以轉成set,是因為map集合具備著鍵的唯一性,其實set集合就來自于map,set集合底層其實用的就是map的方法。

map集合轉成set的方法:

Set keySet();

Set entrySet();//取的是鍵和值的映射關系。

Entry就是Map接口中的內部接口;

為什么要定義在map內部呢?entry是訪問鍵值關系的入口,是map的入口,訪問的是map中的鍵值對。

---------------------------------------------------------

取出map集合中所有元素的方式一:keySet()方法。

可以將map集合中的鍵都取出存放到set集合中。對set集合進行迭代。迭代完成,再通過get方法對獲取到的鍵進行值的獲取。

????? Set keySet = map.keySet();

????? Iterator it = keySet.iterator();

???? while(it.hasNext()) {

???????? Object key = it.next();

???????? Object value = map.get(key);

???????? System.out.println(key+":"+value);

???? }

--------------------------------------------------------

取出map集合中所有元素的方式二:entrySet()方法。

Set entrySet = map.entrySet();

??????? Iterator it = entrySet.iterator();

??????? while(it.hasNext()) {

??????????? Map.Entry? me = (Map.Entry)it.next();

??????????? System.out.println(me.getKey()+"::::"+me.getValue());

??????? }

--------------------------------------------------------

使用集合的技巧:

看到Array就是數組結構,有角標,查詢速度很快。

看到link就是鏈表結構:增刪速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();

看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到該結構的中的元素必須覆蓋hashCode,equals方法。

看到tree就是二叉樹,就要想到排序,就想要用到比較。

比較的兩種方式:

一個是Comparable:覆蓋compareTo方法;

一個是Comparator:覆蓋compare方法。

LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一致,保證哈希表有序。

?

集合什么時候用?

當存儲的是一個元素時,就用Collection。當存儲對象之間存在著映射關系時,就使用Map集合。

?

保證唯一,就用Set。不保證唯一,就用List

------------------------------------------------------------------------------------------------

Collections它的出現給集合操作提供了更多的功能。這個類不需要創建對象,內部提供的都是靜態方法。

靜態方法:

Collections.sort(list);//list集合進行元素的自然順序排序。

Collections.sort(list,new ComparatorByLen());//按指定的比較器方法排序。

class ComparatorByLen implements Comparator<String>{

? public int compare(String s1,String s2){

????? int temp = s1.length()-s2.length();

????? return temp==0?s1.compareTo(s2):temp;

? }

}

Collections.max(list); //返回list中字典順序最大的元素。

int index = Collections.binarySearch(list,"zz");//二分查找,返回角標。

Collections.reverseOrder();//逆向反轉排序。

Collections.shuffle(list);//隨機對list中的元素進行位置的置換。

?

將非同步集合轉成同步集合的方法:Collections中的? XXX synchronizedXXX(XXX);

List synchronizedList(list);

Map synchronizedMap(map);

原理:定義一個類,將集合所有的方法加同一把鎖后返回。

?

Collection Collections的區別:

Collections是個java.util下的類,是針對集合類的一個工具類,提供一系列靜態方法,實現對集合的查找、排序、替換、線程安全化(將非同步的集合轉換成同步的)等操作。

Collection是個java.util下的接口,它是各種集合結構的父接口,繼承于它的接口主要有Set和List,提供了關于集合的一些操作,如插入、刪除、判斷一個元素是否其成員、遍歷等。

-------------------------------------------------------

Arrays

用于操作數組對象的工具類,里面都是靜態方法。

asList方法將數組轉換成list集合。

String[] arr = {"abc","kk","qq"};

List<String> list = Arrays.asList(arr);//將arr數組轉成list集合。

將數組轉換成集合,有什么好處呢?用aslist方法,將數組變成集合;

可以通過list集合中的方法來操作數組中的元素:isEmpty()、contains、indexOf、set;

注意(局限性):數組是固定長度,不可以使用集合對象增加或者刪除等,會改變數組長度的功能方法。比如add、remove、clear。(會報不支持操作異常UnsupportedOperationException);

如果數組中存儲的引用數據類型,直接作為集合的元素可以直接用集合方法操作。

如果數組中存儲的是基本數據類型,asList會將數組實體作為集合元素存在。

?

集合變數組:用的是Collection接口中的方法:toArray();

如果給toArray傳遞的指定類型的數據長度小于了集合的size,那么toArray方法,會自定再創建一個該類型的數據,長度為集合的size。

??? 如果傳遞的指定的類型的數組的長度大于了集合的size,那么toArray方法,就不會創建新數組,直接使用該數組即可,并將集合中的元素存儲到數組中,其他為存儲元素的位置默認值null。

??? 所以,在傳遞指定類型數組時,最好的方式就是指定的長度和size相等的數組。

將集合變成數組后有什么好處?限定了對集合中的元素進行增刪操作,只要獲取這些元素即可。

------------------------------------------------------------------------------------------------

Jdk5.0新特性:

Collection在jdk1.5以后,有了一個父接口Iterable,這個接口的出現的將iterator方法進行抽取,提高了擴展性。

--------------------------------------------------

增強for循環:foreach語句,foreach簡化了迭代器。

格式:// 增強for循環括號里寫兩個參數,第一個是聲明一個變量,第二個就是需要迭代的容器

for( 元素類型 變量名 : Collection集合 & 數組 ) {

? …

}

高級for循環和傳統for循環的區別:

高級for循環在使用時,必須要明確被遍歷的目標。這個目標,可以是Collection集合或者數組,如果遍歷Collection集合,在遍歷過程中還需要對元素進行操作,比如刪除,需要使用迭代器。

如果遍歷數組,還需要對數組元素進行操作,建議用傳統for循環因為可以定義角標通過角標操作元素。如果只為遍歷獲取,可以簡化成高級for循環,它的出現為了簡化書寫。

?

高級for循環可以遍歷map集合嗎?不可以。但是可以將map轉成set后再使用foreach語句。

?

1)、作用:對存儲對象的容器進行迭代: 數組? collection?? map

2)、增強for循環迭代數組:

String [] arr = {"a", "b", "c"};//數組的靜態定義方式,只試用于數組首次定義的時候

for(String s : arr) {

? System.out.println(s);?

}

3)、單列集合 Collection

List list = new ArrayList();

list.add("aaa");

// 增強for循環, 沒有使用泛型的集合能不能使用增強for循環迭代?能

for(Object obj : list) {

? String s = (String) obj;

? System.out.println(s);

}

4)、雙列集合 Map

Map map = new HashMap();

map.put("a", "aaa");

// 傳統方式:必須掌握這種方式

Set entrys = map.entrySet(); // 1.獲得所有的鍵值對Entry對象

iter = entrys.iterator(); // 2.迭代出所有的entry

while(iter.hasNext()) {

? Map.Entry entry = (Entry) iter.next();

? String key = (String) entry.getKey(); // 分別獲得key和value

? String value = (String) entry.getValue();

? System.out.println(key + "=" + value);

}

// 增強for循環迭代:原則上map集合是無法使用增強for循環來迭代的,因為增強for循環只能針對實現了Iterable接口的集合進行迭代;Iterable是jdk5中新定義的接口,就一個方法iterator方法,只有實現了Iterable接口的類,才能保證一定有iterator方法,java有這樣的限定是因為增強for循環內部還是用迭代器實現的,而實際上,我們可以通過某種方式來使用增強for循環。

for(Object obj : map.entrySet()) {

? Map.Entry entry = (Entry) obj;? // obj 依次表示Entry

? System.out.println(entry.getKey() + "=" + entry.getValue());

}

5)、集合迭代注意問題:在迭代集合的過程中,不能對集合進行增刪操作(會報并發訪問異常);可以用迭代器的方法進行操作(子類listIterator:有增刪的方法)。

6)、增強for循環注意問題:在使用增強for循環時,不能對元素進行賦值;

int[] arr = {1,2,3};

for(int num : arr) {

? num = 0; //不能改變數組的值

}

System.out.println(arr[1]); //2

--------------------------------------------------

可變參數(...:用到函數的參數上,當要操作的同一個類型元素個數不確定的時候,可是用這個方式,這個參數可以接受任意個數的同一類型的數據。

?

和以前接收數組不一樣的是:

以前定義數組類型,需要先創建一個數組對象,再將這個數組對象作為參數傳遞給函數。現在,直接將數組中的元素作為參數傳遞即可。底層其實是將這些元素進行數組的封裝,而這個封裝動作,是在底層完成的,被隱藏了。所以簡化了用戶的書寫,少了調用者定義數組的動作。

如果在參數列表中使用了可變參數,可變參數必須定義在參數列表結尾(也就是必須是最后一個參數,否則編譯會失敗。)

如果要獲取多個int數的和呢?可以使用將多個int數封裝到數組中,直接對數組求和即可。

---------------------------------------------------

靜態導入:導入了類中的所有靜態成員,簡化靜態成員的書寫。

import static java.util.Collections.*;? //導入了Collections類中的所有靜態成員

---------------------------------------------------

枚舉:關鍵字 enum

問題:對象的某個屬性的值不能是任意的,必須為固定的一組取值其中的某一個;

解決辦法:

1)、在setGrade方法中做判斷,不符合格式要求就拋出異常;

2)、直接限定用戶的選擇,通過自定義類模擬枚舉的方式來限定用戶的輸入,寫一個Grade類,私有構造函數,對外提供5個靜態的常量表示類的實例;

3)、jdk5中新定義了枚舉類型,專門用于解決此類問題;

4)、枚舉就是一個特殊的java類,可以定義屬性、方法、構造函數、實現接口、繼承類;

------------------------------------------------------------------------------

自動拆裝箱:java中數據類型分為兩種 : 基本數據類型?? 引用數據類型(對象)

在 java程序中所有的數據都需要當做對象來處理,針對8種基本數據類型提供了包裝類,如下:

int --> Integer

byte --> Byte

short --> Short

long --> Long

char --> Character

double --> Double

float --> Float

boolean --> Boolean

?

jdk5以前基本數據類型和包裝類之間需要互轉:

基本---引用?? Integer x = new Integer(x);

引用---基本?? int num = x.intValue();

1)、Integer x = 1; x = x + 1;? 經歷了什么過程?裝箱à 拆箱 à 裝箱

2)、為了優化,虛擬機為包裝類提供了緩沖池,Integer池的大小 -128~127 一個字節的大小

3)、String池:Java為了優化字符串操作 提供了一個緩沖池;

----------------------------------------------------------

泛型:jdk1.5版本以后出現的一個安全機制。表現格式:< >

好處:

1:將運行時期的問題ClassCastException問題轉換成了編譯失敗,體現在編譯時期,程序員就可以解決問題。

2:避免了強制轉換的麻煩。

?

只要帶有<>的類或者接口,都屬于帶有類型參數的類或者接口,在使用這些類或者接口時,必須給<>中傳遞一個具體的引用數據類型。

?

泛型技術:其實應用在編譯時期,是給編譯器使用的技術,到了運行時期,泛型就不存在了。

為什么? 因為泛型的擦除:也就是說,編輯器檢查了泛型的類型正確后,在生成的類文件中是沒有泛型的。

在運行時,如何知道獲取的元素類型而不用強轉呢?

泛型的補償:因為存儲的時候,類型已經確定了是同一個類型的元素,所以在運行時,只要獲取到該元素的類型,在內部進行一次轉換即可,所以使用者不用再做轉換動作了。

?

什么時候用泛型類呢?

當類中的操作的引用數據類型不確定的時候,以前用的Object來進行擴展的,現在可以用泛型來表示。這樣可以避免強轉的麻煩,而且將運行問題轉移到的編譯時期。

----------------------------------------------------------

泛型在程序定義上的體現:

//泛型類:將泛型定義在類上。

class Tool<Q> {

??? private Q obj;

??? public? void setObject(Q obj) {

??????? this.obj = obj;

??? }

??? public Q getObject() {

??????? return obj;

??? }

}

//當方法操作的引用數據類型不確定的時候,可以將泛型定義在方法上。

??? public <W> void method(W w) {

??????? System.out.println("method:"+w);

??? }

//靜態方法上的泛型:靜態方法無法訪問類上定義的泛型。如果靜態方法操作的引用數據類型不確定的時候,必須要將泛型定義在方法上。

??? public static <Q> void function(Q t) {

??????? System.out.println("function:"+t);

??? }

//泛型接口.

interface Inter<T> {

??? void show(T t);

}

class InterImpl<R> implements Inter<R> {

??? public void show(R r) {

??????? System.out.println("show:"+r);

??? }

}

------------------------------------------------------------

泛型中的通配符:可以解決當具體類型不確定的時候,這個通配符就是 ?? ;當操作類型時,不需要使用類型的具體功能時,只使用Object類中的功能。那么可以用 ? 通配符來表未知類型。

?

泛型限定:

??? 上限:?extends E:可以接收E類型或者E的子類型對象。

??? 下限:?super E:可以接收E類型或者E的父類型對象。

?

上限什么時候用:往集合中添加元素時,既可以添加E類型對象,又可以添加E的子類型對象。為什么?因為取的時候,E類型既可以接收E類對象,又可以接收E的子類型對象。

?

下限什么時候用:當從集合中獲取元素進行操作的時候,可以用當前元素的類型接收,也可以用當前元素的父類型接收。

?

泛型的細節:

1)、泛型到底代表什么類型取決于調用者傳入的類型,如果沒傳,默認是Object類型;

2)、使用帶泛型的類創建對象時,等式兩邊指定的泛型必須一致;

??? 原因:編譯器檢查對象調用方法時只看變量,然而程序運行期間調用方法時就要考慮對象具體類型了;

3)、等式兩邊可以在任意一邊使用泛型,在另一邊不使用(考慮向后兼容);

ArrayList<String> al = new ArrayList<Object>();? //錯

//要保證左右兩邊的泛型具體類型一致就可以了,這樣不容易出錯。

ArrayList<? extends Object> al = new ArrayList<String>();

al.add("aa");? //錯

//因為集合具體對象中既可存儲String,也可以存儲Object的其他子類,所以添加具體的類型對象不合適,類型檢查會出現安全問題。 ?extends Object 代表Object的子類型不確定,怎么能添加具體類型的對象呢?

public static void method(ArrayList<? extends Object> al) {

al.add("abc");? //錯

? //只能對al集合中的元素調用Object類中的方法,具體子類型的方法都不能用,因為子類型不確定。

}

------------------------------------------------------------------------------------------------------------------------------------------------

API--- java.lang.System: 屬性和行為都是靜態的。

long currentTimeMillis(); // 返回當前時間毫秒值

exit();? // 退出虛擬機

Properties getProperties() ;? // 獲取當前系統的屬性信息

?

Properties prop = System.getProperties(); //獲取系統的屬性信息,并將這些信息存儲到Properties集合中。

?

System.setProperty("myname","畢老師"); //給系統屬性信息集添加具體的屬性信息

//臨時設置方式:運行jvm時,可以通過jvm的參數進行系統屬性的臨時設置,可以在java命令的后面加入 –D<name>=<value>? 用法:java –Dmyname=小明 類名。

?

String name = System.getProperty("os.name");//獲取指定屬性的信息

?

//想要知道該系統是否是該軟件所支持的系統中的一個。

Set<String> hs = new HashSet<String>();

hs.add("Windows XP");

hs.add("Windows 7");

if(hs.contains(name))

??? System.out.println("可以支持");

else

??? System.out.println("不支持");

--------------------------------------------------------------------------------------------------------------------

API--- java.lang.Runtime: 類中沒有構造方法,不能創建對象。

但是有非靜態方法。說明該類中應該定義好了對象,并可以通過一個static方法獲取這個對象。用這個對象來調用非靜態方法。這個方法就是 static Runtime getRuntime();

?

這個Runtime其實使用單例設計模式進行設計。

?

class? RuntimeDemo {

?????? public static void main(String[] args) throws Exception {

????????????? Runtime r = Runtime.getRuntime();

????????????? Process p = r.exec("notepad.exe SystemDemo.java");? //運行指定的程序

????????????? Thread.sleep(4000);

????????????? p.destroy();? //殺掉進程

?????? }

}

--------------------------------------------------------------------------------------------------------------------

API--- java.util.Math: 用于數學運算的工具類,屬性和行為都是靜態的。該類是final不允許繼承。

?

static double ceil(double a) ; //返回大于指定數值的最小整數

static double floor(double a) ; //返回小于指定數值的最大整數

static long round(double a) ; //四舍五入成整數

static double pow(double a, double b) ; //a的b次冪

static double random(); //返回0~1的偽隨機數

?

?????? public static void main(String[] args) {

????????????? Random r = new Random();

????????????? for(int x=0; x<10; x++) {

???????????????????? //double d = Math.floor(Math.random()*10+1);

???????????????????? //int d? = (int)(Math.random()*10+1);

???????????????????? int d = r.nextInt(10)+1;

???????????????????? System.out.println(d);

????????????? }

?????? }

--------------------------------------------------------------------------------------------------------------------

API--- java.util.Date日期類,月份從0-11;

?????? /*

?????? 日期對象和毫秒值之間的轉換。

?????? 1,日期對象轉成毫秒值。Date類中的getTime方法。

?????? 2,如何將獲取到的毫秒值轉成具體的日期呢?

????????????? Date類中的setTime方法。也可以通過構造函數。

?????? */

????????????? //日期對象轉成毫秒值

????????????? Date d = new Date();

????????????? long time1 = d.getTime();

????????????? long time2 = System.currentTimeMillis(); / /毫秒值。

?????????????

????????????? //毫秒值轉成具體的日期

????????????? long time = 1322709921312l;

????????????? Date d = new Date();

????????????? d.setTime(time);

/*

?????? 將日期字符串轉換成日期對象:使用的就是DateFormat方法中的? Date parse(String source)

?????? */

?????? public static void method() throws Exception {

????????????? String str_time = "2011/10/25";

????????????? DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); //SimpleDateFormat作為可以指定用戶自定義的格式來完成格式化。

????????????? Date d = df.parse(str_time);

?????? }

?????? /*

?????? 如果不需要使用特定的格式化風格,完全可以使用DateFormat類中的靜態工廠方法獲取具體的已經封裝好風格的對象。getDateInstance();getDateTimeInstance();

?????? */

????????????? Date d = new Date();

????????????? DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);

????????????? df = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);

????????????? String str_time = df.format(d);

?

?????? //將日期對象轉換成字符串的方式:DateFormat類中的format方法。

?????? ??? //創建日期格式對象。

????????????? DateFormat df = new SimpleDateFormat(); //該對象的建立內部會封裝一個默認的日期格式。11-12-1 下午1:48

????????????? //如果想要自定義日期格式的話。可使用SimpleDateFormat的構造函數。將具體的格式作為參數傳入到構造函數中。如何表示日期中年的部分呢?可以必須要參與格式對象文檔。

????????????? df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

????????????? //調用DateFormat中的format方法。對已有的日期對象進行格式化。

????????????? String str_time = df.format(d);

--------------------------------------------------------------------------------------------------------------------

API--- java.util. Calendar日歷類

?????? public static void method(){

????????????? Calendar c = Calendar.getInstance();

????????????? System.out.println(c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"

????????????????????????????????????????? +getNum(c.get(Calendar.DAY_OF_MONTH))+"日"

????????????????????????????????????????? +"星期"+getWeek(c.get(Calendar.DAY_OF_WEEK)));

?????? }

?????? public static String getNum(int num){

????????????? return num>9 ? num+"" : "0"+num;

?????? }

?????? public static String getWeek(int index){

?????? /*

?????? 查表法:建立數據的對應關系.

?????? 最好:數據個數是確定的,而且有對應關系。如果對應關系的一方,是數字,而且可以作為角標,那么可以通過數組來作為表。

?????? */

????????????? String[] weeks = {"","日","一","二","三","四","五","六"};

????????????? return weeks[index];

?????? }

------------------------------------------------------------------------------------------------------------------------------------------------

IO流:★★★★★用于處理設備上數據。

流:可以理解數據的流動,就是一個數據流。IO流最終要以對象來體現,對象都存在IO包中。

流也進行分類:

1:輸入流(讀)和輸出流(寫)。

2:因為處理的數據不同,分為字節流和字符流。

?

字節流:處理字節數據的流對象。設備上的數據無論是圖片或者dvd,文字,它們都以二進制存儲的。二進制的最終都是以一個8位為數據單元進行體現,所以計算機中的最小數據單元就是字節。意味著,字節流可以處理設備上的所有數據,所以字節流一樣可以處理字符數據。

?

那么為什么要有字符流呢?因為字符每個國家都不一樣,所以涉及到了字符編碼問題,那么GBK編碼的中文用unicode編碼解析是有問題的,所以需要獲取中文字節數據的同時+ 指定的編碼表才可以解析正確數據。為了方便于文字的解析,所以將字節流和編碼表封裝成對象,這個對象就是字符流。只要操作字符數據,優先考慮使用字符流體系。

?

注意:流的操作只有兩種:讀和寫。

?

流的體系因為功能不同,但是有共性內容,不斷抽取,形成繼承體系。該體系一共有四個基類,而且都是抽象類。

?

字節流:InputStream? OutputStream

字符流:Reader? Writer

?

在這四個系統中,它們的子類,都有一個共性特點:子類名后綴都是父類名,前綴名都是這個子類的功能名稱。

--------------------------------------------------------------------------------------------------------------------

public static void main(String[] args) throws IOException { //讀、寫都會發生IO異常

?????? /*

?????? 1:創建一個字符輸出流對象,用于操作文件。該對象一建立,就必須明確數據存儲位置,是一個文件。

?????? 2:對象產生后,會在堆內存中有一個實體,同時也調用了系統底層資源,在指定的位置創建了一個存儲數據的文件。

?????? 3:如果指定位置,出現了同名文件,文件會被覆蓋。

?????? */

?????? FileWriter fw = new FileWriter("demo.txt"); // FileNotFoundException

?????? /*

?????? 調用Writer類中的write方法寫入字符串。字符串并未直接寫入到目的地中,而是寫入到了流中,(其實是寫入到內存緩沖區中)。怎么把數據弄到文件中?

?????? */

?????? fw.write("abcde");

?????? fw.flush(); // 刷新緩沖區,將緩沖區中的數據刷到目的地文件中。

?????? fw.close(); // 關閉流,其實關閉的就是java調用的系統底層資源。在關閉前,會先刷新該流。

}

?

close()和flush()的區別:

flush():將緩沖區的數據刷到目的地中后,流可以使用。

close():將緩沖區的數據刷到目的地中后,流就關閉了,該方法主要用于結束調用的底層資源。這個動作一定做。

--------------------------------------------------------------------------------------------------------------------

io異常的處理方式:io一定要寫finally

?

FileWriter寫入數據的細節:

1:window中的換行符:\r\n兩個符號組成。 linux:\n。

2:續寫數據,只要在構造函數中傳入新的參數true。

3:目錄分割符:window \\? /

?

public static void main(String[] args) {

????????????? FileWriter fw = null;

????????????? try {

???????????????????? fw = new FileWriter("demo.txt",true);

???????????????????? fw.write("abcde");

????????????? }

????????????? catch (IOException e ){

???????????????????? System.out.println(e.toString()+"....");

????????????? }

????????????? finally{

???????????????????? if(fw!=null)

??????????????????????????? try{

?????????????????????????????????? fw.close();

??????????????????????????? }

??????????????????????????? catch (IOException e){

?????? ??????????????????????????? System.out.println("close:"+e.toString());

??????????????????????????? }

????????????? }

}

--------------------------------------------------------------------------------------------------------------------

FileReader使用Reader體系,讀取一個文本文件中的數據。返回 -1 ,標志讀到結尾。

import java.io.*;

class? FileReaderDemo {

?????? public static void main(String[] args) throws IOException {

????????????? /*

????????????? 創建可以讀取文本文件的流對象,FileReader讓創建好的流對象和指定的文件相關聯。

????????????? */

????????????? FileReader fr = new FileReader("demo.txt");

????????????? int ch = 0;

????????????? while((ch = fr.read())!= -1) { //條件是沒有讀到結尾

???????????????????? System.out.println((char)ch); //調用讀取流的read方法,讀取一個字符。

????????????? }

????????????? fr.close();

?????? }

}

--------------------------------------------------------------------------------------------------------------------

讀取數據的第二種方式:第二種方式較為高效,自定義緩沖區。

import java.io.*;

class FileReaderDemo2 {

?????? public static void main(String[] args) throws IOException {

????????????? FileReader fr = new FileReader("demo.txt"); //創建讀取流對象和指定文件關聯。

????????????? //因為要使用read(char[])方法,將讀取到字符存入數組。所以要創建一個字符數組,一般數組的長度都是1024的整數倍。

????????????? char[] buf = new char[1024];

????????????? int len = 0;

????????????? while(( len=fr.read(buf)) != -1) {

???????????????????? System.out.println(new String(buf,0,len));

????????????? }

????????????? fr.close();

?????? }

}

--------------------------------------------------------------------------------------------------------------------

IO中的使用到了一個設計模式:裝飾設計模式。

裝飾設計模式解決:對一組類進行功能的增強。

包裝:寫一個類(包裝類)對被包裝對象進行包裝;

?* 1、包裝類和被包裝對象要實現同樣的接口;

?* 2、包裝類要持有一個被包裝對象;

?* 3、包裝類在實現接口時,大部分方法是靠調用被包裝對象來實現的,對于需要修改的方法我們自己實現;

--------------------------------------------------------------------------------------------------------------------

字符流:

Reader用于讀取字符流的抽象類。子類必須實現的方法只有 read(char[], int, int) 和 close()。

??? ?|---BufferedReader從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。 可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。

??????? |---LineNumberReader跟蹤行號的緩沖字符輸入流。此類定義了方法 setLineNumber(int) 和 getLineNumber(),它們可分別用于設置和獲取當前行號。

???? |---InputStreamReader是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。

?????? ?|---FileReader用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是適當的。要自己指定這些值,可以先在 FileInputStream 上構造一個 InputStreamReader。

???? |---CharArrayReader

???? |---StringReader

-------------------------------------------------

Writer寫入字符流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。

??? ?|---BufferedWriter將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。

???? |---OutputStreamWriter是字符流通向字節流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。

?????? ?|---FileWriter用來寫入字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是可接受的。要自己指定這些值,可以先在 FileOutputStream 上構造一個 OutputStreamWriter。

??? ?|---PrintWriter

???? |---CharArrayWriter

???? |---StringWriter

---------------------------------

字節流:

InputStream是表示字節輸入流的所有類的超類。

??? ?|--- FileInputStream從文件系統中的某個文件中獲得輸入字節。哪些文件可用取決于主機環境。FileInputStream 用于讀取諸如圖像數據之類的原始字節流。要讀取字符流,請考慮使用 FileReader。

???? |--- FilterInputStream包含其他一些輸入流,它將這些流用作其基本數據源,它可以直接傳輸數據或提供一些額外的功能。

?????? ?|--- BufferedInputStream該類實現緩沖的輸入流。

?????? ?|--- Stream

???? |--- ObjectInputStream

???? |--- PipedInputStream

-----------------------------------------------

OutputStream此抽象類是表示輸出字節流的所有類的超類。

??? ?|--- FileOutputStream文件輸出流是用于將數據寫入 File 或 FileDescriptor 的輸出流。

???? |--- FilterOutputStream此類是過濾輸出流的所有類的超類。

?????? ?|--- BufferedOutputStream該類實現緩沖的輸出流。

?????? ?|--- PrintStream

?????? ?|--- DataOutputStream

???? |--- ObjectOutputStream

???? |--- PipedOutputStream

--------------------------------

緩沖區是提高效率用的,給誰提高呢?

BufferedWriter是給字符輸出流提高效率用的,那就意味著,緩沖區對象建立時,必須要先有流對象。明確要提高具體的流對象的效率。

??? FileWriter fw = new FileWriter("bufdemo.txt");

??? BufferedWriter bufw = new BufferedWriter(fw);//讓緩沖區和指定流相關聯。

??? for(int x=0; x<4; x++){

??????? bufw.write(x+"abc");

??????? bufw.newLine(); //寫入一個換行符,這個換行符可以依據平臺的不同寫入不同的換行符。

??????? bufw.flush();//對緩沖區進行刷新,可以讓數據到目的地中。

??? }

??? bufw.close();//關閉緩沖區,其實就是在關閉具體的流。

-----------------------------

BufferedReader

??? FileReader fr = new FileReader("bufdemo.txt");

??? BufferedReader bufr? = new BufferedReader(fr);

??? String line = null;

??? while((line=bufr.readLine())!=null){? //readLine方法返回的時候是不帶換行符的。

??????? System.out.println(line);

??? }

??? bufr.close();

-----------------------------

//記住,只要一讀取鍵盤錄入,就用這句話。

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));//輸出到控制臺

String line = null;

while((line=bufr.readLine())!=null){

??? if("over".equals(line))

??????? break;

??? bufw.write(line.toUpperCase());//將輸入的字符轉成大寫字符輸出

??? bufw.newLine();

??? bufw.flush();

??? }

bufw.close();

bufr.close();

------------------------------

流對象:其實很簡單,就是讀取和寫入。但是因為功能的不同,流的體系中提供N多的對象。那么開始時,到底該用哪個對象更為合適呢?這就需要明確流的操作規律。

?

流的操作規律:

1,明確源和目的。

?????? 數據源:就是需要讀取,可以使用兩個體系:InputStream、Reader;

?????? 數據匯:就是需要寫入,可以使用兩個體系:OutputStream、Writer;

2,操作的數據是否是純文本數據?

?????? 如果是:數據源:Reader

????????????? ??? 數據匯:Writer

?????? 如果不是:數據源:InputStream

????????????? ????? 數據匯:OutputStream

3,雖然確定了一個體系,但是該體系中有太多的對象,到底用哪個呢?

?????? 明確操作的數據設備。

?????? 數據源對應的設備:硬盤(File),內存(數組),鍵盤(System.in)

?????? 數據匯對應的設備:硬盤(File),內存(數組),控制臺(System.out)。

4,需要在基本操作上附加其他功能嗎?比如緩沖。

?????? 如果需要就進行裝飾。

?

轉換流特有功能:轉換流可以將字節轉成字符,原因在于,將獲取到的字節通過查編碼表獲取到指定對應字符。

?

轉換流的最強功能就是基于 字節流 + 編碼表 。沒有轉換,沒有字符流。

?

發現轉換流有一個子類就是操作文件的字符流對象:

InputStreamReader

?????? |--FileReader

OutputStreamWriter

?????? |--FileWrier

?

想要操作文本文件,必須要進行編碼轉換,而編碼轉換動作轉換流都完成了。所以操作文件的流對象只要繼承自轉換流就可以讀取一個字符了。

?

但是子類有一個局限性,就是子類中使用的編碼是固定的,是本機默認的編碼表,對于簡體中文版的系統默認碼表是GBK

FileReader fr = new FileReader("a.txt");

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"gbk");

以上兩句代碼功能一致,

如果僅僅使用平臺默認碼表,就使用FileReader fr = new FileReader("a.txt"); //因為簡化。

?

如果需要制定碼表,必須用轉換流。

轉換流 = 字節流+編碼表。

轉換流的子類File = 字節流 + 默認編碼表。

?

凡是操作設備上的文本數據,涉及編碼轉換,必須使用轉換流。

-----------------------------------------------------------------------------------------------

File類:將文件系統中的文件和文件夾封裝成了對象。提供了更多的屬性和行為可以對這些文件和文件夾進行操作。這些是流對象辦不到的,因為流只操作數據。

?

File類常見方法:

1:創建。

??? boolean createNewFile()在指定目錄下創建文件,如果該文件已存在,則不創建。而對操作文件的輸出流而言,輸出流對象已建立,就會創建文件,如果文件已存在,會覆蓋。除非續寫。

??? boolean mkdir()創建此抽象路徑名指定的目錄。

??? boolean mkdirs()創建多級目錄。

2:刪除。

??? boolean delete()刪除此抽象路徑名表示的文件或目錄。

??? void deleteOnExit()在虛擬機退出時刪除。

注意:在刪除文件夾時,必須保證這個文件夾中沒有任何內容,才可以將該文件夾用delete刪除。

??? window的刪除動作,是從里往外刪。注意:java刪除文件不走回收站。要慎用。

3:獲取.

??? long length()獲取文件大小。

??? String getName()返回由此抽象路徑名表示的文件或目錄的名稱。

??? String getPath()將此抽象路徑名轉換為一個路徑名字符串。

??? String getAbsolutePath()返回此抽象路徑名的絕對路徑名字符串。

??? String getParent()返回此抽象路徑名父目錄的抽象路徑名,如果此路徑名沒有指定父目錄,則返回 null。

long lastModified()返回此抽象路徑名表示的文件最后一次被修改的時間。

File.pathSeparator返回當前系統默認的路徑分隔符,windows默認為 “;”。

File.Separator返回當前系統默認的目錄分隔符,windows默認為 “\”。

4:判斷:

??? boolean exists()判斷文件或者文件夾是否存在。

??? boolean isDirectory()測試此抽象路徑名表示的文件是否是一個目錄。

??? boolean isFile()測試此抽象路徑名表示的文件是否是一個標準文件。

??? boolean isHidden()測試此抽象路徑名指定的文件是否是一個隱藏文件。

??? boolean isAbsolute()測試此抽象路徑名是否為絕對路徑名。

5:重命名。

??? ?boolean renameTo(File dest):可以實現移動的效果。剪切+重命名。

?

String[] list()列出指定目錄下的當前的文件和文件夾的名稱。包含隱藏文件。

如果調用list方法的File 對象中封裝的是一個文件,那么list方法返回數組為null。如果封裝的對象不存在也會返回null。只有封裝的對象存在并且是文件夾時,這個方法才有效。

------------------------------------------------------------------------------------------------

遞歸:就是函數自身調用自身。

什么時候用遞歸呢?

當一個功能被重復使用,而每一次使用該功能時的參數不確定,都由上次的功能元素結果來確定。

簡單說:功能內部又用到該功能,但是傳遞的參數值不確定。(每次功能參與運算的未知內容不確定)。

?

遞歸的注意事項:

1:一定要定義遞歸的條件。

2:遞歸的次數不要過多。容易出現 StackOverflowError 棧內存溢出錯誤

其實遞歸就是在棧內存中不斷的加載同一個函數。

------------------------------------------------------------------------------------------------

Java.util.Properties一個可以將鍵值進行持久化存儲的對象。Map--Hashtable的子類。

Map

?????? |--Hashtable

????????????? |--Properties:用于屬性配置文件,鍵和值都是字符串類型。

特點:1:可以持久化存儲數據。2:鍵值都是字符串。3:一般用于配置文件。

?

|-- load()將流中的數據加載進集合。

原理:其實就是將讀取流和指定文件相關聯,并讀取一行數據,因為數據是規則的key=value,所以獲取一行后,通過 = 對該行數據進行切割,左邊就是鍵,右邊就是值,將鍵、值存儲到properties集合中。

|-- store()寫入各個項后,刷新輸出流。

|-- list()將集合的鍵值數據列出到指定的目的地。

-------------------------------------------------------------------------------------------------

以下介紹IO包中擴展功能的流對象:基本都是裝飾設計模式。

Java.io.outputstream.PrintStream打印流

1:提供了更多的功能,比如打印方法。可以直接打印任意類型的數據。

2:它有一個自動刷新機制,創建該對象,指定參數,對于指定方法可以自動刷新。

3:它使用的本機默認的字符編碼.

4:該流的print方法不拋出IOException。

?

該對象的構造函數。

PrintStream(File file)? :創建具有指定文件且不帶自動行刷新的新打印流。

PrintStream(File file, String csn) :創建具有指定文件名稱和字符集且不帶自動行刷新的新打印流。

PrintStream(OutputStream out) :創建新的打印流。

PrintStream(OutputStream out, boolean autoFlush) :創建新的打印流。

PrintStream(OutputStream out, boolean autoFlush, String encoding) :創建新的打印流。

PrintStream(String fileName) :創建具有指定文件名稱且不帶自動行刷新的新打印流。

PrintStream(String fileName, String csn)

?

PrintStream可以操作目的:1:File對象。2:字符串路徑。3:字節輸出流。

前兩個都JDK1.5版本才出現。而且在操作文本文件時,可指定字符編碼了。

?

當目的是一個字節輸出流時,如果使用的println方法,可以在printStream對象上加入一個true參數。這樣對于println方法可以進行自動的刷新,而不是等待緩沖區滿了再刷新。最終print方法都將具體的數據轉成字符串,而且都對IO異常進行了內部處理。

?

既然操作的數據都轉成了字符串,那么使用PrintWriter更好一些。因為PrintWrite是字符流的子類,可以直接操作字符數據,同時也可以指定具體的編碼。

--------------------------------------------------------

PrintWriter具備了PrintStream的特點同時,還有自身特點:

該對象的目的地有四個:1:File對象。2:字符串路徑。3:字節輸出流。4:字符輸出流。

?

開發時盡量使用PrintWriter

?

方法中直接操作文件的第二參數是編碼表。

直接操作輸出流的,第二參數是自動刷新。

?

//讀取鍵盤錄入將數據轉成大寫顯示在控制臺.

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//源:鍵盤輸入

//目的:把數據寫到文件中,還想自動刷新。

PrintWriter out = new PrintWriter(new FileWriter("out.txt"),true);//設置true后自動刷新

String line = null;

while((line=bufr.readLine())!=null){

??? if("over".equals(line))

??????? break;

??? out.println(line.toUpperCase());//轉大寫輸出

}

? //注意:System.in,System.out這兩個標準的輸入輸出流,在jvm啟動時已經存在了。隨時可以使用。當jvm結束了,這兩個流就結束了。但是,當使用了顯示的close方法關閉時,這兩個流在提前結束了。

out.close();

bufr.close();

------------------------------------------------------------------------------------------------

SequenceInputStream:序列流,作用就是將多個讀取流合并成一個讀取流。實現數據合并。

表示其他輸入流的邏輯串聯。它從輸入流的有序集合開始,并從第一個輸入流開始讀取,直到到達文件末尾,接著從第二個輸入流讀取,依次類推,直到到達包含的最后一個輸入流的文件末尾為止。

這樣做,可以更方便的操作多個讀取流,其實這個序列流內部會有一個有序的集合容器,用于存儲多個讀取流對象。

該對象的構造函數參數是枚舉,想要獲取枚舉,需要有Vector集合,但不高效。需用ArrayList,但ArrayList中沒有枚舉,只有自己去創建枚舉對象。

但是方法怎么實現呢?因為枚舉操作的是具體集合中的元素,所以無法具體實現,但是枚舉和迭代器是功能一樣的,所以,可以用迭代替代枚舉。

?

合并原理:多個讀取流對應一個輸出流。

切割原理:一個讀取流對應多個輸出流。

?

import java.io.*;

import java.util.*;

class? SplitFileDemo{

??? private static final String CFG = ".properties";

??? private static final String SP = ".part";

??? public static void main(String[] args) throws IOException{

??????? File file = new File("c:\\0.bmp");

??????? File dir = new File("c:\\partfiles");

??????? meger(dir);

??? }

??? //數據的合并。

??? public static void meger(File dir)throws IOException{

??????? if(!(dir.exists() && dir.isDirectory()))

??????????? throw new RuntimeException("指定的目錄不存在,或者不是正確的目錄");

??????? File[] files = dir.listFiles(new SuffixFilter(CFG));

??????? if(files.length==0)

??????????? throw new RuntimeException("擴展名.proerpties的文件不存在");

??????? //獲取到配置文件

??????? File config = files[0];

??????? //獲取配置文件的信息。

??????? Properties prop = new Properties();

??????? FileInputStream fis = new FileInputStream(config);

??????? prop.load(fis);

??????? String fileName = prop.getProperty("filename");

??????? int partcount = Integer.parseInt(prop.getProperty("partcount"));

??????? //--------------------------

??????? File[] partFiles = dir.listFiles(new SuffixFilter(SP));

??????? if(partFiles.length!=partcount)

??????????? throw new RuntimeException("缺少碎片文件");

??????? //---------------------

??????? ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();

??????? for(int x=0; x<partcount; x++){

??????????? al.add(new FileInputStream(new File(dir,x+SP)));

??????? }

??????? Enumeration<FileInputStream> en = Collections.enumeration(al);

??????? SequenceInputStream sis = new SequenceInputStream(en);

??????? File file = new File(dir,fileName);

??????? FileOutputStream fos = new FileOutputStream(file);

??????? byte[] buf = new byte[1024];

??????? int len = 0;

??????? while((len=sis.read(buf))!=-1){

??????????? fos.write(buf,0,len);

??????? }

??????? fos.close();

??????? sis.close();

??? }

??? //帶有配置信息的數據切割。

??? public static void splitFile(File file)throws IOException{

??????? //用一個讀取流和文件關聯。

??????? FileInputStream fis = new FileInputStream(file);

??????? //創建目的地。因為有多個。所以先創建引用。

??????? FileOutputStream fos = null;

??????? //指定碎片的位置。

??????? File dir = new File("c:\\partfiles");

??????? if(!dir.exists())

??????????? dir.mkdir();

??????? //碎片文件大小引用。

??????? File f = null;

??????? byte[] buf = new byte[1024*1024];

??????? //因為切割完的文件通常都有規律的。為了簡單標記規律使用計數器。

??????? int count = 0;

??????? int len = 0;

??????? while((len=fis.read(buf))!=-1){

??????????? f = new File(dir,(count++)+".part");

??????????? fos = new FileOutputStream(f);

??????????? fos.write(buf,0,len);

??????????? fos.close();

??????? }

??????? //碎片文件生成后,還需要定義配置文件記錄生成的碎片文件個數。以及被切割文件的名稱。

??????? //定義簡單的鍵值信息,可是用Properties。

??????? String filename = file.getName();

??????? Properties prop = new Properties();

??????? prop.setProperty("filename",filename);

??????? prop.setProperty("partcount",count+"");

??????? File config = new File(dir,count+".properties");

??????? fos = new FileOutputStream(config);

??????? prop.store(fos,"");

??????? fos.close();

??????? fis.close();

??? }

}

class SuffixFilter implements FileFilter{

??? private String suffix;

??? SuffixFilter(String suffix){

??????? this.suffix? = suffix;

??? }

??? public boolean accept(File file){

??????? return? file.getName().endsWith(suffix);

??? }

}

-----------------------------------------------------------------------------------------------

RandomAccessFile:

特點:

1:該對象即可讀取,又可寫入。

2:該對象中的定義了一個大型的byte數組,通過定義指針來操作這個數組。

3:可以通過該對象的getFilePointer()獲取指針的位置,通過seek()方法設置指針的位置。

4:該對象操作的源和目的必須是文件。

5:其實該對象內部封裝了字節讀取流和字節寫入流。

注意:實現隨機訪問,最好是數據有規律。

?

class RandomAccessFileDemo{

??? public static void main(String[] args) throws IOException{

??????? write();

??????? read();

??????? randomWrite();

??? }

??? //隨機寫入數據,可以實現已有數據的修改。

??? public static void randomWrite()throws IOException{

??????? RandomAccessFile raf = new RandomAccessFile("random.txt","rw");

??????? raf.seek(8*4);

??????? System.out.println("pos :"+raf.getFilePointer());

??????? raf.write("王武".getBytes());

??????? raf.writeInt(102);

??????? raf.close();

??? }

??? public static void read()throws IOException{

??????? RandomAccessFile raf = new RandomAccessFile("random.txt","r");//只讀模式。

??????? //指定指針的位置。

??????? raf.seek(8*1);//實現隨機讀取文件中的數據。注意:數據最好有規律。

??????? System.out.println("pos1 :"+raf.getFilePointer());

??????? byte[] buf = new byte[4];

??????? raf.read(buf);

??????? String name = new String(buf);

??????? int age = raf.readInt();

??????? System.out.println(name+"::"+age);

??????? System.out.println("pos2 :"+raf.getFilePointer());

??????? raf.close();

??? }

??? public static void write()throws IOException{

??????? //rw:當這個文件不存在,會創建該文件。當文件已存在,不會創建。所以不會像輸出流一樣覆蓋。

??????? RandomAccessFile raf = new RandomAccessFile("random.txt","rw");//rw讀寫模式

??????? //往文件中寫入人的基本信息,姓名,年齡。

??????? raf.write("張三".getBytes());

??????? raf.writeInt(97);

??????? raf.close();

??? }

}

------------------------------------------------------------------------------------------------

管道流:管道讀取流和管道寫入流可以像管道一樣對接上,管道讀取流就可以讀取管道寫入流寫入的數據。

注意:需要加入多線程技術,因為單線程,先執行read,會發生死鎖,因為read方法是阻塞式的,沒有數據的read方法會讓線程等待。

public static void main(String[] args) throws IOException{

??? PipedInputStream pipin = new PipedInputStream();

??? PipedOutputStream pipout = new PipedOutputStream();

??? pipin.connect(pipout);

??? new Thread(new Input(pipin)).start();

??? new Thread(new Output(pipout)).start();

}

------------------------------------------------------------------------------------------------

對象的序列化:目的:將一個具體的對象進行持久化,寫入到硬盤上。

注意:靜態數據不能被序列化,因為靜態數據不在堆內存中,是存儲在靜態方法區中。

?

如何將非靜態的數據不進行序列化?transient 關鍵字修飾此變量即可。

?

Serializable用于啟動對象的序列化功能,可以強制讓指定類具備序列化功能,該接口中沒有成員,這是一個標記接口。這個標記接口用于給序列化類提供UID。這個uid是依據類中的成員的數字簽名進行運行獲取的。如果不需要自動獲取一個uid,可以在類中,手動指定一個名稱為serialVersionUID id號。依據編譯器的不同,或者對信息的高度敏感性。最好每一個序列化的類都進行手動顯示的UID的指定。

?

import java.io.*;

class ObjectStreamDemo {

??? public static void main(String[] args) throws Exception{

??????? writeObj();

??????? readObj();

??? }

??? public static void readObj()throws Exception{

??????? ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));

??????? Object obj = ois.readObject();//讀取一個對象。

??????? System.out.println(obj.toString());

??? }

??? public static void writeObj()throws IOException{

??????? ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));

??????? oos.writeObject(new Person("lisi",25)); //寫入一個對象。

??????? oos.close();

??? }

}

class Person implements Serializable{

??? private static final long serialVersionUID = 42L;

??? private transient String name;//transient修飾后name將不會進行序列化

??? public int age;

??? Person(String name,int age){

??????? this.name = name;

??????? this.age = age;

??? }

??? public String toString(){

??????? return name+"::"+age;

??? }

}

-----------------------------------------------------------------------------------------------

DataOutputStreamDataInputStream專門用于操作基本數據類型數據的對象。

DataOutputStream dos =? new DataOutputStream(new FileOutputStream("data.txt"));

??? dos.writeInt(256);

??? dos.close();

?

??? DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));

??? int num = dis.readInt();

??? System.out.println(num);

??? dis.close();

-----------------------------------------------------------------------------------------------

ByteArrayInputStream:源:內存

ByteArrayOutputStream:目的:內存。

這兩個流對象不涉及底層資源調用,操作的都是內存中數組,所以不需要關閉。

直接操作字節數組就可以了,為什么還要把數組封裝到流對象中呢?因為數組本身沒有方法,只有一個length屬性。為了便于數組的操作,將數組進行封裝,對外提供方法操作數組中的元素。

?

對于數組元素操作無非兩種操作:設置(寫)和獲取(讀),而這兩操作正好對應流的讀寫操作。這兩個對象就是使用了流的讀寫思想來操作數組。

//創建源:

??? ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());

??? //創建目的:

??? ByteArrayOutputStream bos = new ByteArrayOutputStream();

??? int ch = 0;

??? while((ch=bis.read())!=-1){

??????? bos.write(ch);

??? }

??? System.out.println(bos.toString());

-----------------------------------------------------------------------------------------------

網絡編程:

端口:

物理端口:

邏輯端口:用于標識進程的邏輯地址,不同進程的標識;有效端口:0~65535,其中0~1024系統使用或保留端口。

?

java ip對象:InetAddress.

import java.net.*;

class? IPDemo{

??? public static void main(String[] args) throws UnknownHostException{

??????? //通過名稱(ip字符串or主機名)來獲取一個ip對象。

??????? InetAddress ip = InetAddress.getByName("www.baidu.com");//java.net.UnknownHostException

??????? System.out.println("addr:"+ip.getHostAddress());

??????? System.out.println("name:"+ip.getHostName());

??? }

}

Socket★★★★套接字,通信的端點

就是為網絡服務提供的一種機制,通信的兩端都有Socket,網絡通信其實就是Socket間的通信,數據在兩個Socket間通過IO傳輸。

?

UDP傳輸:

1,只要是網絡傳輸,必須有socket 。

2,數據一定要封裝到數據包中,數據包中包括目的地址、端口、數據等信息。

?

直接操作udp不可能,對于java語言應該將udp封裝成對象,易于我們的使用,這個對象就是DatagramSocket. 封裝了udp傳輸協議的socket對象。

?

因為數據包中包含的信息較多,為了操作這些信息方便,也一樣會將其封裝成對象。這個數據包對象就是:DatagramPacket.通過這個對象中的方法,就可以獲取到數據包中的各種信息。

?

DatagramSocket具備發送和接受功能,在進行udp傳輸時,需要明確一個是發送端,一個是接收端。

?

udp的發送端:

1,建立udp的socket服務,創建對象時如果沒有明確端口,系統會自動分配一個未被使用的端口。

2,明確要發送的具體數據。

3,將數據封裝成了數據包。

4,用socket服務的send方法將數據包發送出去。

5,關閉資源。

--------------------------------------------------------------

import java.net.*;

class? UdpSend{

??? public static void main(String[] args)throws Exception {

//????? 1,建立udpsocket服務。

??????? DatagramSocket ds = new DatagramSocket(8888);//指定發送端口,不指定系統會隨機分配。

//????? 2,明確要發送的具體數據。

??????? String text = "udp傳輸演示 哥們來了";

??????? byte[] buf = text.getBytes();

//????? 3,將數據封裝成了數據包。

??????? DatagramPacket dp = new DatagramPacket(buf,

buf.length,InetAddress.getByName("10.1.31.127"),10000);

//????? 4,用socket服務的send方法將數據包發送出去。

??????? ds.send(dp);

//????? 5,關閉資源。

??????? ds.close();

??? }

}

-------------------------------------------------------------

udp的接收端:

1,創建udp的socket服務,必須要明確一個端口,作用在于,只有發送到這個端口的數據才是這個接收端可以處理的數據。

2,定義數據包,用于存儲接收到數據。

3,通過socket服務的接收方法將收到的數據存儲到數據包中。

4,通過數據包的方法獲取數據包中的具體數據內容,比如ip、端口、數據等等。

5,關閉資源。

-------------------------------------------------------------

class UdpRece {

??? public static void main(String[] args) throws Exception{

//????? 1,創建udpsocket服務。

??????? DatagramSocket ds = new DatagramSocket(10000);

//????? 2,定義數據包,用于存儲接收到數據。先定義字節數組,數據包會把數據存儲到字節數組中。

??????? byte[] buf = new byte[1024];

??????? DatagramPacket dp = new DatagramPacket(buf,buf.length);

//????? 3,通過socket服務的接收方法將收到的數據存儲到數據包中。

??????? ds.receive(dp);//該方法是阻塞式方法。

//????? 4,通過數據包的方法獲取數據包中的具體數據內容,比如ip,端口,數據等等。

??????? String ip = dp.getAddress().getHostAddress();

??????? int port = dp.getPort();

??? ??? String text = new String(dp.getData(),0,dp.getLength());//將字節數組中的有效部分轉成字符串。

??????? System.out.println(ip+":"+port+"--"+text);

//????? 5,關閉資源。

??????? ds.close();

??? }

}

-------------------------------------------------------------

TCP傳輸:兩個端點的建立連接后會有一個傳輸數據的通道,這通道稱為流,而且是建立在網絡基礎上的流,稱之為socket流。該流中既有讀取,也有寫入。

?

tcp的兩個端點:一個是客戶端,一個是服務端。

客戶端:對應的對象,Socket

服務端:對應的對象,ServerSocket

?

TCP客戶端:

1,建立tcp的socket服務,最好明確具體的地址和端口。這個對象在創建時,就已經可以對指定ip和端口進行連接(三次握手)。

2,如果連接成功,就意味著通道建立了,socket流就已經產生了。只要獲取到socket流中的讀取流和寫入流即可,只要通過getInputStream和getOutputStream就可以獲取兩個流對象。

3,關閉資源。

--------------------------------------------------------------

import java.net.*;

import java.io.*;

//需求:客戶端給服務器端發送一個數據。

class? TcpClient{

??? public static void main(String[] args) throws Exception{

??????? Socket s = new Socket("10.1.31.69",10002);

??????? OutputStream out = s.getOutputStream();//獲取了socket流中的輸出流對象。

??????? out.write("tcp演示,哥們又來了!".getBytes());

??????? s.close();

??? }

}

--------------------------------------------------------------

TCP服務端:

1,創建服務端socket服務,并監聽一個端口。

2,服務端為了給客戶端提供服務,獲取客戶端的內容,可以通過accept方法獲取連接過來的客戶端對象。

3,可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。

4,如果通訊結束,關閉資源。注意:要先關客戶端,再關服務端。

--------------------------------------------------------------

class? TcpServer{

??? public static void main(String[] args) throws Exception{

??????? ServerSocket ss = new ServerSocket(10002);//建立服務端的socket服務

??????? Socket s = ss.accept();//獲取客戶端對象

??????? String ip = s.getInetAddress().getHostAddress();

??????? System.out.println(ip+".....connected");

//????? 可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。

??????? InputStream in = s.getInputStream();//讀取客戶端的數據,使用客戶端對象的socket讀取流

??????? byte[] buf = new byte[1024];

??????? int len = in.read(buf);

??????? String text = new String(buf,0,len);

??????? System.out.println(text);

//????? 如果通訊結束,關閉資源。注意:要先關客戶端,在關服務端。

??????? s.close();

??????? ss.close();

??? }

}

-----------------------------------------------------------------------------------------------

反射技術:其實就是動態加載一個指定的類,并獲取該類中的所有的內容。而且將字節碼文件封裝成對象,并將字節碼文件中的內容都封裝成對象,這樣便于操作這些成員。簡單說:反射技術可以對一個類進行解剖。

?

反射的好處:大大的增強了程序的擴展性。

?

反射的基本步驟:

1、獲得Class對象,就是獲取到指定的名稱的字節碼文件對象。

2、實例化對象,獲得類的屬性、方法或構造函數。

3、訪問屬性、調用方法、調用構造函數創建對象。

?

獲取這個Class對象,有三種方式:

1:通過每個對象都具備的方法getClass來獲取。弊端:必須要創建該類對象,才可以調用getClass方法。

2:每一個數據類型(基本數據類型和引用數據類型)都有一個靜態的屬性class。弊端:必須要先明確該類。

??? ?前兩種方式不利于程序的擴展,因為都需要在程序使用具體的類來完成。

3:使用的Class類中的方法,靜態的forName方法

??? ?指定什么類名,就獲取什么類字節碼文件對象,這種方式的擴展性最強,只要將類名的字符串傳入即可。

// 1. 根據給定的類名來獲得? 用于類加載

String classname = "cn.itcast.reflect.Person";// 來自配置文件

Class clazz = Class.forName(classname);// 此對象代表Person.class

// 2. 如果拿到了對象,不知道是什么類型?? 用于獲得對象的類型

Object obj = new Person();

Class clazz1 = obj.getClass();// 獲得對象具體的類型

// 3. 如果是明確地獲得某個類的Class對象? 主要用于傳參

Class clazz2 = Person.class;?

?

反射的用法

1)、需要獲得java類的各個組成部分,首先需要獲得類的Class對象,獲得Class對象的三種方式:

?????? Class.forName(classname)?? 用于做類加載

?????? obj.getClass()?????????????????????? 用于獲得對象的類型

?????? 類名.class???????????????????? ??? 用于獲得指定的類型,傳參用

?

2)、反射類的成員方法:

?????? Class clazz = Person.class;

?????? Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2});

?????? method.invoke();

??????

3)、反射類的構造函數:

?????? Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...})

?????? con.newInstance(params...)

?

4)、反射類的屬性:

?????? Field field = clazz.getField(fieldName);

?????? field.setAccessible(true);

?????? field.setObject(value);

?

獲取了字節碼文件對象后,最終都需要創建指定類的對象:

創建對象的兩種方式(其實就是對象在進行實例化時的初始化方式)

1,調用空參數的構造函數:使用了Class類中的newInstance()方法。

2,調用帶參數的構造函數:先要獲取指定參數列表的構造函數對象,然后通過該構造函數的對象的newInstance(實際參數) 進行對象的初始化。

?

綜上所述,第二種方式,必須要先明確具體的構造函數的參數類型,不便于擴展。所以一般情況下,被反射的類,內部通常都會提供一個公有的空參數的構造函數。

------------------------------------------------------

??? // 如何生成獲取到字節碼文件對象的實例對象。

??????? Class clazz = Class.forName("cn.itcast.bean.Person");//類加載

// 直接獲得指定的類型

?????? clazz = Person.class;

?????? // 根據對象獲得類型

?????? Object obj = new Person("zhangsan", 19);

?????? clazz = obj.getClass();

?

??????? Object obj = clazz.newInstance();//該實例化對象的方法調用就是指定類中的空參數構造函數,給創建對象進行初始化。當指定類中沒有空參數構造函數時,該如何創建該類對象呢?請看method_2();

??? public static void method_2() throws Exception {

??????? Class clazz = Class.forName("cn.itcast.bean.Person");

??????? //既然類中沒有空參數的構造函數,那么只有獲取指定參數的構造函數,用該函數來進行實例化。

??????? //獲取一個帶參數的構造器。

??????? Constructor constructor = clazz.getConstructor(String.class,int.class);

??????? //想要對對象進行初始化,使用構造器的方法newInstance();

??????? Object obj = constructor.newInstance("zhagnsan",30);

??????? //獲取所有構造器。

??????? Constructor[] constructors = clazz.getConstructors();//只包含公共的

??????? constructors = clazz.getDeclaredConstructors();//包含私有的

??????? for(Constructor con : constructors) {

??????????? System.out.println(con);

??????? }

??? }

------------------------------------------------------

反射指定類中的方法:

??? //獲取類中所有的方法。

??? public static void method_1() throws Exception {

??????? Class clazz = Class.forName("cn.itcast.bean.Person");

??????? Method[] methods = clazz.getMethods();//獲取的是該類中的公有方法和父類中的公有方法。

??????? methods = clazz.getDeclaredMethods();//獲取本類中的方法,包含私有方法。

??????? for(Method method : methods) {

??????????? System.out.println(method);

??????? }

??? }

??? //獲取指定方法;

??? public static void method_2() throws Exception {

??????? Class clazz = Class.forName("cn.itcast.bean.Person");

??????? //獲取指定名稱的方法。

??????? Method method = clazz.getMethod("show", int.class,String.class);

??????? //想要運行指定方法,當然是方法對象最清楚,為了讓方法運行,調用方法對象的invoke方法即可,但是方法運行必須要明確所屬的對象和具體的實際參數。

??????? Object obj = clazz.newInstance();

??????? method.invoke(obj, 39,"hehehe");//執行一個方法

??? }

??? //想要運行私有方法。

??? public static void method_3() throws Exception {

??????? Class clazz = Class.forName("cn.itcast.bean.Person");

??????? //想要獲取私有方法。必須用getDeclearMethod();

??????? Method method = clazz.getDeclaredMethod("method", null);

??????? // 私有方法不能直接訪問,因為權限不夠。非要訪問,可以通過暴力的方式。

??????? method.setAccessible(true);//一般很少用,因為私有就是隱藏起來,所以盡量不要訪問。

??? }

??? //反射靜態方法。

??? public static void method_4() throws Exception {

??????? Class clazz = Class.forName("cn.itcast.bean.Person");

??????? Method method = clazz.getMethod("function",null);

??????? method.invoke(null,null);

??? }

------------------------------------------------------------------------------------------------

正則表達式:★★★☆其實是用來操作字符串的一些規則。

好處:正則的出現,對字符串的復雜操作變得更為簡單。

特點:將對字符串操作的代碼用一些符號來表示。只要使用了指定符號,就可以調用底層的代碼對字符串進行操作。符號的出現,簡化了代碼的書寫。

弊端:符號的出現雖然簡化了書寫,但是卻降低了閱讀性。

其實更多是用正則解決字符串操作的問題。

?

組:用小括號標示,每定義一個小括號,就是一個組,而且有自動編號,從1開始。

??? 只要使用組,對應的數字就是使用該組的內容。別忘了,數組要加\\。

??? (aaa(wwww(ccc))(eee))技巧,從左括號開始數即可。有幾個左括號就是幾組。

?

常見操作:

1,匹配:其實用的就是String類中的matches方法。

String reg = "[1-9][0-9]{4,14}";

??? boolean b = qq.matches(reg);//將正則和字符串關聯對字符串進行匹配。

2,切割:其實用的就是String類中的split方法。

3,替換:其實用的就是String類中的replaceAll();

4,獲取:

?? 1),先要將正則表達式編譯成正則對象。使用的是Pattern中靜態方法 compile(regex);

?? 2),通過Pattern對象獲取Matcher對象。

?????? Pattern用于描述正則表達式,可以對正則表達式進行解析。

?????? 而將規則操作字符串,需要從新封裝到匹配器對象Matcher中。

?????? 然后使用Matcher對象的方法來操作字符串。

?????? 如何獲取匹配器對象呢?

?????? 通過Pattern對象中的matcher方法。該方法可以正則規則和字符串想關聯。并返回匹配器對象。

?? 3),使用Matcher對象中的方法即可對字符串進行各種正則操作。

-----------------------------------------------------------------------------------------------

轉載于:https://www.cnblogs.com/JimCalark/p/6922717.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的java 基础知识总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色综合久久久久综合一本到桃花网 | 亚洲性无码av中文字幕 | 日日天日日夜日日摸 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产在线一区二区三区四区五区 | 熟女俱乐部五十路六十路av | 色综合久久中文娱乐网 | 日韩精品无码免费一区二区三区 | 久久精品中文闷骚内射 | 日本一区二区三区免费高清 | 国产精品久久久久久无码 | 色偷偷人人澡人人爽人人模 | 国产色视频一区二区三区 | 国产熟妇另类久久久久 | 色婷婷香蕉在线一区二区 | 免费国产成人高清在线观看网站 | 麻豆蜜桃av蜜臀av色欲av | 国产精品美女久久久 | 综合激情五月综合激情五月激情1 | 欧美 丝袜 自拍 制服 另类 | 免费男性肉肉影院 | 成人免费视频视频在线观看 免费 | 67194成是人免费无码 | 男女性色大片免费网站 | av人摸人人人澡人人超碰下载 | 老熟妇乱子伦牲交视频 | 国产精品va在线播放 | 欧美精品国产综合久久 | 四虎国产精品免费久久 | 国产精品美女久久久久av爽李琼 | 成 人 免费观看网站 | 国产片av国语在线观看 | 人妻中文无码久热丝袜 | 成人无码精品一区二区三区 | 无码精品国产va在线观看dvd | 久久五月精品中文字幕 | 国内精品人妻无码久久久影院蜜桃 | 成人影院yy111111在线观看 | 欧美人与善在线com | 亚洲国产精品无码久久久久高潮 | 天堂亚洲免费视频 | 亚洲人亚洲人成电影网站色 | 欧美自拍另类欧美综合图片区 | 亚洲成a人片在线观看日本 | 国产无遮挡又黄又爽免费视频 | 荡女精品导航 | 四虎国产精品一区二区 | 老太婆性杂交欧美肥老太 | 少妇高潮喷潮久久久影院 | 国产精品久久久久久无码 | 99久久精品国产一区二区蜜芽 | 亚洲a无码综合a国产av中文 | 免费观看激色视频网站 | 午夜无码人妻av大片色欲 | 天天拍夜夜添久久精品大 | 中国女人内谢69xxxxxa片 | 免费国产成人高清在线观看网站 | 国产九九九九九九九a片 | 久久综合色之久久综合 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕无线码免费人妻 | 久久久精品国产sm最大网站 | av人摸人人人澡人人超碰下载 | 大胆欧美熟妇xx | 一区二区传媒有限公司 | 老熟妇仑乱视频一区二区 | 无码av岛国片在线播放 | 欧美成人免费全部网站 | 高潮毛片无遮挡高清免费 | 国产欧美熟妇另类久久久 | 精品无码国产自产拍在线观看蜜 | 亚洲热妇无码av在线播放 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲日韩av一区二区三区四区 | 久久精品国产一区二区三区肥胖 | 2019午夜福利不卡片在线 | 九九久久精品国产免费看小说 | 国内揄拍国内精品少妇国语 | 中文字幕日韩精品一区二区三区 | 亚洲人成网站色7799 | 少妇性l交大片欧洲热妇乱xxx | 99久久精品国产一区二区蜜芽 | 久久亚洲a片com人成 | 人妻少妇精品无码专区二区 | 欧美自拍另类欧美综合图片区 | 日本一区二区更新不卡 | 欧美丰满老熟妇xxxxx性 | 中文字幕无码人妻少妇免费 | 亚洲国产欧美在线成人 | 国产精品美女久久久网av | 在线亚洲高清揄拍自拍一品区 | 一二三四社区在线中文视频 | 国产精品久久久久无码av色戒 | 精品久久久无码中文字幕 | 亚洲日韩乱码中文无码蜜桃臀网站 | 天天躁日日躁狠狠躁免费麻豆 | 丁香啪啪综合成人亚洲 | 亚洲日本va午夜在线电影 | 国产精品成人av在线观看 | 久久久av男人的天堂 | 成人精品一区二区三区中文字幕 | 亚洲中文字幕无码中文字在线 | 国产人妻久久精品二区三区老狼 | 欧美肥老太牲交大战 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美丰满老熟妇xxxxx性 | 乱人伦人妻中文字幕无码 | 日本熟妇乱子伦xxxx | 好男人社区资源 | 成人女人看片免费视频放人 | 18黄暴禁片在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 欧美丰满熟妇xxxx | √天堂资源地址中文在线 | 国产精品a成v人在线播放 | 野外少妇愉情中文字幕 | 2020久久超碰国产精品最新 | 国产精品久久国产精品99 | а√天堂www在线天堂小说 | 国产无套粉嫩白浆在线 | 曰韩无码二三区中文字幕 | 波多野结衣aⅴ在线 | 无码av中文字幕免费放 | 免费男性肉肉影院 | 亚洲精品一区二区三区在线 | 国精产品一区二区三区 | 亚洲中文字幕无码中文字在线 | 成人无码视频在线观看网站 | 狠狠色丁香久久婷婷综合五月 | 国产办公室秘书无码精品99 | 国产精品人人妻人人爽 | 窝窝午夜理论片影院 | 少妇性l交大片欧洲热妇乱xxx | 两性色午夜免费视频 | 久久国内精品自在自线 | 国内揄拍国内精品少妇国语 | 婷婷丁香六月激情综合啪 | 成人影院yy111111在线观看 | 国产精品久久久久久亚洲毛片 | 黑人大群体交免费视频 | 国产精品多人p群无码 | 日本精品高清一区二区 | 国产精品毛片一区二区 | 久久精品一区二区三区四区 | 色妞www精品免费视频 | 女人和拘做爰正片视频 | 免费视频欧美无人区码 | 最新国产麻豆aⅴ精品无码 | 国产内射爽爽大片视频社区在线 | 日欧一片内射va在线影院 | 狠狠色丁香久久婷婷综合五月 | 动漫av网站免费观看 | 亚洲欧洲日本无在线码 | 亚洲欧美日韩综合久久久 | 无码人妻丰满熟妇区毛片18 | 一本精品99久久精品77 | 亚洲精品一区国产 | 欧美国产日韩久久mv | 国产免费久久精品国产传媒 | 国产精品毛片一区二区 | 亚洲人成网站色7799 | 九一九色国产 | 国产人妻大战黑人第1集 | 欧美三级不卡在线观看 | 国产午夜福利100集发布 | 九一九色国产 | 人人澡人人透人人爽 | 亚洲va欧美va天堂v国产综合 | 好爽又高潮了毛片免费下载 | 久久精品女人天堂av免费观看 | 午夜理论片yy44880影院 | 亚洲经典千人经典日产 | 久久久精品人妻久久影视 | 高潮毛片无遮挡高清免费视频 | 久久久无码中文字幕久... | 巨爆乳无码视频在线观看 | 中文字幕乱码中文乱码51精品 | 最近中文2019字幕第二页 | 大胆欧美熟妇xx | 装睡被陌生人摸出水好爽 | 欧洲欧美人成视频在线 | 国产成人久久精品流白浆 | 女人被爽到呻吟gif动态图视看 | 久久精品无码一区二区三区 | 欧美第一黄网免费网站 | 国产精品美女久久久 | 67194成是人免费无码 | 精品偷拍一区二区三区在线看 | 久久精品国产99久久6动漫 | 精品少妇爆乳无码av无码专区 | 国产亚洲视频中文字幕97精品 | 99视频精品全部免费免费观看 | 无码人妻丰满熟妇区毛片18 | 2020久久香蕉国产线看观看 | 2020久久超碰国产精品最新 | 丰满妇女强制高潮18xxxx | 又大又硬又爽免费视频 | 国产成人无码一二三区视频 | 夜夜高潮次次欢爽av女 | 国产亚洲精品久久久闺蜜 | 久久无码中文字幕免费影院蜜桃 | 一本精品99久久精品77 | 国模大胆一区二区三区 | 色综合久久久久综合一本到桃花网 | 两性色午夜视频免费播放 | 无码帝国www无码专区色综合 | 国产av一区二区三区最新精品 | 55夜色66夜色国产精品视频 | 任你躁国产自任一区二区三区 | 狂野欧美性猛交免费视频 | 欧美国产日韩亚洲中文 | 亚拍精品一区二区三区探花 | 久久精品一区二区三区四区 | а√资源新版在线天堂 | 色婷婷久久一区二区三区麻豆 | 精品一二三区久久aaa片 | 乱人伦中文视频在线观看 | 男人的天堂2018无码 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美黑人性暴力猛交喷水 | 国产成人综合色在线观看网站 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲啪av永久无码精品放毛片 | 国产色在线 | 国产 | 国产av一区二区精品久久凹凸 | 亚洲综合无码久久精品综合 | 曰本女人与公拘交酡免费视频 | 夜夜高潮次次欢爽av女 | 暴力强奷在线播放无码 | 国产精品久久久久7777 | 亚洲a无码综合a国产av中文 | 国产黑色丝袜在线播放 | 人人澡人摸人人添 | 99久久久国产精品无码免费 | 老熟女乱子伦 | 午夜肉伦伦影院 | 性生交大片免费看女人按摩摩 | 国产亚av手机在线观看 | 国产性生大片免费观看性 | 欧美日本免费一区二区三区 | 98国产精品综合一区二区三区 | 色婷婷欧美在线播放内射 | 亚洲a无码综合a国产av中文 | 奇米影视7777久久精品 | 国产区女主播在线观看 | 99久久婷婷国产综合精品青草免费 | 国产亚洲日韩欧美另类第八页 | 久久99热只有频精品8 | 国产人妻久久精品二区三区老狼 | 奇米影视888欧美在线观看 | 久久久精品成人免费观看 | 波多野42部无码喷潮在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 麻花豆传媒剧国产免费mv在线 | 一本大道伊人av久久综合 | 欧美xxxx黑人又粗又长 | 国产精品va在线播放 | 人妻天天爽夜夜爽一区二区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产成人无码a区在线观看视频app | 捆绑白丝粉色jk震动捧喷白浆 | 色妞www精品免费视频 | 国产一精品一av一免费 | 国产成人无码a区在线观看视频app | 一本色道婷婷久久欧美 | 国内老熟妇对白xxxxhd | 久久国产精品精品国产色婷婷 | 国产又粗又硬又大爽黄老大爷视 | 亚洲性无码av中文字幕 | 人人妻人人澡人人爽欧美一区九九 | 亚洲综合无码久久精品综合 | 国产后入清纯学生妹 | 天干天干啦夜天干天2017 | 国产熟妇高潮叫床视频播放 | 成人欧美一区二区三区黑人免费 | 欧美性猛交xxxx富婆 | 久久久亚洲欧洲日产国码αv | 久久人妻内射无码一区三区 | 爆乳一区二区三区无码 | 日韩无套无码精品 | 精品乱码久久久久久久 | 欧美三级a做爰在线观看 | 永久免费观看美女裸体的网站 | 国产精品久久久久7777 | 无遮挡国产高潮视频免费观看 | 国产精品无码成人午夜电影 | 久久综合给合久久狠狠狠97色 | 偷窥日本少妇撒尿chinese | 中文字幕av日韩精品一区二区 | 日产精品99久久久久久 | 婷婷色婷婷开心五月四房播播 | 久久成人a毛片免费观看网站 | 国产亚洲tv在线观看 | 亚洲欧美日韩国产精品一区二区 | 大地资源网第二页免费观看 | 中文字幕人成乱码熟女app | 骚片av蜜桃精品一区 | 丰腴饱满的极品熟妇 | 中文字幕乱码亚洲无线三区 | 波多野结衣aⅴ在线 | 色婷婷av一区二区三区之红樱桃 | 无码人中文字幕 | 荫蒂添的好舒服视频囗交 | 国产97人人超碰caoprom | 欧美成人高清在线播放 | 国产在线aaa片一区二区99 | 欧美人与善在线com | 一本久久伊人热热精品中文字幕 | 国产性生大片免费观看性 | 欧美变态另类xxxx | 国色天香社区在线视频 | 无码人中文字幕 | 狠狠色欧美亚洲狠狠色www | 久久99精品国产麻豆蜜芽 | 久久国产36精品色熟妇 | 精品久久久久久亚洲精品 | 亚洲中文字幕成人无码 | 欧美人与物videos另类 | 男女爱爱好爽视频免费看 | 国产午夜无码视频在线观看 | 欧美精品一区二区精品久久 | 亚洲国产精品久久人人爱 | 少妇人妻av毛片在线看 | 无码国产乱人伦偷精品视频 | 强伦人妻一区二区三区视频18 | 日日碰狠狠丁香久燥 | 成人亚洲精品久久久久 | 久久人妻内射无码一区三区 | 成人无码精品一区二区三区 | 美女毛片一区二区三区四区 | 日韩精品成人一区二区三区 | 日韩av无码中文无码电影 | 一本大道伊人av久久综合 | 欧美人妻一区二区三区 | 小鲜肉自慰网站xnxx | 成人免费无码大片a毛片 | 国产精品无码一区二区桃花视频 | 久久国产精品二国产精品 | 亚洲人交乣女bbw | 沈阳熟女露脸对白视频 | 色偷偷人人澡人人爽人人模 | 内射爽无广熟女亚洲 | 国产精华av午夜在线观看 | 领导边摸边吃奶边做爽在线观看 | 乱中年女人伦av三区 | 国产农村乱对白刺激视频 | 久久久av男人的天堂 | 伦伦影院午夜理论片 | 国产无套粉嫩白浆在线 | 久久久久久久久888 | 波多野结衣av一区二区全免费观看 | 国产特级毛片aaaaaaa高清 | 久久天天躁狠狠躁夜夜免费观看 | 伊人久久大香线焦av综合影院 | 狠狠亚洲超碰狼人久久 | 国精品人妻无码一区二区三区蜜柚 | 精品国产av色一区二区深夜久久 | 国产亚洲精品久久久久久大师 | 午夜性刺激在线视频免费 | 日韩精品无码一本二本三本色 | 亚洲综合精品香蕉久久网 | 午夜熟女插插xx免费视频 | 牲欲强的熟妇农村老妇女视频 | 小泽玛莉亚一区二区视频在线 | 色一情一乱一伦一区二区三欧美 | 麻豆人妻少妇精品无码专区 | 国产精品无码成人午夜电影 | 国产情侣作爱视频免费观看 | 影音先锋中文字幕无码 | 亚洲高清偷拍一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 亚洲国产精品美女久久久久 | 无套内谢的新婚少妇国语播放 | 久久 国产 尿 小便 嘘嘘 | 国产亚洲欧美在线专区 | 日本精品人妻无码免费大全 | 撕开奶罩揉吮奶头视频 | a片免费视频在线观看 | 欧美午夜特黄aaaaaa片 | 捆绑白丝粉色jk震动捧喷白浆 | 最新版天堂资源中文官网 | 国产在线精品一区二区三区直播 | 亚洲午夜久久久影院 | 成人三级无码视频在线观看 | 性生交大片免费看女人按摩摩 | 亚洲精品欧美二区三区中文字幕 | 精品久久8x国产免费观看 | 国产9 9在线 | 中文 | 东京热无码av男人的天堂 | 亚洲欧美色中文字幕在线 | 亚洲爆乳无码专区 | 国产精品美女久久久网av | 无码精品国产va在线观看dvd | 六月丁香婷婷色狠狠久久 | 无码av免费一区二区三区试看 | 人人妻人人澡人人爽欧美一区九九 | 嫩b人妻精品一区二区三区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 少妇的肉体aa片免费 | 亚洲va中文字幕无码久久不卡 | 在线播放亚洲第一字幕 | 1000部啪啪未满十八勿入下载 | 久久精品女人的天堂av | 高清无码午夜福利视频 | 在线天堂新版最新版在线8 | 亚洲欧美精品伊人久久 | 中文字幕日韩精品一区二区三区 | 人人澡人摸人人添 | 荫蒂被男人添的好舒服爽免费视频 | 久久人人爽人人爽人人片ⅴ | 国产激情综合五月久久 | 精品国产一区二区三区av 性色 | 亚洲伊人久久精品影院 | 人人超人人超碰超国产 | 乌克兰少妇xxxx做受 | 国产精品无套呻吟在线 | 色妞www精品免费视频 | 亚洲日韩av片在线观看 | 免费观看的无遮挡av | 亚洲毛片av日韩av无码 | 精品久久久久香蕉网 | 久久亚洲国产成人精品性色 | 亚洲成av人在线观看网址 | 97无码免费人妻超级碰碰夜夜 | 色婷婷欧美在线播放内射 | 天堂在线观看www | 人人妻人人澡人人爽人人精品 | 97精品国产97久久久久久免费 | 性欧美熟妇videofreesex | 国产特级毛片aaaaaa高潮流水 | 欧美性生交活xxxxxdddd | 麻豆国产丝袜白领秘书在线观看 | 久久精品国产一区二区三区肥胖 | 老子影院午夜精品无码 | 久久无码中文字幕免费影院蜜桃 | 国产农村妇女高潮大叫 | 亚洲日韩精品欧美一区二区 | 亚洲欧美综合区丁香五月小说 | 欧美阿v高清资源不卡在线播放 | 国产口爆吞精在线视频 | 亚洲成av人片天堂网无码】 | 亚洲成av人影院在线观看 | 综合激情五月综合激情五月激情1 | 国产一区二区不卡老阿姨 | 一区二区传媒有限公司 | 国产亚洲精品久久久久久久久动漫 | 少妇性l交大片 | 在线成人www免费观看视频 | 久久久久人妻一区精品色欧美 | 久久久www成人免费毛片 | 国产成人无码一二三区视频 | 国产精品福利视频导航 | 正在播放老肥熟妇露脸 | 亚洲国产成人av在线观看 | 久久午夜无码鲁丝片 | 免费无码肉片在线观看 | 色婷婷香蕉在线一区二区 | 国产区女主播在线观看 | 18禁黄网站男男禁片免费观看 | 超碰97人人射妻 | 熟妇人妻无码xxx视频 | 亚洲日韩av一区二区三区中文 | 中文字幕乱码中文乱码51精品 | 人人妻人人澡人人爽欧美一区 | 青春草在线视频免费观看 | 精品欧洲av无码一区二区三区 | 免费中文字幕日韩欧美 | 亚洲综合在线一区二区三区 | 天海翼激烈高潮到腰振不止 | 色婷婷欧美在线播放内射 | 在线观看国产午夜福利片 | 九九在线中文字幕无码 | 又粗又大又硬又长又爽 | 亚洲精品久久久久avwww潮水 | a在线观看免费网站大全 | 少妇被黑人到高潮喷出白浆 | 人妻aⅴ无码一区二区三区 | 高中生自慰www网站 | 欧洲欧美人成视频在线 | 荫蒂添的好舒服视频囗交 | 亚洲欧美日韩综合久久久 | 美女极度色诱视频国产 | 国产午夜福利100集发布 | 国产精品嫩草久久久久 | 精品国产一区二区三区四区在线看 | 狠狠噜狠狠狠狠丁香五月 | 成熟人妻av无码专区 | 精品人妻人人做人人爽夜夜爽 | 扒开双腿疯狂进出爽爽爽视频 | 亚洲第一网站男人都懂 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲中文无码av永久不收费 | 国产午夜福利亚洲第一 | 又大又紧又粉嫩18p少妇 | 伊人久久大香线蕉av一区二区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 18黄暴禁片在线观看 | 给我免费的视频在线观看 | 性色欲网站人妻丰满中文久久不卡 | 国产亚洲日韩欧美另类第八页 | 欧美变态另类xxxx | 欧美性生交活xxxxxdddd | 久久久国产精品无码免费专区 | 色婷婷av一区二区三区之红樱桃 | 在线成人www免费观看视频 | 国产熟女一区二区三区四区五区 | 99久久亚洲精品无码毛片 | 无码国产乱人伦偷精品视频 | 性欧美牲交xxxxx视频 | 99riav国产精品视频 | 国产艳妇av在线观看果冻传媒 | 日本精品高清一区二区 | 狠狠综合久久久久综合网 | 亚洲成av人片天堂网无码】 | 夜夜影院未满十八勿进 | 午夜精品一区二区三区的区别 | 真人与拘做受免费视频一 | 中文字幕中文有码在线 | 伊人久久大香线蕉av一区二区 | 狂野欧美激情性xxxx | 欧洲精品码一区二区三区免费看 | 国产欧美亚洲精品a | аⅴ资源天堂资源库在线 | 欧美人与禽猛交狂配 | 国产精品永久免费视频 | 亚洲精品国产第一综合99久久 | 亚洲成av人在线观看网址 | 成人免费视频一区二区 | 一本精品99久久精品77 | 免费乱码人妻系列无码专区 | 成 人 网 站国产免费观看 | 在线精品亚洲一区二区 | 伊人色综合久久天天小片 | 无码av免费一区二区三区试看 | 亚洲色偷偷男人的天堂 | 台湾无码一区二区 | 亚洲熟妇色xxxxx欧美老妇y | 久久精品女人天堂av免费观看 | 国产成人综合在线女婷五月99播放 | 欧美性生交活xxxxxdddd | 国精产品一品二品国精品69xx | 精品国产福利一区二区 | 又粗又大又硬又长又爽 | 成年美女黄网站色大免费视频 | 在线天堂新版最新版在线8 | 久久婷婷五月综合色国产香蕉 | 国产两女互慰高潮视频在线观看 | 青青青手机频在线观看 | 成人性做爰aaa片免费看不忠 | 丁香啪啪综合成人亚洲 | 少妇厨房愉情理9仑片视频 | 一本精品99久久精品77 | 久久精品中文字幕一区 | 女人高潮内射99精品 | 老太婆性杂交欧美肥老太 | 麻豆精品国产精华精华液好用吗 | 99麻豆久久久国产精品免费 | 国产亚洲欧美日韩亚洲中文色 | 国产精品福利视频导航 | 国产suv精品一区二区五 | 亚洲自偷自偷在线制服 | 一本久道久久综合狠狠爱 | 久久天天躁狠狠躁夜夜免费观看 | 久久久久久亚洲精品a片成人 | 最近免费中文字幕中文高清百度 | 国产精品高潮呻吟av久久4虎 | 人人妻人人澡人人爽欧美一区 | 国产亚洲欧美日韩亚洲中文色 | 天堂久久天堂av色综合 | 亚洲人亚洲人成电影网站色 | 欧美人与动性行为视频 | 在线播放无码字幕亚洲 | 国产色xx群视频射精 | 福利一区二区三区视频在线观看 | 一本精品99久久精品77 | 狠狠cao日日穞夜夜穞av | 国产超级va在线观看视频 | 久久久婷婷五月亚洲97号色 | 成人无码精品一区二区三区 | 性欧美videos高清精品 | 中文字幕无码热在线视频 | 色五月丁香五月综合五月 | 丰满肥臀大屁股熟妇激情视频 | 国产午夜亚洲精品不卡下载 | 亚洲精品国产精品乱码视色 | 性欧美牲交在线视频 | 国产又粗又硬又大爽黄老大爷视 | 国产尤物精品视频 | 少妇太爽了在线观看 | 鲁大师影院在线观看 | 国产精品资源一区二区 | 亚洲精品国偷拍自产在线麻豆 | 女人色极品影院 | 婷婷综合久久中文字幕蜜桃三电影 | 小泽玛莉亚一区二区视频在线 | 狠狠噜狠狠狠狠丁香五月 | 婷婷五月综合缴情在线视频 | 丰满人妻精品国产99aⅴ | 宝宝好涨水快流出来免费视频 | 丰满少妇人妻久久久久久 | 久久亚洲a片com人成 | 国产成人久久精品流白浆 | 精品成人av一区二区三区 | 夜先锋av资源网站 | av在线亚洲欧洲日产一区二区 | 澳门永久av免费网站 | 日韩精品a片一区二区三区妖精 | 亚洲の无码国产の无码步美 | a片在线免费观看 | 精品久久久久久亚洲精品 | 久青草影院在线观看国产 | 男女下面进入的视频免费午夜 | 国产网红无码精品视频 | 免费无码av一区二区 | 国产精品无码一区二区三区不卡 | aⅴ亚洲 日韩 色 图网站 播放 | 理论片87福利理论电影 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲日韩av片在线观看 | 老子影院午夜精品无码 | 97se亚洲精品一区 | 精品一区二区不卡无码av | 狠狠cao日日穞夜夜穞av | 亚洲精品国产第一综合99久久 | 永久免费精品精品永久-夜色 | 精品国产青草久久久久福利 | 麻花豆传媒剧国产免费mv在线 | 亚洲综合在线一区二区三区 | 精品国产一区二区三区四区在线看 | 国产精品久久久久久亚洲毛片 | 亚洲春色在线视频 | 99精品国产综合久久久久五月天 | 亚洲色大成网站www | 131美女爱做视频 | 欧美日韩人成综合在线播放 | 性色欲网站人妻丰满中文久久不卡 | 欧美人与物videos另类 | 色综合久久中文娱乐网 | 国产免费久久精品国产传媒 | 国产精品-区区久久久狼 | 色偷偷人人澡人人爽人人模 | 亚洲无人区午夜福利码高清完整版 | 亚洲一区二区三区偷拍女厕 | 亚洲日韩av片在线观看 | 国产精品久久久久7777 | 久久久久免费精品国产 | 97夜夜澡人人双人人人喊 | 亚洲va中文字幕无码久久不卡 | 亚洲精品一区二区三区在线观看 | 成人免费视频视频在线观看 免费 | 亚洲国产高清在线观看视频 | 乱码av麻豆丝袜熟女系列 | 亚洲熟妇色xxxxx欧美老妇 | 午夜无码区在线观看 | 大肉大捧一进一出好爽视频 | 亚洲人成网站免费播放 | 日日摸日日碰夜夜爽av | 精品久久综合1区2区3区激情 | 色老头在线一区二区三区 | 男人扒开女人内裤强吻桶进去 | 国产真人无遮挡作爱免费视频 | 性做久久久久久久免费看 | 亚洲欧美中文字幕5发布 | 国产真人无遮挡作爱免费视频 | av在线亚洲欧洲日产一区二区 | 人人爽人人澡人人高潮 | 麻豆av传媒蜜桃天美传媒 | 日韩精品久久久肉伦网站 | 无码av最新清无码专区吞精 | 无码人妻少妇伦在线电影 | 天堂一区人妻无码 | 精品一区二区三区无码免费视频 | 欧美精品在线观看 | 欧美喷潮久久久xxxxx | 久久综合给久久狠狠97色 | 欧美精品无码一区二区三区 | 99久久99久久免费精品蜜桃 | 亚洲国产精品一区二区第一页 | 国产一区二区三区影院 | 日本一区二区更新不卡 | 欧美丰满熟妇xxxx性ppx人交 | 天下第一社区视频www日本 | 亚洲啪av永久无码精品放毛片 | 西西人体www44rt大胆高清 | 欧美亚洲日韩国产人成在线播放 | 成年女人永久免费看片 | 风流少妇按摩来高潮 | 日日摸夜夜摸狠狠摸婷婷 | 狠狠综合久久久久综合网 | 国产成人av免费观看 | 夫妻免费无码v看片 | 欧美兽交xxxx×视频 | 美女黄网站人色视频免费国产 | 欧美freesex黑人又粗又大 | 99国产精品白浆在线观看免费 | 国产在线精品一区二区高清不卡 | 欧美人与禽zoz0性伦交 | 国产午夜视频在线观看 | 熟女少妇在线视频播放 | 日欧一片内射va在线影院 | 最近的中文字幕在线看视频 | 丝袜 中出 制服 人妻 美腿 | 亚洲 另类 在线 欧美 制服 | 日韩人妻无码一区二区三区久久99 | 欧美高清在线精品一区 | 亚洲成色在线综合网站 | 成人欧美一区二区三区黑人免费 | 亚洲中文字幕乱码av波多ji | 国产无遮挡又黄又爽又色 | 亚洲精品一区二区三区在线 | 久久久久免费看成人影片 | 国产真实伦对白全集 | 欧美国产日韩久久mv | 亚洲狠狠婷婷综合久久 | 日日碰狠狠丁香久燥 | 日本护士毛茸茸高潮 | 亚洲小说春色综合另类 | 午夜福利试看120秒体验区 | 精品国产一区二区三区av 性色 | 人人妻人人澡人人爽欧美精品 | 婷婷六月久久综合丁香 | 俄罗斯老熟妇色xxxx | 国产精品久久久午夜夜伦鲁鲁 | 中文字幕亚洲情99在线 | 又大又紧又粉嫩18p少妇 | 欧洲精品码一区二区三区免费看 | 无套内谢老熟女 | 亚洲精品一区三区三区在线观看 | 兔费看少妇性l交大片免费 | 日本丰满护士爆乳xxxx | 久久综合网欧美色妞网 | 国产精华av午夜在线观看 | 永久黄网站色视频免费直播 | 色综合久久88色综合天天 | 精品人妻中文字幕有码在线 | 国产精品无套呻吟在线 | 亚洲区小说区激情区图片区 | 久久久无码中文字幕久... | 亚洲欧洲日本综合aⅴ在线 | a国产一区二区免费入口 | 精品少妇爆乳无码av无码专区 | 日韩精品无码免费一区二区三区 | 东京热男人av天堂 | 国产真实乱对白精彩久久 | 精品国产一区二区三区av 性色 | 日本免费一区二区三区最新 | 国产suv精品一区二区五 | 日韩无套无码精品 | 久久婷婷五月综合色国产香蕉 | 久久国产自偷自偷免费一区调 | 午夜福利电影 | 国产成人精品久久亚洲高清不卡 | 国产av人人夜夜澡人人爽麻豆 | 西西人体www44rt大胆高清 | 黑人粗大猛烈进出高潮视频 | 欧美日韩视频无码一区二区三 | 亚洲中文字幕成人无码 | 亚洲第一网站男人都懂 | 天堂久久天堂av色综合 | 天堂久久天堂av色综合 | 色欲人妻aaaaaaa无码 | 又大又紧又粉嫩18p少妇 | 国产猛烈高潮尖叫视频免费 | 欧美人与牲动交xxxx | 色综合久久88色综合天天 | 久久久久亚洲精品中文字幕 | 久久午夜无码鲁丝片 | 国产一精品一av一免费 | 131美女爱做视频 | 国产精品无码永久免费888 | 天天摸天天透天天添 | 亚洲а∨天堂久久精品2021 | 日韩精品a片一区二区三区妖精 | 中文字幕 亚洲精品 第1页 | 黑人大群体交免费视频 | 无码吃奶揉捏奶头高潮视频 | 国产尤物精品视频 | 国产精品久久国产精品99 | 亚洲欧美综合区丁香五月小说 | 欧洲熟妇色 欧美 | 亚洲国产精品久久久天堂 | 老司机亚洲精品影院无码 | 永久免费精品精品永久-夜色 | 欧美一区二区三区 | 国产人妻精品一区二区三区 | 国产精品第一区揄拍无码 | 中国女人内谢69xxxx | 日韩人妻系列无码专区 | 国产疯狂伦交大片 | 欧美国产亚洲日韩在线二区 | 亚洲男人av天堂午夜在 | 377p欧洲日本亚洲大胆 | 人妻体内射精一区二区三四 | 秋霞成人午夜鲁丝一区二区三区 | 免费人成在线视频无码 | 久久综合九色综合欧美狠狠 | 亚洲无人区午夜福利码高清完整版 | 色欲综合久久中文字幕网 | 内射巨臀欧美在线视频 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲欧美综合区丁香五月小说 | 四虎4hu永久免费 | 久久久精品欧美一区二区免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 在线а√天堂中文官网 | 久久久久久国产精品无码下载 | 亚洲综合久久一区二区 | 色婷婷av一区二区三区之红樱桃 | 伊人久久大香线焦av综合影院 | 成人精品一区二区三区中文字幕 | 无码人妻黑人中文字幕 | 日韩少妇内射免费播放 | 牛和人交xxxx欧美 | 日日夜夜撸啊撸 | 99re在线播放 | 精品无码一区二区三区爱欲 | 亚洲乱码国产乱码精品精 | 天下第一社区视频www日本 | 日韩亚洲欧美精品综合 | 特黄特色大片免费播放器图片 | 免费乱码人妻系列无码专区 | 国产成人精品必看 | 无码午夜成人1000部免费视频 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 无人区乱码一区二区三区 | 国产熟女一区二区三区四区五区 | 日日夜夜撸啊撸 | 日韩欧美群交p片內射中文 | 在线播放亚洲第一字幕 | 日韩欧美中文字幕公布 | 极品尤物被啪到呻吟喷水 | 亚洲日本va中文字幕 | 老子影院午夜精品无码 | 人妻少妇精品无码专区二区 | 蜜桃视频插满18在线观看 | 国产欧美熟妇另类久久久 | 成年女人永久免费看片 | 夜夜影院未满十八勿进 | 疯狂三人交性欧美 | 亚洲色大成网站www | 成熟妇人a片免费看网站 | 亚洲熟悉妇女xxx妇女av | 国产av一区二区三区最新精品 | 亚无码乱人伦一区二区 | 人妻中文无码久热丝袜 | 一本精品99久久精品77 | 巨爆乳无码视频在线观看 | 国产内射老熟女aaaa | 久久久久久久久蜜桃 | 国产无av码在线观看 | 99er热精品视频 | 99精品国产综合久久久久五月天 | 久久99热只有频精品8 | 成熟人妻av无码专区 | yw尤物av无码国产在线观看 | 免费观看激色视频网站 | 中文字幕无线码免费人妻 | 一个人看的www免费视频在线观看 | 麻豆国产丝袜白领秘书在线观看 | 精品 日韩 国产 欧美 视频 | 国产精品成人av在线观看 | 性欧美大战久久久久久久 | 少妇人妻偷人精品无码视频 | 中文字幕 亚洲精品 第1页 | 少妇激情av一区二区 | 亚洲gv猛男gv无码男同 | 国内精品九九久久久精品 | 香蕉久久久久久av成人 | 亚洲中文无码av永久不收费 | 亚洲s码欧洲m码国产av | 狠狠色噜噜狠狠狠狠7777米奇 | 99久久久国产精品无码免费 | 99riav国产精品视频 | 欧美日韩一区二区综合 | 日本乱偷人妻中文字幕 | 亚洲精品一区国产 | 女人被男人躁得好爽免费视频 | 性欧美videos高清精品 | 一本色道久久综合亚洲精品不卡 | 精品日本一区二区三区在线观看 | 精品偷自拍另类在线观看 | 四虎国产精品一区二区 | 亚洲日本一区二区三区在线 | 久久久久久国产精品无码下载 | 免费视频欧美无人区码 | 国产色在线 | 国产 | 久久精品国产精品国产精品污 | 午夜精品久久久久久久久 | 综合网日日天干夜夜久久 | 国产午夜亚洲精品不卡 | 大屁股大乳丰满人妻 | 无码吃奶揉捏奶头高潮视频 | 亚洲最大成人网站 | 永久免费观看美女裸体的网站 | 一个人看的www免费视频在线观看 | 中文无码精品a∨在线观看不卡 | 99久久精品无码一区二区毛片 | 中文字幕无码视频专区 | 88国产精品欧美一区二区三区 | 日本饥渴人妻欲求不满 | 色婷婷久久一区二区三区麻豆 | 97久久精品无码一区二区 | 55夜色66夜色国产精品视频 | 欧美性生交xxxxx久久久 | 日本免费一区二区三区最新 | 一本大道伊人av久久综合 | 日本爽爽爽爽爽爽在线观看免 | 亚洲精品久久久久avwww潮水 | 国产欧美亚洲精品a | 精品厕所偷拍各类美女tp嘘嘘 | 色五月丁香五月综合五月 | 内射爽无广熟女亚洲 | 中文字幕乱码中文乱码51精品 | 亚洲精品无码人妻无码 | 国精品人妻无码一区二区三区蜜柚 | 377p欧洲日本亚洲大胆 | 狂野欧美性猛xxxx乱大交 | av无码电影一区二区三区 | 日本又色又爽又黄的a片18禁 | 真人与拘做受免费视频一 | 久久精品人人做人人综合试看 | 欧美成人高清在线播放 | 国产免费久久精品国产传媒 | 成人性做爰aaa片免费看 | 在线播放无码字幕亚洲 | 国产精品对白交换视频 | 欧美激情一区二区三区成人 | 日本丰满熟妇videos | 国产欧美亚洲精品a | 亚洲精品无码人妻无码 | 国产成人精品优优av | 亚洲精品国产a久久久久久 | 国产va免费精品观看 | 国产一区二区三区日韩精品 | 无码任你躁久久久久久久 | 免费国产黄网站在线观看 | 国内少妇偷人精品视频免费 | 精品少妇爆乳无码av无码专区 | 夜夜影院未满十八勿进 | 日本一区二区更新不卡 | 欧美日韩视频无码一区二区三 | 亚洲日本一区二区三区在线 | 妺妺窝人体色www婷婷 | 激情爆乳一区二区三区 | 久久久精品人妻久久影视 | 亚洲a无码综合a国产av中文 | 亚洲国产精华液网站w | 中文字幕中文有码在线 | 精品久久久无码人妻字幂 | 免费观看激色视频网站 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 欧美日韩精品 | 精品国产青草久久久久福利 | 久久精品丝袜高跟鞋 | 国产精品怡红院永久免费 | 99在线 | 亚洲 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲国产精品一区二区美利坚 | 国产亲子乱弄免费视频 | 日本xxxx色视频在线观看免费 | 伊人久久大香线蕉av一区二区 | 成人无码精品一区二区三区 | 日韩精品无码一区二区中文字幕 | 伊人色综合久久天天小片 | 强开小婷嫩苞又嫩又紧视频 | 国产精品免费大片 | 中文字幕无码视频专区 | 亚洲爆乳精品无码一区二区三区 | 久久无码中文字幕免费影院蜜桃 | 99re在线播放 | 天天躁日日躁狠狠躁免费麻豆 | 成年美女黄网站色大免费视频 | 国产高清不卡无码视频 | 国产亚洲人成a在线v网站 | 国产激情精品一区二区三区 | 国产精品亚洲五月天高清 | 欧美丰满熟妇xxxx性ppx人交 | 天堂亚洲2017在线观看 | 帮老师解开蕾丝奶罩吸乳网站 | 无码一区二区三区在线观看 | 午夜时刻免费入口 | 午夜免费福利小电影 | 欧美性猛交内射兽交老熟妇 | 国产麻豆精品一区二区三区v视界 | 欧美日韩亚洲国产精品 | 国产极品美女高潮无套在线观看 | 国产成人无码a区在线观看视频app | 久久无码中文字幕免费影院蜜桃 | 亚洲男人av天堂午夜在 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚无码乱人伦一区二区 | 亚洲人交乣女bbw | аⅴ资源天堂资源库在线 | 久久久国产精品无码免费专区 | 一本色道久久综合亚洲精品不卡 | 国产亚洲精品久久久久久 | 无码乱肉视频免费大全合集 | 一本久久a久久精品vr综合 | 乱人伦人妻中文字幕无码久久网 | 国产精品久久久久久久影院 | 帮老师解开蕾丝奶罩吸乳网站 | 99精品视频在线观看免费 | 日本成熟视频免费视频 | 成人无码精品一区二区三区 | 国产性生交xxxxx无码 | 激情亚洲一区国产精品 | www国产亚洲精品久久久日本 | 精品人妻中文字幕有码在线 | 天堂在线观看www | 麻豆蜜桃av蜜臀av色欲av | 无码av中文字幕免费放 | 亚洲综合久久一区二区 | 性欧美videos高清精品 | 色综合久久久久综合一本到桃花网 | 老熟妇乱子伦牲交视频 | 亚洲一区av无码专区在线观看 | 日本精品久久久久中文字幕 | 久久99精品久久久久久 | 好男人www社区 | 思思久久99热只有频精品66 | 国产午夜无码精品免费看 | 国产偷国产偷精品高清尤物 | 18黄暴禁片在线观看 | 真人与拘做受免费视频 | 美女扒开屁股让男人桶 | 大乳丰满人妻中文字幕日本 | 一本色道婷婷久久欧美 | 又大又硬又爽免费视频 | 黄网在线观看免费网站 | 日韩精品成人一区二区三区 | 99国产欧美久久久精品 | 欧美激情一区二区三区成人 | 国产午夜精品一区二区三区嫩草 | 牲欲强的熟妇农村老妇女视频 | 又色又爽又黄的美女裸体网站 | 欧美日本免费一区二区三区 | 妺妺窝人体色www婷婷 | 日本一本二本三区免费 | 久久无码中文字幕免费影院蜜桃 | 夜先锋av资源网站 | 国产卡一卡二卡三 | 午夜精品一区二区三区在线观看 | 亚洲va欧美va天堂v国产综合 | 激情人妻另类人妻伦 | 乱人伦人妻中文字幕无码 | 亚洲精品午夜国产va久久成人 | 国产av剧情md精品麻豆 | 在线欧美精品一区二区三区 | 无码国产乱人伦偷精品视频 | 强开小婷嫩苞又嫩又紧视频 | 成在人线av无码免费 | 成熟妇人a片免费看网站 | 婷婷五月综合缴情在线视频 | 国产人妖乱国产精品人妖 | 欧美日韩一区二区三区自拍 | 亚洲成av人综合在线观看 | 国产另类ts人妖一区二区 | 精品欧洲av无码一区二区三区 | 精品久久久无码人妻字幂 | 性色av无码免费一区二区三区 | 精品成人av一区二区三区 | 少妇激情av一区二区 | 亚洲中文无码av永久不收费 | 粗大的内捧猛烈进出视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产亚洲欧美在线专区 | 亚洲另类伦春色综合小说 | 国产极品美女高潮无套在线观看 | 久久精品中文字幕一区 | 国产精品美女久久久 | 精品无码av一区二区三区 | 欧美成人免费全部网站 | 欧美性色19p | 久久99精品国产.久久久久 | 国产成人亚洲综合无码 | 无码人妻精品一区二区三区下载 | 四十如虎的丰满熟妇啪啪 | 亚洲第一无码av无码专区 | 色五月五月丁香亚洲综合网 | 免费无码av一区二区 | 国产乱人伦av在线无码 | 成人亚洲精品久久久久 | 亚洲人成影院在线观看 | 国产sm调教视频在线观看 | 国产免费久久精品国产传媒 | 欧洲熟妇色 欧美 | 久久久婷婷五月亚洲97号色 | 5858s亚洲色大成网站www | 日韩人妻无码一区二区三区久久99 | 正在播放东北夫妻内射 | 欧美成人高清在线播放 | 久久久精品国产sm最大网站 | 大屁股大乳丰满人妻 | 精品国产aⅴ无码一区二区 | 久久人人97超碰a片精品 | 亚洲国产成人a精品不卡在线 | 精品国产av色一区二区深夜久久 | 国产农村乱对白刺激视频 | 人人澡人人透人人爽 | 中文字幕av日韩精品一区二区 | 狂野欧美激情性xxxx | 最近免费中文字幕中文高清百度 | 国产熟妇另类久久久久 | 国产成人精品优优av | 国产香蕉97碰碰久久人人 | 国产黄在线观看免费观看不卡 | 粗大的内捧猛烈进出视频 | 乱人伦人妻中文字幕无码久久网 | 色一情一乱一伦一视频免费看 | 图片小说视频一区二区 | 成 人影片 免费观看 | 亚洲日韩中文字幕在线播放 | 久久久久成人片免费观看蜜芽 | 免费无码一区二区三区蜜桃大 | 一本久道高清无码视频 | 377p欧洲日本亚洲大胆 | 色狠狠av一区二区三区 | 日日碰狠狠丁香久燥 | 97夜夜澡人人爽人人喊中国片 | 欧美日本日韩 | 国产亚洲精品久久久闺蜜 | 国产一区二区三区日韩精品 | 内射欧美老妇wbb | 扒开双腿疯狂进出爽爽爽视频 | 亚洲国产成人av在线观看 | 最近的中文字幕在线看视频 | 青青青爽视频在线观看 | 98国产精品综合一区二区三区 | 国产超碰人人爽人人做人人添 | 国内综合精品午夜久久资源 | 日韩精品成人一区二区三区 | 亚洲人成网站免费播放 | 四虎永久在线精品免费网址 | 内射巨臀欧美在线视频 | aⅴ亚洲 日韩 色 图网站 播放 | 国产成人综合色在线观看网站 | 精品国产国产综合精品 | 国产精品久久久久久亚洲影视内衣 | 国产绳艺sm调教室论坛 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产精品久久久久7777 | 福利一区二区三区视频在线观看 | 亚洲一区二区观看播放 | 久久久成人毛片无码 | 国产高潮视频在线观看 | 纯爱无遮挡h肉动漫在线播放 | 欧美丰满老熟妇xxxxx性 | 伊在人天堂亚洲香蕉精品区 | 又大又黄又粗又爽的免费视频 | 国产sm调教视频在线观看 | 国产熟妇高潮叫床视频播放 | 纯爱无遮挡h肉动漫在线播放 | 国产高潮视频在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 精品一区二区三区无码免费视频 | 亚洲 另类 在线 欧美 制服 | 7777奇米四色成人眼影 | 久久久久免费精品国产 | 国产精品va在线观看无码 | 亚洲国产午夜精品理论片 | 青青青手机频在线观看 | 国内综合精品午夜久久资源 | 中文字幕无码免费久久9一区9 | 伊人久久大香线蕉亚洲 | 中文字幕无码免费久久9一区9 | 久久99久久99精品中文字幕 | 久久精品人人做人人综合 | 夜夜高潮次次欢爽av女 | 国产精品高潮呻吟av久久4虎 | 亚洲国产综合无码一区 | 伊在人天堂亚洲香蕉精品区 | 国产色精品久久人妻 | 国产精品久久久久久亚洲影视内衣 | 99久久精品无码一区二区毛片 | 日本一本二本三区免费 | 亚洲日韩一区二区 | 自拍偷自拍亚洲精品10p | 伊在人天堂亚洲香蕉精品区 | 岛国片人妻三上悠亚 | 天天综合网天天综合色 | 国产9 9在线 | 中文 | 欧美真人作爱免费视频 | 日本www一道久久久免费榴莲 | 桃花色综合影院 | 精品久久久无码中文字幕 | 亚洲中文字幕av在天堂 | 97久久超碰中文字幕 | 成人免费无码大片a毛片 | 欧美日韩综合一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 精品aⅴ一区二区三区 | 成 人 网 站国产免费观看 | 熟女俱乐部五十路六十路av | 久久久久免费看成人影片 | 亚洲无人区午夜福利码高清完整版 | 亚洲国产欧美日韩精品一区二区三区 | 高清无码午夜福利视频 | 久久亚洲中文字幕精品一区 | 国产真实夫妇视频 | 熟妇女人妻丰满少妇中文字幕 | 成人aaa片一区国产精品 | 最近的中文字幕在线看视频 | 在线观看国产午夜福利片 | 欧美人与牲动交xxxx | 小sao货水好多真紧h无码视频 | 老子影院午夜伦不卡 | 一个人看的www免费视频在线观看 | 欧美人与物videos另类 | √8天堂资源地址中文在线 | 西西人体www44rt大胆高清 | 在线观看国产午夜福利片 | 中文亚洲成a人片在线观看 | 色婷婷香蕉在线一区二区 | 天天躁日日躁狠狠躁免费麻豆 | 久久久久久九九精品久 | 免费人成网站视频在线观看 | 国产精品人妻一区二区三区四 | 一本色道婷婷久久欧美 | 曰本女人与公拘交酡免费视频 | 中文字幕无线码 | 18禁黄网站男男禁片免费观看 | 久久久久久亚洲精品a片成人 | 成人精品视频一区二区三区尤物 | 久久精品无码一区二区三区 | 亚洲综合精品香蕉久久网 | 中文字幕无码日韩欧毛 | 亚洲国产高清在线观看视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产精品久久久av久久久 | 欧美老人巨大xxxx做受 | 玩弄中年熟妇正在播放 | 国产艳妇av在线观看果冻传媒 | 伊人色综合久久天天小片 | 成熟女人特级毛片www免费 | 久久久精品456亚洲影院 | 网友自拍区视频精品 | 激情爆乳一区二区三区 | 99麻豆久久久国产精品免费 | 成人欧美一区二区三区 | 国内综合精品午夜久久资源 | 女人被男人躁得好爽免费视频 | 亚洲一区二区三区无码久久 | 成人性做爰aaa片免费看不忠 | 18精品久久久无码午夜福利 | 亚洲男人av天堂午夜在 | 国产熟妇另类久久久久 | 色婷婷av一区二区三区之红樱桃 | 中文字幕乱码人妻二区三区 | 中文无码伦av中文字幕 | 福利一区二区三区视频在线观看 | 亚洲小说图区综合在线 | 18无码粉嫩小泬无套在线观看 | 亚洲成色www久久网站 | 男女猛烈xx00免费视频试看 | 久久无码专区国产精品s | 99er热精品视频 | 久久人人爽人人爽人人片av高清 | 宝宝好涨水快流出来免费视频 | 亚洲国产精品毛片av不卡在线 | 亚洲高清偷拍一区二区三区 | 中文字幕人妻无码一夲道 | 国产精品久久久 | 精品无码国产自产拍在线观看蜜 | 亚洲精品国产品国语在线观看 | 欧美人与禽zoz0性伦交 | 中文字幕+乱码+中文字幕一区 | 中文字幕精品av一区二区五区 | 日韩欧美群交p片內射中文 | 中文字幕av伊人av无码av | 99视频精品全部免费免费观看 | 天堂а√在线地址中文在线 | 国产又爽又黄又刺激的视频 | 少妇性荡欲午夜性开放视频剧场 | 亚洲の无码国产の无码影院 | 黑人巨大精品欧美黑寡妇 | 精品一区二区三区波多野结衣 | 丰满人妻一区二区三区免费视频 | 俄罗斯老熟妇色xxxx | 一本久道久久综合婷婷五月 | 亚洲小说图区综合在线 | 国产精品久久久久久亚洲毛片 | √天堂资源地址中文在线 | 亚洲中文字幕va福利 | 国产成人人人97超碰超爽8 | 窝窝午夜理论片影院 | 久久久久99精品国产片 | 日韩精品久久久肉伦网站 | 少妇久久久久久人妻无码 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产成人精品优优av | 色 综合 欧美 亚洲 国产 | 色综合久久久无码网中文 | 亚洲成av人在线观看网址 | 天天燥日日燥 | 狠狠综合久久久久综合网 | 色婷婷久久一区二区三区麻豆 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 欧美成人高清在线播放 | 国产精品无码久久av | 亚洲精品一区二区三区大桥未久 | 国产真人无遮挡作爱免费视频 | 国产精品久久久久无码av色戒 | 国产精品久久久久7777 | 亚洲熟妇自偷自拍另类 | 蜜臀av在线播放 久久综合激激的五月天 | 国内丰满熟女出轨videos | 欧美成人免费全部网站 | 久久久精品人妻久久影视 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲色成人中文字幕网站 | 99精品视频在线观看免费 | 中文精品久久久久人妻不卡 | 中文字幕无码免费久久9一区9 | 亚洲欧美精品aaaaaa片 | 国产精品无套呻吟在线 | 成熟女人特级毛片www免费 | 日韩少妇白浆无码系列 | 国产香蕉97碰碰久久人人 | 国产精品毛多多水多 | 大地资源网第二页免费观看 | 色一情一乱一伦 | 丰满少妇人妻久久久久久 | 女人被男人躁得好爽免费视频 | 欧美猛少妇色xxxxx | 在线看片无码永久免费视频 | 中文精品无码中文字幕无码专区 | 亚洲成在人网站无码天堂 | 欧美日韩在线亚洲综合国产人 | 人人妻人人藻人人爽欧美一区 | 熟女体下毛毛黑森林 | 国产精品嫩草久久久久 | 俄罗斯老熟妇色xxxx | 妺妺窝人体色www婷婷 | 国产成人无码av片在线观看不卡 | 少妇无码一区二区二三区 | 精品久久8x国产免费观看 | 99久久久无码国产精品免费 | 国产人妻大战黑人第1集 | 青青久在线视频免费观看 | 国产精品丝袜黑色高跟鞋 | 欧美35页视频在线观看 | 激情内射日本一区二区三区 | 无码av岛国片在线播放 | 性欧美大战久久久久久久 | 日本一区二区三区免费高清 | 丝袜 中出 制服 人妻 美腿 | 红桃av一区二区三区在线无码av | 天堂一区人妻无码 | 亚洲中文字幕在线观看 | 国产精品亚洲lv粉色 | 免费无码午夜福利片69 | 成 人 网 站国产免费观看 | 九九在线中文字幕无码 | 狠狠色丁香久久婷婷综合五月 | 少妇性俱乐部纵欲狂欢电影 | 国产精品igao视频网 | 小sao货水好多真紧h无码视频 | 久久久中文字幕日本无吗 | 国产做国产爱免费视频 | 欧美人妻一区二区三区 | 18禁黄网站男男禁片免费观看 | 日韩成人一区二区三区在线观看 | 伊人久久大香线蕉亚洲 | 麻豆成人精品国产免费 | 蜜臀av无码人妻精品 | 色一情一乱一伦一视频免费看 | 国产精品国产自线拍免费软件 | 国産精品久久久久久久 | 欧美亚洲日韩国产人成在线播放 | 性欧美疯狂xxxxbbbb | 久久综合香蕉国产蜜臀av | 中文毛片无遮挡高清免费 | 精品无人国产偷自产在线 | 色爱情人网站 | 亚洲欧美色中文字幕在线 | 国产精品福利视频导航 | 日产精品高潮呻吟av久久 | 亚洲精品国产第一综合99久久 | 国产偷自视频区视频 | 亚洲精品成人av在线 | www一区二区www免费 | 亚洲一区二区三区偷拍女厕 | 激情内射亚州一区二区三区爱妻 | av在线亚洲欧洲日产一区二区 | 亚洲国精产品一二二线 | 久久精品视频在线看15 | 日本精品人妻无码免费大全 | 亚洲の无码国产の无码影院 | 黄网在线观看免费网站 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品办公室沙发 | 国产精品二区一区二区aⅴ污介绍 | 国产办公室秘书无码精品99 | 成在人线av无码免观看麻豆 | 99久久婷婷国产综合精品青草免费 | 国产综合在线观看 | 欧美高清在线精品一区 | 久久精品中文闷骚内射 | 亚洲综合无码久久精品综合 | 久久熟妇人妻午夜寂寞影院 | 色五月丁香五月综合五月 | 成人欧美一区二区三区黑人免费 | 亚洲成色在线综合网站 | 免费国产成人高清在线观看网站 | 亚洲精品午夜国产va久久成人 | 人妻熟女一区 | 久久久久久九九精品久 | 欧美日韩一区二区三区自拍 | 天天综合网天天综合色 | 色五月五月丁香亚洲综合网 | 少妇性荡欲午夜性开放视频剧场 | a片在线免费观看 | 澳门永久av免费网站 | 男人的天堂av网站 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产做国产爱免费视频 | 久久五月精品中文字幕 | 精品国产一区av天美传媒 | 小sao货水好多真紧h无码视频 | 在线 国产 欧美 亚洲 天堂 | 久久婷婷五月综合色国产香蕉 | 久精品国产欧美亚洲色aⅴ大片 | 亚洲成av人在线观看网址 | 草草网站影院白丝内射 | 国产人妻人伦精品 | 午夜男女很黄的视频 | 男人和女人高潮免费网站 | 色噜噜亚洲男人的天堂 | 久久精品国产99久久6动漫 | 欧美色就是色 | √天堂中文官网8在线 | 少妇无码av无码专区在线观看 | 亚洲综合在线一区二区三区 | 欧美野外疯狂做受xxxx高潮 | 国产熟妇高潮叫床视频播放 | 国产色精品久久人妻 | 女人被男人爽到呻吟的视频 | 亚洲熟熟妇xxxx | 国产精品va在线观看无码 | 国产黑色丝袜在线播放 | 国内综合精品午夜久久资源 | 丰满肥臀大屁股熟妇激情视频 | 亚洲国产精品无码久久久久高潮 | 日韩人妻无码一区二区三区久久99 | 色综合久久久无码中文字幕 | 国产精品成人av在线观看 | 久久无码专区国产精品s | 97资源共享在线视频 | 日产精品高潮呻吟av久久 | 亚洲欧美色中文字幕在线 | 中文字幕乱码人妻二区三区 | 国产亚洲欧美日韩亚洲中文色 | 国产三级久久久精品麻豆三级 | 国产精品怡红院永久免费 | 超碰97人人射妻 | 亚洲小说图区综合在线 | 中文字幕日韩精品一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 日日干夜夜干 | 荫蒂被男人添的好舒服爽免费视频 | 亚洲欧洲中文日韩av乱码 | 国产成人综合色在线观看网站 | 四虎国产精品免费久久 | 99riav国产精品视频 | 色婷婷综合激情综在线播放 | 精品人妻av区 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲一区二区三区在线观看网站 | 国产真实乱对白精彩久久 | 久久精品国产一区二区三区肥胖 | 中文字幕日韩精品一区二区三区 | 亚洲国产高清在线观看视频 | a片免费视频在线观看 | 日本一卡2卡3卡四卡精品网站 | 玩弄中年熟妇正在播放 | 性欧美videos高清精品 | 蜜臀av在线播放 久久综合激激的五月天 | 扒开双腿疯狂进出爽爽爽视频 | 免费中文字幕日韩欧美 | 一个人看的视频www在线 | 免费观看又污又黄的网站 | 成人动漫在线观看 | 亚洲精品成a人在线观看 | 日韩精品成人一区二区三区 | 小鲜肉自慰网站xnxx | 欧美国产亚洲日韩在线二区 | 一区二区三区乱码在线 | 欧洲 | 国产成人无码区免费内射一片色欲 | 亚洲gv猛男gv无码男同 | 人人爽人人澡人人人妻 | 国产成人无码专区 | 国内精品九九久久久精品 | 色综合久久88色综合天天 | 亚洲欧美日韩成人高清在线一区 | 亚洲综合精品香蕉久久网 | 99国产精品白浆在线观看免费 | 在线成人www免费观看视频 | 精品国产一区二区三区四区在线看 | 亚洲国产欧美日韩精品一区二区三区 | 成人女人看片免费视频放人 | 婷婷综合久久中文字幕蜜桃三电影 | 人人澡人人透人人爽 | 丰满诱人的人妻3 | 麻豆果冻传媒2021精品传媒一区下载 | 无码精品国产va在线观看dvd | 无码毛片视频一区二区本码 | 台湾无码一区二区 | 中文字幕日产无线码一区 | 欧美性猛交xxxx富婆 | 激情综合激情五月俺也去 | 最新国产乱人伦偷精品免费网站 | 国内丰满熟女出轨videos | 亚洲欧美日韩成人高清在线一区 | 亚洲天堂2017无码 | 中文字幕乱妇无码av在线 | 欧美日韩在线亚洲综合国产人 | 一区二区传媒有限公司 | 精品一区二区不卡无码av | 国产精品香蕉在线观看 | 一本加勒比波多野结衣 | 亚洲欧洲中文日韩av乱码 | 老太婆性杂交欧美肥老太 | 国产精品久久久久7777 | 狠狠色噜噜狠狠狠狠7777米奇 | 日本xxxx色视频在线观看免费 | 久久国内精品自在自线 | 精品成在人线av无码免费看 | 亚洲熟悉妇女xxx妇女av | 真人与拘做受免费视频一 | 亚洲一区二区三区 | 麻豆成人精品国产免费 | 无码毛片视频一区二区本码 | www国产亚洲精品久久久日本 | 国产另类ts人妖一区二区 | 好爽又高潮了毛片免费下载 | 国产两女互慰高潮视频在线观看 | 成熟女人特级毛片www免费 | 狠狠色噜噜狠狠狠狠7777米奇 | 日本大香伊一区二区三区 | 又大又硬又黄的免费视频 | 精品人人妻人人澡人人爽人人 | 精品一区二区三区无码免费视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产熟女一区二区三区四区五区 | 好爽又高潮了毛片免费下载 | 国产精品久久久一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 国产美女极度色诱视频www | 中文字幕亚洲情99在线 | 亚洲码国产精品高潮在线 | 日韩成人一区二区三区在线观看 | 色综合久久中文娱乐网 | 国产三级精品三级男人的天堂 | 夜夜夜高潮夜夜爽夜夜爰爰 | 欧美三级a做爰在线观看 | 久久久av男人的天堂 | 欧美一区二区三区 | 亚洲色欲久久久综合网东京热 | 高潮毛片无遮挡高清免费 | 成人女人看片免费视频放人 | 国产精品资源一区二区 | 纯爱无遮挡h肉动漫在线播放 | 亚洲爆乳精品无码一区二区三区 | 日本丰满熟妇videos | 欧美日韩亚洲国产精品 | 国产色视频一区二区三区 | 国产99久久精品一区二区 | 国产精品美女久久久网av | 日本在线高清不卡免费播放 | 人妻无码αv中文字幕久久琪琪布 | 欧美自拍另类欧美综合图片区 | 国产真实夫妇视频 | 欧洲熟妇精品视频 | 国产激情无码一区二区app | 久久午夜夜伦鲁鲁片无码免费 | 天堂在线观看www | 亚洲一区二区观看播放 | 特级做a爰片毛片免费69 | 国产真实伦对白全集 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲天堂2017无码 | 天天摸天天透天天添 | 国产欧美熟妇另类久久久 | 性色欲情网站iwww九文堂 | 乱人伦人妻中文字幕无码 | 98国产精品综合一区二区三区 | 一本无码人妻在中文字幕免费 | 女人被爽到呻吟gif动态图视看 | 成人av无码一区二区三区 | 欧美高清在线精品一区 | 亚洲国产av美女网站 | 亚洲精品一区国产 | 在线看片无码永久免费视频 | 亚拍精品一区二区三区探花 | 国产亚洲精品久久久久久大师 | 无遮挡啪啪摇乳动态图 | 国产亚洲精品久久久久久久 | 成人免费无码大片a毛片 | 一本一道久久综合久久 | 久久天天躁狠狠躁夜夜免费观看 | 在线亚洲高清揄拍自拍一品区 | 国产亚洲欧美在线专区 | 熟女少妇人妻中文字幕 | 亚洲综合无码久久精品综合 | 亚洲一区二区观看播放 | 国产亲子乱弄免费视频 | 精品久久综合1区2区3区激情 | 久久综合网欧美色妞网 | 精品人妻中文字幕有码在线 | 成人无码精品一区二区三区 | 中文字幕乱码亚洲无线三区 | 亚洲小说图区综合在线 | 日产国产精品亚洲系列 | 久久99精品久久久久久动态图 | 国内少妇偷人精品视频免费 | 中文字幕日产无线码一区 | 丁香花在线影院观看在线播放 | 狠狠噜狠狠狠狠丁香五月 | 黑人大群体交免费视频 | 澳门永久av免费网站 | 动漫av网站免费观看 | 日本一本二本三区免费 | 国产性生交xxxxx无码 | 伊人色综合久久天天小片 | 亚洲国精产品一二二线 | 国产精品理论片在线观看 | 无码中文字幕色专区 | 在线成人www免费观看视频 | 欧美日韩视频无码一区二区三 | 国产真人无遮挡作爱免费视频 | 日本饥渴人妻欲求不满 | 无码午夜成人1000部免费视频 | 欧美人与牲动交xxxx | 青青青手机频在线观看 | 国产成人综合美国十次 | 人人澡人人透人人爽 | 精品日本一区二区三区在线观看 | 无遮无挡爽爽免费视频 | 在线a亚洲视频播放在线观看 | 国产精品人人妻人人爽 | 亚洲日韩av一区二区三区四区 | 亚洲小说春色综合另类 | 欧美日韩一区二区三区自拍 | 成人精品天堂一区二区三区 | 欧美性猛交内射兽交老熟妇 | 无码纯肉视频在线观看 | 日本免费一区二区三区最新 | 中文字幕av伊人av无码av | 精品厕所偷拍各类美女tp嘘嘘 | 欧美黑人巨大xxxxx | 久久zyz资源站无码中文动漫 | 午夜精品久久久内射近拍高清 | 性色av无码免费一区二区三区 | 亚洲欧美色中文字幕在线 | 亚洲中文字幕无码一久久区 | 97资源共享在线视频 | 九九综合va免费看 | 老熟女乱子伦 | 男女超爽视频免费播放 | 国产一精品一av一免费 | 夜精品a片一区二区三区无码白浆 | 欧美自拍另类欧美综合图片区 | av无码电影一区二区三区 | 成人动漫在线观看 | 中文字幕无码热在线视频 | 无码人妻精品一区二区三区下载 | 永久免费观看国产裸体美女 | 中文字幕乱码亚洲无线三区 | 国产成人人人97超碰超爽8 | 国产成人精品视频ⅴa片软件竹菊 | 久久国产自偷自偷免费一区调 | 宝宝好涨水快流出来免费视频 | 欧美肥老太牲交大战 | 色狠狠av一区二区三区 | 久久综合网欧美色妞网 | 美女极度色诱视频国产 |