源文件:.java文件,存儲Java源代碼的文件html
字節碼文件:.class文件,由Java源代碼編譯後生成的.class文件,能夠被JVM讀取和執行的文件。java
運行Java程序,其實就是執行.class字節碼文件,由JVM把字節碼數據再轉爲二進制的機器指令執行。程序員
基本數據類型:8種,byte,short,int,long,float,double,char,boolean算法
引用數據類型:類、接口、枚舉、數組、註解編程
變量根據數據類型的不一樣分爲基本數據類型的變量和引用數據類型的變量。數組
變量根據聲明位置不一樣分爲成員變量和局部變量緩存
(A)局部變量聲明位置:安全
①方法的形參列表服務器
②方法體{}中網絡
③代碼塊{}中
(B)內存存儲的位置不一樣
局部變量:棧
實例變量:堆
類變量:方法區
(C)生命週期
局部變量
實例變量:每個對象的成員變量是獨立的,和對象的生命週期一致
類變量:和類的生命週期一致
(D)做用域
局部變量:做用域很是小,從聲明它的位置開始,到它所屬的}結束,可能只屬於某個if,for,方法等
類變量:整個類中
實例變量:整個類中除了靜態方法和靜態代碼塊中不能使用
(E)修飾符
局部變量:惟一能夠有的修飾符是final
整數與整數相除,只保留整數部分
取模結果的正負號只看被模數
++/--在後的,就先取值,後自增/自減
擴展賦值運算符+=右邊的計算結果的類型若是比左邊的大的話會強制類型轉換,因此結果可能有風險。
比較表達式的運算結果必定只有true/false
&&它和邏輯與不一樣的是當&&左邊爲false時,右邊就不看了。
||它和邏輯或不一樣的時當||左邊爲true時,右邊就不看了。
條件表達式 ? 結果表達式1 : 結果表達式2 //爲true返回1,不然返回2
<< 左移動幾位,右邊補0。左移幾位就是乘以2的幾回方
>> 右移動幾位,左邊補0或1,看最高位。右移幾位就是除以2的幾回方
>>> 右移動幾位,左邊一概補0
按位與:& 運算規則,把兩個數的二進制一一對應,對應位按位與。
按位或:| 運算規則,把兩個數的二進制一一對應,對應位按位或。
按位異或:^ 運算規則,把兩個數的二進制一一對應,對應位按位或。
按位取反:~ 運算規則,把某個數的二進制,按位取反,注意:包括最高位也會取反,這個和從原碼到反碼是不同的。
優先級:須要先計算的就用()括起來
對象1 == 對象2 //比較的是地址,並且對象1和對象2的類型要一致或者是父子類關係,不然編譯不經過
對象 instanceof 類型
只有當該對象屬於這個類型纔會返回true,並且要求該對象的編譯時類型必須與要判斷的類型一致或有父子類關係
引用數據類型的類型或對象,能夠經過 . 來訪問屬性、方法等。
()用於強制類型轉換或優先計算強制類型轉換
流程:解決問題的步驟
(2)分支語句:選擇其中一個分支執行
(3)循環語句:重複執行某些代碼
凡有[]的都是數組
使用class聲明的類型都是類
【修飾符】 class 類名 【extends 父類】 【implements 父接口n】{
}
類中能夠包含5個部分:
(1)成員變量:
靜態成員變量:存儲類共享數據
非靜態成員變量:存儲對象獨立數據
(2)成員方法:完成功能
(3)構造器:建立對象,是實例初始化的一部分
(4)代碼塊:
靜態代碼塊:類初始化的一部分
非靜態代碼塊:實例初始化的一部分
【修飾符】 interface 接口 【extends 父接口們】{
}
接口中的成員有限制要求:
JDK1.8以前:
(1)公共的靜態的常量:public static final
(2)公共的抽象方法:public abstract
JDK1.8以後,增長了:
(3)公共的靜態方法:public static
(1)修飾符:>=父類權限
(2)返回值類型
基本數據類型和void:必須相同
引用數據類型:<=父類類型
(3)方法名:必須相同
(4) 形參列表:必須相同
(5)拋出的異常類型:<=父類類型
【修飾符】 enum 枚舉類型名 【implements 父接口們】{
}
枚舉是一種特殊的類:
(1)枚舉的首行必須是枚舉的常量對象列表;
(2)枚舉的構造器都是private
參數就是一種傳遞數據的方式,因此參數就是一個變量,具備特殊做用的特殊位置的變量。
(1)形參(formal parameter)
在聲明方法時()中的參數
(2)實參(actual parameter)
在調用方法時()中的參數,實參是給形參賦值的,因此實參的個數、類型、順序必須與形參一一對應。
(3)有參(has parameter)
聲明方法時有形參列表,調用方法時有實參列表
(4)無參(no parameter)
聲明方法時沒有形參列表,調用方法時沒有實參列表
(5)命令行參數(command line parameter/ arguments)
運行main時,給main傳的參數
java 類名 命令行參數1 命令行參數2 ....
(6)可變參數(variable parameter)
聲明:
【修飾符】 返回值類型 方法名(【非可變參數部分的形參列表,】 可變參數類型... args)throws 異常列表{
for(int i=0; i<args.length; i++){ //可變參數部分當作數組使用
//...
}
}
(7)類型參數(type parameter,generic Type)
凡是代碼中出如今<>中的類型,就是類型參數。
(8)類型形參(type parameter)
在聲明類/接口時聲明的類型參數,也稱爲泛型形參
【修飾符】 class 類名/接口<類型形參列表>{}
【修飾符】 class 類名/接口<類型形參1 extends 父類上限 & 父接口上限>{}
在聲明方法時聲明的類型參數
【修飾符】 <泛型形參列表> 返回值類型 方法名(【數據形參列表】)【throws 異常列表】{}
【修飾符】 <泛型形參 extends 父類上限 & 父接口上限> 返回值類型 方法名(【數據形參列表】)【throws 異常列表】{}
(9)類型實參(type arguments)
在使用泛型類/接口時指定泛型類型的類型參數
在使用泛型方法時傳給泛型類的變量會自動識別變量類型,即爲泛型方法實參
(10)傳參(pass parameter)
凡是實參給形參賦值都是叫作傳參。
記住:實參與形參的類型、個數、順序一一對應便可。
使用@interface聲明的類型都是註解,只要使用@標記符的都是註解
@元註解
【修飾符】 @interface 註解名{
數據類型 參數名();
數據類型 參數名() default 默認值;
}
(2)給配置參數賦值的標準格式:參數名 = 參數值,可是若是註解的配置參數只有一個,並且名稱是value,那麼在賦值時能夠省略value=
(3)若是配置參數是數組類型,那麼賦值時能夠用「{多個值}」
用於檢測被修飾的方法爲有效的重寫方法,若是不是,則報編譯錯誤!
只能標記在方法上。
文檔註解:
@author 標明開發該類模塊的做者,多個做者之間使用,分割
@version 標明該類模塊的版本
@see 參考轉向,也就是相關主題
@since 從哪一個版本開始增長的
@param 對方法中某參數的說明,若是沒有參數就不能寫
@throws/@exception 對方法可能拋出的異常進行說明 ,若是方法沒有用throws顯式拋出的異常就不能寫
其中 @param @return 和 @exception 這三個標記都是隻用於方法的。
@param的格式要求:@param 形參名 形參類型 形參說明
@return 的格式要求:@return 返回值類型 返回值說明
@exception 的格式要求:@exception 異常類型 異常說明
@param和@exception能夠並列多個
Java異常和錯誤的根父類:java.lang.Throwable
(1)只有是這個類或它的子類的對象,才能被JVM或throw語句「拋」出
(2)也只有這個類或它的子類的對象,才能被catch給「捕獲」
(3)若是用戶須要自定義異常,那麼必須繼承Throwable或它的子類。
Java異常的分類:
try{
}catch(...){
}finally{
//不管try中是否發生異常,也不管catch是否捕獲異常,也無論try和catch中是否有return語句,都必定會執行
}
或
try{
}finally{
//不管try中是否發生異常,也無論try中是否有return語句,都必定會執行
}
語法格式:
try(須要關閉的資源對象的聲明){
業務邏輯代碼
}catch(異常類型 e){
處理異常代碼
....
它沒有finally,也不須要程序員去關閉資源對象,不管是否發生異常,都會關閉資源對象
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
boolean -> Boolean
void -> Void
裝箱:把基本數據類型轉爲包裝類對象。
拆箱:把包裝類對象拆爲基本數據類型。
在緩存範圍內的對象,緩衝的常量對象在方法區直接引用。沒有緩存的對象,每個都是新new的
建立多線程的兩種方式(JavaSE階段)
一、 繼承Thread類
(1)編寫線程類,繼承Thread類
(3)建立自定義線程類的對象
(4)調用start()方法啓動線程
二、實現Runnable接口
(1)編寫線程類,實現Runnable接口
(2)必須重寫public void run(){}
(3)建立自定義線程類的對象
(4)經過Thread類的代理對象,調用start()方法啓動線程
如:MyRunnable my = new MyRunnable();
Thread t = new Thread(my);
t.start();
一、什麼狀況下會有線程安全問題? 多個線程使用了共享數據
二、如何解決線程安全問題? SE階段:synchronized
(1)同步代碼塊
synchronized(鎖對象){
//在一個線程執行期間,不想要被其餘線程打擾的代碼,通常是一次事務的原子性操做。
}
鎖對象:自選的,可是要保證使用共享數據的這多個線程必須共用一個鎖對象(監視器對象)
至因而否能夠選用this做爲鎖對象,要看是否多個線程共用同一個this對象
(2)同步方法
【修飾符】 synchronized 返回值類型 方法名(【形參列表】){
//在一個線程執行期間,不想要被其餘線程打擾的代碼,通常是一次事務的原子性操做。
}
鎖對象:固定,非靜態方法就是this,靜態方法就是當前類的Class對象
多線程間的通訊就是經過鎖對象調用wait()等待與鎖對象調用notify()喚醒來達到多線程間的調度
集合:是一種容器,用來裝對象的容器,不能裝基本數據類型。也能夠說是一種數據結構
Collection
中的集合稱爲單列集合,Map
中的集合稱爲雙列集合。
元素的通用獲取方式。在取元素以前先要判斷集合中有沒有元素,若是有,就把這個元素取出來,繼續在判斷,若是還有就再取出出來。一直把集合中的全部元素所有取出。
專門操做 List 集合的一些方法
ArrayList、Vector 順序結構,線性的,動態數組的實現
Stock 鏈式結構,先進後出,棧結構
LinkedList 鏈式順序結構,雙端隊列,雙鏈表的實現,既能夠用做FILO堆棧使用,又能夠用做FIFO隊列使用。
HashSet、底層new的 HashMap
LinkedHashSet 、底層new的 LinkedHashMap
TreeSet 底層new的TreeMap
HashMap、Hashtable
LinkedHashMap
TreeMap
Properties
Collections 是一個操做 Set、List 和 Map 等集合的工具類
File類:文件和目錄路徑名的抽象表示形式。File
類的實例是不可變的
IO流是用於數據輸入與輸出
一、四大超類,抽象類
(1)InputStream:字節輸入流
(2)OutputStream:字節輸出流
(4)Writer:字符輸出流
二、常見IO流
FileInputStream:文件字節輸入流,能夠讀取任意類型的文件
FileOutputStream:文件字節輸出流,能夠把字節數據輸出到任意類型的文件
FileReader:文件字符輸入流,只能讀取純文本的文件。按照平臺默認的字符編碼進行解碼。
FileWriter:文件字符輸出流,只能把字符數據輸出到純文本文件。按照平臺默認的字符編碼進行編碼。
(2)緩衝IO流
String readLine():按行讀取
BufferedWriter:字符輸出緩衝流,給Writer系列IO流增長緩衝效果
void newLine():輸出換行符
void flush()
(3)編碼與解碼的轉換流
編碼:OutputStreamWriter
能夠把字符流轉爲字節流輸出,而且能夠指定字符編碼。
應用場景:可將要寫入的字符源爲字節流的數據轉爲字符類型寫入並可按指定字符集再編碼成字節存儲
能夠把字節輸入流轉爲字符輸入流,而且能夠指定字符編碼。
應用場景:讀取源爲字符類型的字節流可指定字符集解碼成字符流,以便閱讀
(4)數據IO流
它倆必須配對使用,讀的順序要與寫的順序一致
(5)對象IO流,同上也需配對,讀寫順序一致
ObjectOutputStream:對象序列化,輸出對象,把對象轉爲字節序列輸出
void writeObject(Object obj)
ObjectInputStream:對象反序列化,讀取對象,把字節序列重構成Java對象
Object readObject()
(6)打印流
PrintStream、PrintWriter:println()和 print()
(7)文本掃描儀
Scanner
Socket:通訊的兩端都要有Socket(也能夠叫「套接字」),是兩臺機器間通訊的端點。網絡通訊其實就是Socket間的通訊。
調用 accept() :監聽鏈接請求,若是客戶端請求鏈接,則接受鏈接,返回通訊套接字對象。
調用 該Socket 類對象的 getOutputStream() 和 getInputStream () :獲取輸出流和輸入流,開始網絡數據的發送和接收。
關閉Socket 對象:客戶端訪問結束,關閉通訊套接字。
打開鏈接到 Socket 的輸入/ 出流: 使用 getInputStream()方法得到輸入流,使用getOutputStream()方法得到輸出流,進行數據傳輸
按照必定的協議對 Socket 進行讀/ 寫操做:經過輸入流讀取服務器放入線路的信息(但不能讀取本身放入線路的信息),經過輸出流將信息寫入線路。
關閉 Socket :斷開客戶端到服務器的鏈接,釋放線路
類的加載又分爲三個階段
(1)加載:load (2)鏈接:link ①驗證②準備③解析
不會致使類的初始化的狀況,其餘都會
(1)使用某個類的靜態的常量(static final)
(2)經過子類調用父類的靜態變量,靜態方法,只會致使父類初始化,不會致使子類初始化,即只有聲明靜態成員的類纔會初始化
類加載器
(1)引導類加載器(Bootstrap Classloader)又稱爲根類加載器
(2)擴展類加載器(Extension ClassLoader)
(3)應用程序類加載器(Application Classloader)
(4)自定義類加載器
(1)類型名.class
(2)對象.getClass()
(3)Class.forName(類型全名稱)
(4)ClassLoader的類加載器對象.loadClass(類型全名稱)
能夠獲取:包、修飾符、類型名、父類(包括泛型父類)、父接口(包括泛型父接口)、成員(屬性、構造器、方法)、註解(類上的、方法上的、屬性上的)
一、直接經過Class對象來實例化(要求必須有無參構造)
二、經過獲取構造器對象來進行實例化
(2)獲取屬性對象 Field field = clazz.getDeclaredField("username");
(3)設置屬性可訪問 field.setAccessible(true);
(4)建立實例對象:若是操做的是非靜態屬性,須要建立實例對象 Object obj = clazz.newInstance();
(4)設置屬性值 field.set(obj,"chai");
(5)獲取屬性值 Object value = field.get(obj);
若是操做靜態變量,那麼實例對象能夠省略,用null表示
(1)獲取該類型的Class對象 Class clazz = Class.forName("com.atguigu.service.UserService");
(2)獲取方法對象 Method method = clazz.getDeclaredMethod("login",String.class,String.class);
(3)建立實例對象 Object obj = clazz.newInstance();
(4)調用方法 Object result = method.invoke(obj,"chai","123);
若是方法的權限修飾符修飾的範圍不可見,也能夠調用setAccessible(true)
強調作什麼,而不是以什麼形式作
只要能獲取到結果,誰去作的,怎麼作的都不重要,重視的是結果,不重視過程
標記了@FunctionalInterface
Java8新增了四大類,消費型、供給型、判斷型、功能型。
Lambda表達式語法格式
(形參列表) -> {Lambda體}
說明:
(形參列表)它就是你要賦值的函數式接口的抽象方法的(形參列表),照抄
{Lambda體}就是實現這個抽象方法的方法體
->稱爲Lambda操做符(減號和大於號中間不能有空格,並且必須是英文狀態下半角輸入方式)
優化:Lambda表達式能夠精簡
當{Lambda體}中只有一句語句時,能夠省略{}和{;}
當{Lambda體}中只有一句語句時,而且這個語句仍是一個return語句,那麼return也能夠省略,可是若是{;}沒有省略的話,return是不能省略的
(形參列表)的類型能夠省略
當(形參列表)的形參個數只有一個,那麼能夠把數據類型和()一塊兒省略,可是形參名不能省略
方法引用的語法格式:
(1)實例對象名::實例方法
(2)類名::靜態方法
說明:
::稱爲方法引用操做符(兩個:中間不能有空格,並且必須英文狀態下半角輸入)
Lambda表達式的形參列表,所有在Lambda體中使用上了,要麼是做爲調用方法的對象,要麼是做爲方法的實參。
構造器引用的語法格式:
類名::new
數組類型名::new
(1)當Lambda表達式是建立一個對象,而且知足Lambda表達式形參,正好是給建立這個對象的構造器的實參列表。
(2) 當Lambda表達式是建立一個數組對象,而且知足Lambda表達式形參,正好是給建立這個數組對象的長度
①Stream 本身不會存儲元素。
②Stream 不會改變源對象。每次處理都會返回一個持有結果的新Stream。
③Stream 操做是延遲執行的。這意味着他們會等到須要結果的時候才執行。