static的作用
static表示靜態(tài)修飾符,使用static修飾的變量,在Java中分配內(nèi)存后一直存在,直到程序退出才釋放空間。用static修飾的變量可以直接使用類名加“.”的方式訪問。
final的作用
final表示不可改變的。如果修飾類,表示該類是一個最終類,不可被繼承,默認(rèn)其中的方法都為final方法。如果修飾方法,不能被子類覆蓋,但是能被子類繼承(父類中的private方法也是不能被子類覆蓋的,默認(rèn)也是final)。如果修飾成員變量,表示該變量是一個常量,只能被賦值一次,賦值之后不可以被改變。
overload和override的區(qū)別
重載(overload),表示同一個類中可以有多個方法名相同的方法,但是這些方法的參數(shù)列表各不相同(參數(shù)個數(shù)、類型或者順序)。
重寫(override),表示子類對父類中的某個方法重新編寫,相同的內(nèi)容包括方法名、參數(shù)和返回類型。子類的方法訪問修飾符范圍要大于等于父類中的范圍,子類只能比父類拋出更少的異常。聲明為final的方法不能被重寫。聲明為static的方法不能被重寫,但是能被再次聲明。子類和父類在同一包下,子類能重寫除了private和final的所有方法。子類和父類不在同一包下,子類只能重寫父類聲明為public和protected的方法。
內(nèi)部類
每個內(nèi)部類都能獨立的繼承一個接口,與外圍類無關(guān)。
成員內(nèi)部類,作為外部類的成員,可以使用外部類的所有成員和方法,但是外部類要先擁有成員內(nèi)部類的實例對象,才可以訪問內(nèi)部類。成員內(nèi)部類不能有任何static的變量或方法。只有先創(chuàng)建外部類,才能在創(chuàng)建成員內(nèi)部類。(new 外部類實例;外部類名.內(nèi)部類名 內(nèi)部類對象名 = 外部類實例.new 內(nèi)部類類名)。
局部內(nèi)部類,是定義在一個方法或者一個作用域里面的類,它的訪問權(quán)限僅限于該方法或者該作用域內(nèi)。
匿名內(nèi)部類,沒有訪問修飾符;new 匿名內(nèi)部類;這里舉個簡單例子。
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
再看一個例子
public class Test {
public static void main(String[] args) {
}
public void test(final int b) {
final int a = 10;
new Thread(){
public void run() {
System.out.println(a);
System.out.println(b);
};
}.start();
}
}
這里test方法的參數(shù)為final修飾,在其中還定義了一個final的變量,然后在匿名內(nèi)部類中進(jìn)行使用。在run方法中,對于a,java編譯器能確定其值,所以在編譯的時候會直接在匿名類的常量池中添加一個值相等的變量;對于b,參數(shù)的值無法在編譯的時候確定,這時會將test方法中的形參a以參數(shù)的形式傳進(jìn)來對匿名內(nèi)部類中的拷貝進(jìn)行初始化賦值。這里就有一個問題,內(nèi)部類中的變量和test中的局部變量不是一個對象,所以java直接限制為final變量,不允許改變,這樣數(shù)據(jù)不一致的問題就得到了解決。
靜態(tài)內(nèi)部類,使用static修飾的內(nèi)部類。內(nèi)部類不依賴外部類,并且不能使用外部類非static的成員變量或方法,創(chuàng)建靜態(tài)內(nèi)部類對象,外部類名.內(nèi)部類名 內(nèi)部類對象名 = new 外部類名.內(nèi)部類類名()。
Java 二維數(shù)組
定義,type arrayName[][]或者type[][] arrayName。
靜態(tài)初始化,int array[][] = {{1,2},{1,2,3},{1,2,3,4}};
在Java中,把二維數(shù)組看作是數(shù)組的數(shù)組,數(shù)組的空間是不連續(xù)的,所以不要求二維數(shù)組每一維大小相等。
動態(tài)初始化,可以直接給數(shù)組的每一維賦值同樣的大小,也可以先確定數(shù)組最高維的大小,然后給每一維具體分配。int array[][] = new int[2][3];int array[][] = new int[2][],array[0] = new int[5],array[1]=new int[10]。
接口和抽象類
抽象類
可以含有具體的方法;
子類使用extends關(guān)鍵字來繼承抽象類,如果子類不是抽象類,它需要實現(xiàn)父類中所有的抽象方法,或者繼續(xù)聲明為抽象類;
抽象類中也可以不含抽象方法;
抽象類中可以有成員變量;
抽象類可以有構(gòu)造函數(shù),只是不能直接用來創(chuàng)建抽象類的實例,在繼承了抽象類的子類中可以通過super調(diào)用抽象類中的構(gòu)造函數(shù);
抽象類可以繼承一個類實現(xiàn)多個接口。
接口
接口中可以且只能有 public static final修飾的常量。
子類需要使用implements實現(xiàn)接口,需要實現(xiàn)接口中聲明的所有方法;
接口沒有構(gòu)造函數(shù);
接口默認(rèn)修飾符是public,不能改為其他修飾符。
反射機(jī)制
Java反射機(jī)制是在運行狀態(tài)中,對于任意一個類,都能知道這個類的所有屬性和方法,對于任意一個對象,都能調(diào)用他的任意方法和屬性。這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為Java語言的反射機(jī)制。
通過反射獲得類的包名和類名等類的相關(guān)信息。
Test test = new Test();
//獲得包名
test.getClass().getPackage().getName();
//獲得類名
test. getName();
通過Class類獲得Test類的實例對象
//定義一個類型未知的Class類,
Class<?> class = null;
//方法1
class = Class.forName("com.king.test");
//方法2
class = Test.class;
通過反射,用Class創(chuàng)建類對象
Class<?> class = null;
class = Class.forName("com.king.test");
Test test = (Test)class.newInstance();
//然后就可以調(diào)用test對象的方法了。
java面向?qū)ο蟮娜齻€特征和含義
繼承:繼承是從已有的類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(基類、超類);得到繼承信息的類被稱為子類(派生類)。繼承讓變化中的軟件系統(tǒng)有了一定的可延續(xù)性,同時繼承也是封裝程序中可變因素的重要手段。
封裝:在類中編寫的方法是對實現(xiàn)細(xì)節(jié)的封裝,編寫一個類就是對數(shù)據(jù)和數(shù)據(jù)操作的封裝。封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的接口。
多態(tài):多態(tài)是指允許不同子類型的對象堆同一消息做出不同的響應(yīng)。
編譯時多態(tài):是指根據(jù)參數(shù)列表不同來區(qū)分不同的函數(shù),編譯之后就會變成兩個函數(shù),主要指方法的重載。
運行時多態(tài):(動態(tài)綁定),指在程序運行期間判斷所引用對象的實際類型,根據(jù)實際類型判斷并調(diào)用相應(yīng)的方法和屬性。
要實現(xiàn)多態(tài)需要做兩件事:1. 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法);2. 對象造型(用父類型引用引用子類型對象,這樣同樣的引用調(diào)用同樣的方法就會根據(jù)子類對象的不同而表現(xiàn)出不同的行為)。
Java線程和進(jìn)程
線程存在于進(jìn)程中,每個進(jìn)程都至少一個線程。線程共享進(jìn)程的資源,包括內(nèi)存和打開的文件。進(jìn)程和線程是并發(fā)編程的兩個基本的執(zhí)行單元。在 Java 中,并發(fā)編程主要涉及線程。
java實現(xiàn)多線程的兩種方式,1.繼承Thread類,2.實現(xiàn)Runnable接口。

一個線程可以處于以下四種狀態(tài)之一:
1.新建。當(dāng)線程被創(chuàng)建時,它只會短暫的處于這種狀態(tài)。此時它已經(jīng)分配了必須的系統(tǒng)資源,并執(zhí)行了初始化。此刻線程已經(jīng)有資格獲取CPU時間了,之后調(diào)度器把這個線程轉(zhuǎn)變?yōu)榭蛇\行狀態(tài)或者阻塞態(tài)。
2.就緒。在這種狀態(tài)下,只要調(diào)度器把時間片分配給線程,線程就可以運行。也就是說,在任意時刻,線程可以運行或者不運行。只要調(diào)度器能分配時間片給線程,他就可以運行,這不同于死亡和阻塞狀態(tài)。
3.阻塞。線程能夠運行,但是有個條件阻止它的運行。當(dāng)線程處于阻塞狀態(tài)時,調(diào)度器會忽略線程,不會分配給線程CPU時間。直到線程重新進(jìn)入就緒態(tài),它才有可能執(zhí)行操作。
4.死亡。處于死亡或者終止?fàn)顟B(tài)的線程不再是可調(diào)度的。并且再也不會得到CPU時間。任務(wù)死亡的通常方式是從run()方法返回,但是任務(wù)線程還可以被中斷。
Java中使用synchronized關(guān)鍵字來實現(xiàn)同步。
run()和start()
系統(tǒng)通過調(diào)用start()方法來啟動一個線程,此時該線程處于就緒態(tài)。直接調(diào)用run()方法,這會被當(dāng)成一個普通的函數(shù)調(diào)用,程序中仍然只有主線程一個線程。
wait()和notify()
在synchronized代碼被執(zhí)行期間,線程可以調(diào)用對象的wait()方法,釋放對象鎖,進(jìn)入等待狀態(tài),直到其他線程調(diào)用此對象的 notify()方法或 notifyAll()方法。notify()喚醒等待隊列的第一個線程,并運行它去獲取鎖。notifyAll(),喚醒等待隊列的全部線程,讓他們?nèi)ジ偁庢i。
Java 5加入了Lock接口以及他的一個實現(xiàn)類ReentrantLock(重入鎖)。lock()方法。以阻塞的方式獲取鎖。如果獲得到鎖,立即返回;如果別的線程持有鎖,則當(dāng)前線程等待,直到獲取鎖之后返回。tryLock(),非阻塞形式獲取鎖,如果獲取到返回true,沒有獲取到,返回false。
sleep()和wait()
sleep不會釋放鎖,wait會釋放鎖。
join
join方法用線程對象調(diào)用,如果在一個線程A中調(diào)用另一個線程B的join方法,線程A將會等待線程B執(zhí)行完畢后再執(zhí)行。
this和super
this用來指向當(dāng)前實例的對象,用來區(qū)分成員變量和方法的形參,如果方法的形參和成員變量的名字相同的時候,方法的形參會覆蓋成員變量。
super用來訪問父類的方法或成員變量。
volatile
使用這個修飾符修飾的變量,程序在讀取它的值時直接從內(nèi)存中獲取,一定是最新值。而不是從緩存中獲取。
其他
值傳遞和引用傳遞
值傳遞。在方法調(diào)用過程中,實參將自己的值傳遞給形參使用,雖然兩者的值完全相等,但是在內(nèi)存中確實完全不同的位置,對形參的改變不會影響到實參。
引用傳遞。在方法調(diào)用中,傳遞的是對象的地址,這是形參和實參其實指向的是同一塊存儲單元。
在Java中,8種基本數(shù)據(jù)類型都是值傳遞,包裝類都是值傳遞。
Math中的round、ceil和floor
round四舍五入,返回結(jié)果int。
ceil向上取整,返回double。
floor向下取整,返回double。
Java I/O流
字節(jié)流:InputStream和outputStream
字符流:Reader和Writer
Socket
流套接字,使用TCP協(xié)議。提供面向連接的服務(wù)。提供可靠連接。Java為TCP連接提供了兩個類,Socket和ServerSocket類。一個Socket實例代表了TCP連接的一個客戶端,一個ServerSocket代表一個服務(wù)端,一般在程序中會有多個客戶端,一個服務(wù)端??蛻舳讼蚍?wù)端發(fā)送連接請求,服務(wù)端的ServerSocket實例監(jiān)聽來自客戶端的連接請求,并為每個請求創(chuàng)建新的socket實例并開啟新線程。serverSocket調(diào)用eccept()方法監(jiān)聽。每個Socket實例會關(guān)聯(lián)一個InputStream和OutputStream。通過將數(shù)據(jù)寫入OutputStream發(fā)送數(shù)據(jù),通過InputStream接收數(shù)據(jù)。通信完成記得關(guān)閉連接。
數(shù)據(jù)報套接字,使用UDP協(xié)議。面向非連接的,不可靠連接。服務(wù)端和客戶端都是使用DatagramSocket的send()和receive()方法接收和發(fā)送數(shù)據(jù)。由于UDP是無連接的,所以服務(wù)端不用等待客戶端請求連接。UDP服務(wù)器為所有通信使用同一套接字。如果數(shù)據(jù)在傳輸過程中發(fā)生丟失,那么程序會一直阻塞在recevice()處。為避免這個問題,可以設(shè)置recevice()的最長阻塞時間,并指定重發(fā)數(shù)據(jù)報的次數(shù)。
堆和棧
Java中,基本數(shù)據(jù)類型的變量以及對象的引用變量,內(nèi)存都分配在棧上。
而引用類型的變量,內(nèi)存都分配在堆上或者常量池。
關(guān)于Collection
List、Queue、Set、Stack繼承自Collection接口。
Set,其中的元素不能重復(fù)。線程不同步。有兩個實現(xiàn)類:HashSet和TreeSet。TreeSet實現(xiàn)了SortedSet接口,底層的數(shù)據(jù)結(jié)構(gòu)是二叉樹,是有序的。
List,ArrayList和Vector是基于數(shù)組實現(xiàn)的,只在末端添加刪除元素快,隨機(jī)訪問快,Vector是線程安全的。LinkedList是基于雙向鏈表的,在指定位置插入數(shù)據(jù)速度快。
Collection包結(jié)構(gòu),與Collections的區(qū)別
Collection是一個接口,他是Set、List等容器的父接口;Collections是一個工具類,提供一系列的靜態(tài)方法來輔助容器操作,這些方法包括對容器的搜索、排序、線程安全化等。
Map集合
這個集合是存儲鍵值對的,實現(xiàn)類有:
HashTable,底層是哈希表數(shù)據(jù)結(jié)構(gòu),不可存入null鍵和null值,線程同步。
HashMap,底層是哈希表數(shù)據(jù)結(jié)構(gòu),可以存入null鍵和null值,線程不同步,效率較高。
TreeMap,底層是二叉樹數(shù)據(jù)結(jié)構(gòu),實現(xiàn)了SortMap接口,線程不同步,可以用于map集合中對鍵進(jìn)行排序。
String類
String對象是不可變類型,一般返回類型為String的String方法每次返回的都是新的對象。
String對象的比較方式:
==內(nèi)存比較,直接比較兩個引用所指向的內(nèi)存值,精確簡介直接明了。
equals字符串值比較,比較兩個引用所指對象字面值是否相等。
Object有哪些公用方法
1.clone方法,實現(xiàn)對象的淺復(fù)制,只有實現(xiàn)了Cloneable接口才能調(diào)用 該方法。
2.getClass方法,final方法,獲得運行時類型。
3.toString方法,一般由子類覆蓋。
4.finalize方法,用于釋放資源,因為無法確定該方法什么時候被調(diào)用,很少有。
5.equals方法。很重要的一個方法,用于比較,子類一般需要重寫。
6.hashCode方法,該方法用于哈希查找,可以減少在查找中使用equals的次數(shù),重寫了equals方法一般都要重寫hashCode方法。這個方法在一些具有哈希功能的Collection中用到。
7.wait方法,調(diào)用該方法后當(dāng)前線程進(jìn)入睡眠狀態(tài),直到以下事件發(fā)生
(1).其他線程調(diào)用了該對象的notify方法或notifyAll方法。
(2).其他線程調(diào)用了interrupt中斷該線程。
(3)wait(long time)設(shè)置中的時間間隔到了。
此時如果線程被中斷就拋出一個InterruptedException異常,或者是處于可以被調(diào)度的狀態(tài)。
8.notify,喚醒等待該對象的某個線程。
9.notifyAll,喚醒等待該對象的所有線程。
Throwable
Throwable是Java中所有錯誤和異常的超類。包含兩個子類,Error和Exception。RuntimeException是Exception的一個子類,表示可能在Java虛擬機(jī)正常運行期間拋出的異常的超類,編譯器不會檢查Error 和RuntimeException,要通過修改代碼來避免這些情況。
checkException,被檢查的異常,Exception類本身,以及Exception的子類中除了RuntimeException之外的其他子類都屬于被檢查異常,這些異常Java編譯器會檢查它。此類異常,要么通過throws進(jìn)行聲明拋出,要么通過try-catch進(jìn)行捕獲處理,否則不能通過編譯。