1. java中數據類型分爲兩種
基本數據類型:數值型,字符型,布爾型
引用數據類型:類,接口,數組
基本數據類型所佔空間固定,有別與C++,java中沒有無符號數
byte:1字節
short:2字節
char:2字節,java採用unicode編碼
int:4字節
long:8字節 long l = 3l;
float:4字節 申明浮點類型變量並複製 float f = 3.14f; 由於默認浮點數爲doble,整型數爲int
double:8字節
boolean:只能取值爲true或false,不能以0或非0的數值代替
2. 標識符
通常類名大寫,包名、方法名、變量名小寫,少用下劃線
3. 運算符
java中多了個無符號右移運算符 >>> ,最高位爲在右移會補0
對於int型數據移位a>>b,系統先將b對32取模,獲得得結果纔是真正的移位的位數,long型則對64取模
+運算符中兩側的操做數只要有一個是字符串類型(String),系統就會自動將另一個操做數轉換爲字符串而後進行鏈接
int i = 9;
Srting s = "helo" + i + "號";
4. 語句
java中沒有表達式語句這個概念: x+y;這條語句是不合法的
java中switch 語句中的表達式可使字符,數字和 字符串 類型
java中沒有goto,可是能夠break和continue後加標號實現相似功能,可是break只能從裏層循環跳到外層循環
定義java數組 int [] a = new int[3];int a[] = new int[3]; int a[] = {1,2,4};
int a[5];//非法,由於java中數組是引用類型,a在這裏只是一個引用
Array.copy(source,0,dest,0,source.Length);提供了數組元素複製功能
int [][]a = new int [3][];
a[0] = new int[4];
a[1] = new int[5];
a[2] = new int[3];
5. 構造
java中可使用this在構造函數中調用本身的另一個構造方法,或者super調用父類的構造方法,這條調用語句必須放在第一句,且只可以有一條,在C++中則不能
若是沒有super,java類中構造函數內部會自動加上super調用相應的構造函數
針對沒有相應構造函數,但又要賦值在java能夠用雙括號這樣寫
Person p = new Person(){{age = 18;name = "李明"}};
6. 派生子類
java中的繼承是使用extends關鍵字來實現的
若是沒有extends子句,則該類默認爲java.lang.Object的子類,全部的類都是直接或者間接地繼承java.lang.Object獲得的
class A extends B{};
須要明確使用父類的屬性和方法時使用super關鍵字
7. 包
包及子包的定義其實是爲了解決名字空間,名字衝突
包有兩層含義:一是名字空間、存儲路徑(文件夾);一是可訪問性(同一包中的各個類,默認狀況下可相互訪問)
包層次的根目錄是由環境變量CLASSPATH來肯定的
8. import語句
import用來導入所須要的類
例如:
import java.util.Date;
import java.awt.*
import java.awt.event.* //使用*號只能表示本層次的全部類,不包括子層次下的類
9. 訪問控制
定義類時也可使用訪問控制符,若是使用public控制符,則該類能夠被其餘全部類訪問,若使用默認控制符,
則只能夠被同包中的類訪問
10. final修飾符
final類不能被繼承,無子類
final方法不能被子類覆蓋
final字段及final局部變量的值一旦給定就不能修改,是隻讀變量,只能被賦值一次
一個字段被static final兩個修飾符限定時能夠表示常量
11. java中有抽象類和抽象方法,使用abstaact修飾
抽象類能夠包含抽象方法,也能夠不包含,可是一旦某個類中包含了抽象方法,這個類必須申明爲抽象類
抽象方法在子類中必須實現,不然子類仍然是抽象的。
12. 接口
接口中定義的變量爲常量,省略了public,static,final
默認接口中的方法爲public,在接口的實現中應該寫出來
接口中的方法都是默認方法
java8以上能夠有static方法就不是抽象了,還能夠有具備實現體的方法(默認方法)
接口能夠多繼承其餘接口,類再實現接口,就能夠實現多繼承了
//接口中的變量爲public static final類型,函數public abstract類型,無論你寫不寫
interface Inter{
public static final int AGE = 100;
public abstract void tell();
}
13. 原文件名必須與屬性爲public的類名徹底相同,在一個.java文件中package語句和public類最多隻有一個
14. 字段變量和局部變量
java中屬性或者成員變量爲字段變量,方法中的變量或者參變量爲局部變量,字段變量屬於類。
存儲位置:成員變量存儲在堆中的對象裏面,局部變量的數據存儲在棧類型中。
初始值:字段變量能夠自動賦值,局部變量則能夠顯式賦值。
局部變量必須初始化,通常的成員變量能夠不初始化。
14.1 java變量的存儲位置和區別
寄存器:由編譯器根據需求分配,咱們沒法再程序中控制
棧:存放基本類型的變量數據和對象引用,但對象自己不放在棧中,而是存放在堆中(new出來的對象)或者
常量池中(字符串常量對象存放在常量池中)
堆:存放左右new出來的對象
靜態域:存放靜態成員(static定義的)
常量池:存放基本類型常量和字符串常量
棧中的數據大小和生命週期是能夠肯定的,當沒有引用指向數據時,這個數據就會消失。
堆中的對象由垃圾回收器負責回收。
棧和常量池中的對象能夠共享,堆中的對象不可共享。
15. 多態和虛方法調用
java中的類類型是引用,裏面的普通方法都是虛方法,根據實例調用相應的方法實現多態,C++中必須加virtual關鍵字
static與實例無關,private,final方法不會被虛化
動態類型肯定運算符instanceof,返回值爲true,false
for(int i = 0;i < objs.length;i++){
if(objs[i] instanceof Integer){
s += ((Integer)objs[i]).intValue();
}
else{
if(objs[i] instanceof Double)
s += ((Double)objs[i]).doubleValue();
}
}
16. 垃圾回收
System.gc()方法能夠請求系統進行垃圾回收
java中finalize方法相似於其餘語言的析構方法,系統在回收時會自動調用對象的finalize方法
17. 內部類
在內部類中能夠直接訪問外部類的字段和方法,即便private也能夠
若是內部類中有與外部類同名的字段和方法,則能夠用 外部類名.this.字段或方法
擁有內部類的外部類只能使用public修飾或者默認
用static修飾內部類,代表該內部類實際是一種外部類,由於它與外部類實例無關,static類不能訪問其外部類的非static的字段及方法,只可以訪問static成員,static方法中也不能訪問非static的域及方法
內部類的使用方法
class A{
class B{
}
}
class C{
static class D{
}
}
public class mo {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a = new A();
A.B b = a.new B();
A.B a_b = new A().new B();
C.D d = new C.D();//right
// C.D d = C.new D();//error
// C.D d = new c().new d();//error
}
}
18. 局部類
同局部變量同樣,方法中的內部類,不能使用public,private,protected,static修飾,可是能夠被final或者abstract修飾
能夠訪問其外部類成員,不可以訪問該方法的局部變量,除非是final局部變量
19. 匿名類
不取名字,直接使用父類或者接口的名字
也就是說該類是父類的子類,或者實現了一個接口
編譯器生成XXXX$1之類的名字
類定義的同時就建立實例,即類定義前面有一個new
不使用關鍵詞class,extends,implements等
在構造對象時使用父類的構造方法
不可以定義構造方法,由於它沒有名字
若是new對象時須要參數,則使用父類的構造方法
20. Lambda表達式
能寫成Lanbda的接口要求包含且最多隻能有一個抽象函數
21. 裝箱和拆箱
Integer I = 10;//裝箱,能夠直接賦值,將基本類型包裝爲Object(引用類型)
等同於:
Integer I = Integer.valueOf(10);
int i = I;//拆箱,直接賦值,將引用類型轉換爲基本類型
等同於:
int i = I.intValue();
Object []ary = {1, "aaa"};//其中1就被裝箱了
22. 自定義枚舉
23. 註解
又稱爲註記、標記、標註、註釋(不一樣於commnets)
是在各類語法要素上加上附加信息,以供編譯器或者其餘程序使用
全部的註解都是java.lang.annotation.Annotation的子類
經常使用註解
@Override 表示覆蓋父類方法
@Deprecated 表示過期的方法
@SuppressWarnings 表示讓編譯器不產生警告
自定義註解:
24. 裝箱是否相等
使用 == 進行判斷時基本類型能夠直接判斷,引用類型得看引用得對象是否相同
Integer i = new Integer(10);
Integer j = new Integer(10);
Sysytem.out.println(i == j);//false,,由於對象時是兩個
Integer i = 10;//實際上使用了valueOf()函數,這個函數給-128-127的數進行了緩存
Integer j = 10;
Sysytem.out.println(i == j);//true,,由於對象有緩存
Integer i = 220;
Integer j = 220;
Sysytem.out.println(i == j);//false,,由於對象是兩個
基本類型緩存的範圍
true,false,byte,char \u0000 - \u007f
int,short -128-127
在緩存範圍內裝箱的對象時相等的
25. 枚舉,引用對象是否相等
枚舉類型內部進行了惟一實例化,因此能夠直接判斷
引用對象:若是要判斷內容是否相等,則要重寫equals方法,若是重寫equals方法,則最好重寫hashCode方法
String對象,判斷相等必定不要用==,要用equals
字符串常量能夠直接用 == 比較,字符串常量被內部化了interned,有點像整數的包裝
String hello = "Hello",lo = "lo";
System.out.println(hello == "Hello");//true
System.out.println(mo.ot == "Hello");//true
System.out.println(hello == ("Hel"+"lo"));//true,編譯器已經把它合成爲「Hello"
System.out.println(hello == ("Hel"+lo));//false,和變量相加不會合成字符串常量
System.out.println(hello == new String("Hello"));//false
System.out.println(hello == ("Hel"+lo).intern());//true
26. finally
finally語句不管是否有異常都要執行,即便其中有break,return語句
27. Eclipse調試java
F5 逐語句執行
F6 逐過程執行
F7 跳出函數
Ctrl+R 運行到光標處
監視
即時監視:鼠標指向變量
快速監視:點右鍵,Inspector
添加監視:點右鍵,Watch
還能夠看調用堆棧
28. 經常使用的方法(Object)
equals() //判斷內容是否相同, == 是判斷引用是否相等,通常重載了 equals方法也會重載hashCode方法
getClass() //final方法,返回一個對象在運行時所對應的類的表示
toString() //返回對象的字符串表示
finalize() //對象清除
與線程相關
notify()
notifyAll()
wait()
29. 基本類型對應的包裝類
Character,Byte,Short,Integer,Long,Float,Double,Boolean
包裝類的特色
1)提供了一些常數:
如Integer.MAX_VALUE(整數),Double.NaN(非數字),Double.POSITIVE_INFINITY(正無窮)
2)提供了valueOf(String),toString():用於從字符串轉換或轉換爲字符串
3)經過xxxxValue方法能夠獲得所包裝的值:如Integer對象的intValue方法
4)對象中包裝的值是不可改變的,要想改變對象的值的只能從新生成對象
5)toString(),equals()方法進行了覆蓋
除了以上特色有些類還提供了一些實用的方法以方便操做:如Double類提供了parseDouble(),max,min等
30. 建立線程的兩種方法
1)經過繼承Thread類建立線程
class MyThread extends Thread{
public void run(){
}
}
2)經過Thread()構造方法傳遞Runnable對象來建立線程
class MyTask implements Runnable{
public void run(){
}
}
Thread thread = new Thread(mytask);
thread.start();
3)使用匿名類來實現Runnable
new Thread(){
public void run(){
}
}
4)使用Lambda表達式
(new Thread()->{}).start();
31. 線程相關的方法
start() //啓動線程
run() //run函數結束線程結束
setPriority(int priority) 設定線程的優先級
setDeamon(true) //設置守護進程,主線程結束deamon線程也會結束
32. 同步
互斥鎖
關鍵字synchronized用來與對象的互斥鎖聯繫
synchronized的用法
1)對代碼片斷
synchronized(對象){...}
2)對某個方法
放在方法申明中
public synchronized void push(char c){...}
33. 輸入輸出流
字節流與字符流
字符流:Reader,Writer
字節流:InputStream,OutputStream
重要方法:
InputStream:read() //讀取的是字節
OutputStream:write(),flush() //刷新緩存,實際寫入到文件、網絡,close() //關閉流
Reader:read() //讀取的是字符
Writer:write() //寫入的是字符
34. 節點流和處理流
節點流:能夠從一個特定的地方讀寫數據,如文件流FileInputStream,內存流ByteArrayInputStream
處理流:是對一個已存在的流的鏈接和封裝,又稱爲過濾流,如緩衝處理流BufferedReader
35. 標準的輸入和輸出
System.in 爲InputStream類型
System.out 爲PrintStream類型
System.err 爲PrintStream類型
從標準輸入讀取數據:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
36. Scanner類從控制檯獲取數據
String next() //接收控制檯輸入的一個字符
String nextLine() //接收控制檯輸入的一個字符串
int nextInt() //接收控制檯輸入的一個int型數據
double nextDouble() //接收控制檯輸入的一個double數據
boolean nextBoolean() //接收控制檯輸入的一個boolean數據
例子:
Scanner scanner = new Scanner(SYstem.in); //儘可能直接避免在控制檯輸入中文
37. 引用傳遞
java裏面只有基本類型是按值傳遞,比較特殊是String類的對象由於沒法更改,出現更改時其實是生成了新的String對象,能夠把String類型當作按值傳遞
38. 泛型
泛型做爲函數參數時有兩種方式,一種是不指定類型
class Info<T>{};
class Demo{
public void fun(Info i){
}
}
一種是使用通配符,且使用通配符比較多
class Demo{
public void fun(Info<?> i){
}
}
除了類以外接口也能夠定義爲泛型
39. jsp註釋
<%-- --%>
40. jsp編譯指令
50. JDBC編程的五個步驟
加載驅動->打開鏈接->執行查詢->處理結果->清理環境
Eclipse快捷鍵及配置
Alt + / //代碼提示,補全名稱
在項目代碼裏面右鍵進入preference是配置本項目選項,windows->preference是設置全局的
代碼提示設置
eclipse默認只有 . 號後有代碼提示,能夠在preference—>java->Editor->Content Assist中設置出現其餘字符時也提示
代碼字體設置
進入preference—>General->Appearence->color and Fonts,右邊選擇java->java Editor Text Font,能夠設置字體和大小,其餘以此類推
查看並修改eclipse預約義的快捷鍵
preference—>General->Editor->keys
ctrl + / //註釋選中的代碼或者光標所在的行
輸入 /** 回車後能夠自動建立java doc註釋,若是下面是函數的話,能夠自動生成參數和返回值的java doc信息
輸入syso後 再用名稱補全 能夠獲得 System.out.println(); ,syse可得System.err.println();
ctrl + 1快捷修復
例如:int i = 100L; //將鼠標放在出錯的行使用 ctrl + 1 能夠彈出修復選項,也能夠懸停在錯誤處直接彈出
F2 也能夠快捷修復
ctrl + d //刪除選中的代碼或者光標所在的行
Shift + Enter //在光標所在行的下一行迅速建立新的一行,對於某行代碼比較長鬚要換行是比較實用
tab //將光標自動縮進到當前行代碼的正確位置
Ctrl + F11 //快速運行代碼
Alt + ↑或↓ //快速上下移動選中的代碼或者行
Ctrl + Alt + ↑或↓ //快速上下複製選中的代碼或者行
Ctrl + m //將光標所在的eclipse視圖最大化,再按一次可還原
Shift + Ctrl + F //自動排列選定的代碼格式
須要搞清楚的問題:
1. java裏面各類數據類型的數據的生命週期和初始化順序以及存儲位置
2. JNI (java Native Interface)
3. java中的比較,hashCode方法時怎麼回事
4. java成員函數中不能定義靜態變量
5. java的集合java