java在安卓的開發中是非常重要的,所以今天我總結了一下java的基礎知識,當然,還有一些沒有總結完,例如網絡編程,io流等,將會在下一篇博文中寫出。
## 概述
javac :負責的是編譯的部分
java :負責運行的部分.會啟動 jvm.加載運行時所需的類庫,并對 class 文件進行執行
## 語法規則
### 數據類型
1 1 ): 基本數據類型:byte(1個字節)、short(2)、int(4)、long(8)、float(4)、double(8)、char(2)、boolean。
1個字節占8位
2 2 ): 引用數據 類型: 數組、類、接口。
### 運算符
> *+ - * / % %:任何整數模 2 不是 0 就是 1,所以只要改變被模數就可以實現開關運算
> &: 只有兩邊都為 true 結果是 true。否則就是 false。
> |:只要兩邊都為 false 結果是 false,否則就是 true
> & 和 && 區別: & :無論左邊結果是什么,右邊都參與運算。
&&: 短路與,如果左邊為 false,那么右邊不參數與運算。
> | 和 || 區別:|:兩邊都運算。
|| : 短路或,如果左邊為 true,那么右邊不參與運算。
> ++X(–X)表示在使用x之前,先使x的值增(減)1
### 語句
If switch do while while for
當判斷固定個數的值的時候,建議使用 switch,效率相對較高。
當判斷數據范圍,獲取判斷運算結果 boolean 類型時,需要使用 if。
當某些語句需要執行很多次時,就用循環結構,建議使用 for。因為 for 循環完畢,變量在內存中釋放。
### 函數
重載的定義是:在一個類中,如果出現了兩個或者兩個以上的同名函數,只要它們的參數的個數,或者參數的
類型不同,即可稱之為該函數重載了。
如何區分重載:當函數同名時,只看參數列表。和返回值類型沒關系。
### 數據
~~~
// 二分查找法。必須有前提: 數組中的元素要有序。
public static int halfSeach_2(int[] arr,int key){
int min,max,mid;
min = 0;
max = arr.length-1;
mid = (max+min)>>1; //(max+min)/2;
while(arr[mid]!=key){
if(key>arr[mid]){
min = mid + 1;
}
else if(key<arr[mid])
max = mid - 1;
if(max<min)
return -1;
mid = (max+min)>>1;
}
return mid;
}
~~~
java 分了 5 5 片內存。
1 :寄存器。2 :本地方法區。3 :方法區。4 :棧。5 :堆。
~~~
棧:存儲的都是局部變量 ( 函數中定義的變量,函數上的參數,語句中的變量 );
只要數據運算完成所在的區域結束,該數據就會被釋放。后進先出。
堆:用于存儲數組和對象,也就是 實體。啥是實體啊?就是用于封裝多個數據的。
1 :每一個實體都有內存首地址值。
2 :堆內存中的變量都有默認初始化值。因為數據類型不同,值也不一樣。
3 :垃圾回收機制。
~~~
## 面向對象
### 類
屬性是用于存儲數據的 , 直接被訪問,容易出現安全隱患 , 所以,類中的屬性通
常被私有化,并對外提供公共的訪問方法。
這個方法一般有兩個,規范寫法:對于屬性 xxx ,可以使用 setXXX(),getXXX() 對其進行操作
主函數的存在,僅為該類是否需要獨立運行 , 如果不需要,主函數是不用定義的。
主函數的解釋:保證所在類的獨立運行,是程序的入口,被 jvm 調用。
構造函數是在對象創建時,就被調用,用于初始化, 而且初始化動作只執行一次。
一般函數,是對象創建后,需要調用才執行,可以被調用多次。
### 封裝
將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。
### this
用 this 調用構造函數,必須定義在構造函數的第一行。因為構造函數是用于初始化的,所以初
始化動作一定要執行。 否則編譯失敗。
### static
~~~
關鍵字,是一個修飾符 , 用于修飾成員( ( 成員變量和成員函數) )
靜態方法只能訪問靜態成員,不可以訪問非靜態成員。
靜態方法中不能使用 this ,super 關鍵字。
成員變量可以稱為對象的特有數據,靜態變量稱為對象的共享數據。
靜態代碼塊、構造代碼塊、構造函數同時存在時的執行順序: 靜態代碼塊 à? 構造代碼塊 à? 構造函數
~~~
### 單例設計模式
保證一個類在內存中的對象唯一性。
步驟:
1 1 ,因為創建對象都需要構造函數初始化 ,只要將本類中的構造函數私有化,其他程序就無法 再 創建
該類對象;
2 2 ,就在類中創建一個本類的對象 ;
3 3 ,定義一個方法,。 返回該對象,讓其他程序可以通過方法就得到本類對象。 (作用:可控)
代碼體現:
1 1 ,私有化構造函數 ;
2 2 ,創建私有并靜態的本類對象 ;
3 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;
}
}
~~~
### 繼承
java 中對于繼承,java 只支持單繼承。java 雖然不直接支持多繼承,但是保留了這種多繼承機制,進行改良。
java 支持多重繼承。A 繼承 B B 繼承 C C 繼承 D。
子類在進行對象初始化時,先調用父類的構造函數,這就是子類的實例化過程。
super()和 和 this() 不可以同時出現的構造函數中。
在方法覆蓋時,注意兩點:
1:子類覆蓋父類時,必須要保證,子類方法的權限必須大于等于父類方法權限可以實現繼承。否則,編譯
失敗。
2:覆蓋時,要么都靜態,要么都不靜態。 (靜態只能覆蓋靜態,或者被靜態覆蓋)
### final
可以修飾類,方法,變量。不可以被繼承、覆蓋。
### 抽象類
抽象類的特點:
1 1 : 抽象方法只能定義在 抽象類中 , 抽象類和抽象方法必須由 t abstract 關鍵字修飾 (可以描述類和
) 方法,不可以描述變量) 。
2 2 : 抽象方法只定義方法聲明,并不定義方法實現。
3 3 : 抽象類不可以被創建對象( ( 實例化) ) 。
4 4 : 只有通過子類繼承抽象類并覆蓋了抽象類中的 所有 抽象方法后,該子類 才 可以實例化。否則,
該子類還是一個抽象類。
抽象類可以大一非抽象方法,抽象類中有構造函數。
### 接口
接口中有抽象方法,接口不可以實例化。 接口的子類必須實現了接口 中 所有的抽象方法后,該子類才可以實例化。否則,該子類還是一個抽象類。
類與類之間存在著繼承關系,類與接口中間存在的是 實現關系。
繼承用 extends ; 實現用 implements
### 多態
體現: 父類引用或者接口的引用指向了自己的子類對象。 //Animal a = new Cat();
instanceof ;// 判斷對象是否實現了指定的接口或繼承了指定的類
### Object
~~~
public boolean equals(Object obj){
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.age == p.age;
}
~~~
通常 equals , toString , hashCode ,在應用中都會被復寫 , 建立具體對象的特有的內容。
### 內部類
如果 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();//調用內部類的方法。
}
}
~~~
匿名內部類:
當函數的參數是接口類型引用時,如果接口中的方法不超過 3 個。可以通過匿名內部類來完成參數的傳遞。
### 異常
> 通過 throws 關鍵字完成, 格式: throws 異常類名, , 異常類名
> throw 用于拋出異常對象,后面跟的是異常對象;throw 用在函數內。
throws 用于拋出異常類,后面跟的異常類名,可以跟多個,用逗號隔開。throws 用在函數上。
> 運行時異常,其中 Exception 有一個特殊的子類 RuntimeException,以及 RuntimeException 的子類是運
行異常,也就說這個異常是編譯時不被檢查的異常。
> finally 很有用,只要用戶關閉資源。無論是否發生異常,資源都必須進行關閉。
System.exit(0); //退出 jvm,只有這種情況 finally 不執行。
常見 異常 :
1、腳標越界異常(IndexOutOfBoundsException)包括數組、字符串;
空指針異常(NullPointerException)
2、類型轉換異常:ClassCastException
3、不支持操作異常;
### 包
常見的軟件包:
> 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 a : java 的工具包,時間對象 , 集合框架。
> java.applet : application+let 端 客戶端 a java 小程序。 server+let – > servlet 端 服務端 java
小程序
### 多線程
創建線程:
方法1:
~~~
步驟:
1,定義類繼承 Thread 類;
2,目的是復寫 run 方法,將要讓線程運行的代碼都存儲到 run 方法中;
3,通過創建 Thread 類的子類對象,創建線程對象;
4,調用線程的 start 方法,開啟線程,并執行 run 方法。
~~~
方法2:
~~~
步驟:
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();
~~~
### 同步
同步函數:其實就是將同步關鍵字定義在函數上,讓函數具備了同步性。
同步函數使用的鎖是 this , 靜態同步函數的鎖是 該類的字節碼文件對象。
同步是隱示的鎖操作,而 k Lock 對象是顯示的鎖操作,它的出現就替代了同步。
## API
### 字符串
~~~
parseInt(string,radix); //將給定的數轉成指定的基數進制;
在 在 5 jdk1.5 版本后,對基本數據類型對象包裝類進行升級。在升級中,使用基本數據類型對象包裝類可
以像使用基本數據類型一樣,進行運算。
Integer i = new Integer(4); 5 //1.5 版本之前的寫法;
Integer i = 4; // 自動裝箱 ,5 1.5 版本后的寫法;
i = i + 5;
//i 對象是不能直接和 5 相加的,其實底層先將 i 轉成 int 類型,在和 5 相加。而轉成 int 類型的操作是隱
式的。 自動拆箱:拆箱的原理就是 i.intValue();i+5 運算完是一個 int 整數。
~~~
### 集合框架
1:對象封裝數據,對象多了也需要存儲。 集合用于存儲對象。
2:對象的個數確定可以使用數組,但是不確定怎么辦?可以用集合。因為
### List接口
~~~
List : 有序( ( 元素存入集合的順序和取出的順序一致) ) ,元素都有索引。元素可以重復。
| | -- ArrayList : 底層的數據結構 是數組, , 線程不同步 ,A At rrayList 了 替代了 Vector , 查詢元素的速
度非常快。
| | -- LinkedList : 底層的數據結構是鏈表 , 線程不同步 , 增刪元素的速度非常快。
| | -- Vector : 底層的數據結構就是數組 , 線程同步的 ,r Vector 無論查詢和增刪都巨慢。
~~~
對于 t list 集合,底層判斷元素是否相同,其實用的是元素自身的 s equals 方法完成的。所以建議
元素都要復寫 s equals
~~~
LinkedList : 的特有方法。
addFirst();
addLast();
在 jdk1.6 以后。
offerFirst();
offerLast();
getFirst():獲取鏈表中的第一個元素。如果鏈表為空,拋出 NoSuchElementException;
getLast();
在 jdk1.6 以后。
peekFirst();獲取鏈表中的第一個元素。如果鏈表為空,返回 null。
peekLast();
removeFirst():獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,拋出
NoSuchElementException
removeLast();
在 jdk1.6 以后。
pollFirst();獲取鏈表中的第一個元素,但是會刪除鏈表中的第一個元素。如果鏈表為空,返回 null。
pollLast();
~~~
### Set接口
當元素的 hashCode 值相同時,才繼續判斷元素的 equals 是否為 true。
~~~
TreeSet:
用于對 Set 集合進行元素的指定順序排序,排序需要依據元素自身具備的比較性。
如果元素不具備比較性,在運行時會發生 n ClassCastException 異常。
所以需要元素 實現 e Comparable 接口,強制讓元素具備比較性, 復寫 o compareTo 方法。
~~~
### Map集合
– Hashtable :底層是哈希表數據結構,是線程同步的。不可以存儲 null 鍵,null 值。
– HashMap :底層是哈希表數據結構,是線程不同步的。可以存儲 null 鍵,null 值。替代了 Hashtable.
– TreeMap :底層是二叉樹結構,可以對 map 集合中的鍵進行指定順序的排序。
### 把 把 p map 集合轉成 t set 的方法
Set keySet();
Set entrySet(); //取的是鍵和值的映射關系。
~~~
取出 p map 集合中所有元素的方式一 : keySet() 方法。
可以將 map 集合中的鍵都取出存放到 set 集合中。對 set 集合進行迭代。迭代完成,再通過 get 方法對獲取
到的鍵進行值的獲取。
Set keySet = map.keySet();
Iterator it = keySet.iterator();
w w hile(it.hasNext()) { {
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
} }
取出 p map 集合中所有元素的方式 二 : entry Set() 方法。
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 : 覆蓋 o compareTo 方法 ;
一個是 Comparator : 覆蓋 e compare 方法。
LinkedHashSet,LinkedHashMap:這兩個集合可以保證哈希表有存入順序和取出順序一致,保證哈希表有序。
集合什么時候用?
當存儲的是一個元素時,就用 Collection。當存儲對象之間存在著映射關系時,就使用 Map 集合。
保證唯一,就用 Set 。不保證唯一 , 就用 List
~~~
### 雙列集合 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);
}
~~~
### 泛型
當類中的操作的引用數據類型不確定的時候,以前用的 t Object 來進行擴展的,現在可以用泛型來表示。這樣可以避免強轉的麻煩,而且將運行問題轉移到的編譯時期。
~~~
class Tool<Q> {
private Q obj;
public void setObject(Q obj) {
this.obj = obj;
}
public Q getObject() {
return obj;
}
}
~~~
### Data和日歷類
將日期字符串轉換成日期對象 :是 使用的就是 DateFormat 方法中的 Date parse(String source)
~~~
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];
}
~~~
- 前言
- 內存溢出的解決方案
- 安卓消息推送解決方案
- 語言識別和聊天機器人的實現
- 抽屜效果的實現(DrawerLayout和SlidingMenu的對比)
- 植物大戰僵尸經典開發步驟
- 屏幕適配全攻略
- 安卓圖像處理入門教程
- android開發常用工具箱
- java基礎知識總結
- 剖析軟件外包項目
- java基礎知識——網絡編程、IO流
- 安卓性能優化手冊
- 電商活動中刮刮卡的實現
- Android系統的安全設計與架構
- AsnycTask的內部的實現機制
- Android應用UI設計流程
- 數據結構與算法,每日一道
- html5全解析
- 深入解讀XML解析
- 新聞客戶端案例開發
- 細說Http協議
- win10+ubuntu雙系統安裝方案
- 隨機驗證碼實現案例
- 動態數組的實現案例
- 猜拳游戲案例
- 商業級項目——基金客戶端的架構設計與開發(上)