/-matool API查詢網站
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、虛擬空間、營銷軟件、網站建設、淮北網站維護、網站推廣。重點內容:
第一階段:變量:數據類型
運算符:二進制
控制結構:循環
數組排序和查找:數組
面向對象編程:成員方法,成員方法傳參機制,構造器
面向對象編程(中級):封裝,繼承,多態
第二階段:面向對象編程(高級):類變量和類方法,接口,內部類
Exception:異常體系圖,異常處理
常用類:string,stringbuffer,stringbuilder
集合:
泛型:自定義泛型
線程:線程使用,Synchronized,互斥鎖
IO流:輸入流,輸出流
開發注意事項:
1一個源文件中最多只能有一個public類,其他類的個數不限
2如果源文件包含一個public類,則文件名必須按該類名命名
3.一個源文件中最多只能有一個public類。其它類的個數不限,也可以將main方法寫在非public類中,然后指定運行非public類,這樣入口方法就是非public的main方法
/r為回車:回車后光標會回到“韓”字前,然后“韓順”被“北京”代替
使用tab鍵,實現縮進,整體右移。Shift+tab整體左移。
相對路徑和絕對路徑:
加號的說明:
兩邊都是數值型的時候做加法運算,左右兩邊有一方為字符串時做拼接運算
基本數據類型:
+byte
使用long類型時,需要在變量后面加一個‘l’或“L“
例:long a = 10l;
Java默認浮點型常量為double型,因此在使用float型時需要在變量后面加上l或L
例:floa a = 1.1l;
浮點型可以寫成.123 等價于0.123
對于運算結果時小數的進行判斷時,應該用兩個數的差值的絕對值,在某個精度范圍內判斷。
不同的字符編碼表之間有所不同:
ASCII編碼表:一個字符一個字節
Unicode編碼表:字母和漢字都占用兩個字節(最多編碼2的16次方個字符)
utf-8:字母一個字節,漢字三個字節
等等。
布爾類型(boolean):賦值只能為true/false
在將精度(容量)大的數據類型轉換成精度(容量)小的數據類型時會報錯。
(Byte,short)和char之間不能相互轉換,也不能自動轉換
Byte,short,char之間或者同類型之間進行運算時,會轉換為int類型。
Boolean不參與類型的自動轉換。
字符串和其它數據類型之間的轉換:
其它類型轉字符串:+“”
字符串轉其它類型:
取模:a % b =a-a/b*a;
結果的正負值要取決于a的負號。
重點:
關系運算符的運算結果為布爾類型:即ture或false
短路與:&& 邏輯與:&
對于短路與,如果第一個條件為假,則后面的條件不再判斷,即不執行,效率高
對于邏輯與,如果第一個條件為假,后面的語句仍會執行
短路或:|| 邏輯或:|
效果同短路與和邏輯與
^:邏輯異或
復合賦值運算符會進行類型轉換
byte b = 3;
b +=2;等價于b = (byte)(b+2);
輸入的實現:
1引入java.util.Scanner,java.util下的Scanner類
2.創建一個類的對象,new創建對象
Scanner myScanner = new Scanner(System.in);
3.接收
String name = myScanner.next();輸入為字符串類型
int age = myScanner.nextInt();輸入為整形
double salary = myScanner.nextDouble();輸入為浮點型
四種進制:
二進制:以OB或Ob開頭
八進制:以數字0開頭
十六進制:以OX或Ox開頭 ,并且A-F不區分大小寫
按位與:&
按位或:|
按位異或:^
按位取反:~
位運算符:
>>算數左移:地位補0
<<算數右移:高位補符號位
>>>邏輯右移:地位溢出,高位補0
沒有邏輯左移
switch:返回類型必須是byte,short,int,char,enum,String類型之一。
case:值必須為常量或者常量表達式
break后面加標簽:可以表示終止某個循環,類似于goto
判斷兩個字符串:推薦第二種
如:String name;
Name.equals(“字符串內容”)或”字符串內容”.equals(name)
數組:
數組類型[ ] 數組名 ([ ])= new 數組類型[個數]
double[] score = new double[5];
或
double score[];
score = new double[5];
數組賦值:arr2是arr1的一份拷貝,當arr2改變時,arr1也改變
冒泡排序:優化:j初始值為1,增加count變量,若執行一次交換則count增加,若count在循環后為0則提前終止循環。
動態開辟二維數組空間:
面向對象(基礎):
對象中的整型放在堆區,字符串類型放在方法區中的常量池。
過程:
1先加載類信息(屬性和方法信息,只會加載一次)
2在堆中分配空間,進行默認初始化
3把地址賦給用類創建的變量,變量指向對象
4.進行指定初始化
方法重載:減輕記名麻煩
要求:方法名相同,形參的類型或個數或順序不同。
注意:返回類型不同不能構成重載。
可變參數,寫法(變量類型... 變量名)
可以接受0-多個參數,此時的變量名相當于數組名,可以用變量名.length獲得參數個數,用變量名[i]訪問每個變量。
細節:
可變參數的實參可以為數組,即直接傳入一個數組。
可以同時存在普通類型的參數和可變參數,但是可變參數必須在最后。
一個形參列表中只能出現一個可變參數。
作用域細節:
屬性和局部變量可以重名,訪問時遵循就近原則。如:
此時name的值為“king”
全局變量可以加修飾符
局部變量不能加修飾符
構造方法/構造器:完成對新對象的初始化,類似于構造函數
細節:
一個類可以定義多個構造器,即構造器重載
This指針:當構造方法中的形參的類的對象名字相同時,可以在對象前加this.來區分
在一個構造器中訪問另一個構造器時(本類),需要使用this(參數列表)
注意:需要將this語句放在第一條語句,只能在構造器中使用。
在需要獲取數組的大值時,為了避免傳入的數組為空值,或者數組地址為null時,需要加上判斷,當地址為null時,arr.length語句會報錯。
直接new 類名(),此方法只創建一個對象,而沒有返回,屬于匿名對象,匿名對象在使用后,就不能使用。
IDEA中的快捷鍵:
Ctrl+D 刪除當前行(自己配置)
Alt+/ 補全代碼
Ctrl+alt+l 格式化代碼
Alt+r 運行程序(自己配置)
將光標放在方法上,ctrl+B(或鼠標左鍵)可以定位到方法
模板快捷鍵:
Fori,輸出for循環
Sout,輸出System.out.println語句
包
創建不同的文件夾來保存類文件
方法如下:
命名規則:不能以數字開頭,不能是關鍵字或保留字。
命名規范:com.公司名.項目名.業務模塊名
如:
Arrays.sort(數組名),對數組進行升序排列。
Package的作用是聲明當前類所在的包,需要放在類(或者文件)的最上面。
類只能用public和默認來修飾。
類的成員方法和屬性可以用四個來修飾。
封裝:
可以隱藏實現細節
可以對數據進行驗證,保證安全合理
實現:
將屬性私有化
提供一個公共的set方法,用于修改私有屬性的值
提供一個公共的get方法,用于獲取私有屬性的值
構造器也同樣需要對數據進行檢測,因此可以把set方法寫入構造器中,實現對數據賦值的同時完成驗證。
繼承:
可以解決代碼復用。
基本語法:
class 子類(派生類) extends 父類(基類){}
細節:
子類必須調用父類的構造器,完成對父類的初始化
子類在調用構造器時,會自動調用父類的無參構造器,super語句(被隱藏)
若父類中無無參構造器,則需要用super語句指定構造器
super()和this()都只能放在構造器第一行,因此這兩個方法不能共存在一個構造器。
Object類時所有類的基類
父類構造器的調用不限于直接父類!將一直追溯到Object類,即父類的父類的無參構造器也會被調用等。
Java中是單繼承機制,即一個類只能繼承一個,可以用A繼承B,B繼承C,來實現A同時繼承B和C。
繼承訪問:
此時aa.name的值為大頭兒子,aa.hobby的值為旅游:以此方法在訪問變量時,會從當前類開始尋找,若當前類沒有,會依次往上尋找,直到找到為止或報錯。
此時aa.age會報錯,在Father類中有age但是沒有權限,不會再往上尋找。
Super的使用:(訪問父類)
super.語句,訪問父類屬性和方法,private屬性除外
訪問父類構造器
語句:super();
方法重寫(覆蓋):
實現條件:子類和父類的方法,參數,方法名均相同。此時子類的方法覆蓋父類的方法。
1返回類型可以相同,或者子類的返回類型是父類返回類型的子類。如:
String是Object的子類
2子類方法不能縮小父類方法的訪問權限。
錯誤示例:子類是protected,父類是public。
多態:
方法的多態:體現在方法的重載和重寫
對象的多態:
一個對象的編譯類型和運行類型可以不一致。
編譯類型看定義時 = 號的左邊,運行類型看 = 號的右邊
animal1的編譯類型時animal,運行類型時cat。
此時animal1.cry()相當于cat.cry(),因為animal的運行類型時cat。
重新指定后:
animal1的編譯類型依然是animal,運行類型變為dog。
細節:
1向上轉型:父類的引用指向了子類的對象。如上圖舉例。
2向下轉型:
animal可以通過強轉再次變成cat類型,因為animal本身在編譯后為cat類型,但是不能轉換成dog類型。
屬性沒有重寫之說!屬性的值看編譯類型,如下圖輸出結果為10.
Instaniof語句,用于判斷對象的運行類型是否是XX類型或其子類型。
動態綁定機制:
1當調用對象方法的時候,改方法會和該對象的內存地址/運行類型綁定
2當調用對象屬性時,沒有動態綁定機制,哪里聲明哪里使用
多態數組:如
Object類:
==運算符:判斷兩個值是否相等,或是兩個地址是否相同
equals是Object類中的方法,只能判斷引用類型地址
查看方法源碼:ctrl+左鍵
注意:
在Object子類中往往重寫改方法,用于判斷內容是否相等。
HashCode方法:
1提高具有哈希結構的容器的效率
2兩個引用,如果指向的是同一個對象,則哈希值肯定是一樣的,如果不是,則哈希值肯定不一樣。
3哈希值主要根據地址號來,但是不完全等價于地址
Tostring方法:
方法重寫后:把對象的屬性輸出,也可以自己修改
直接用sout輸出一個對象等價于sout 對象名.toString
Debug斷點調試:可以在調試過程中加斷點
F8逐行執行
F7跳入方法(查看方法)
Shift+F8跳出方法
F9直接跳到下一個斷點
零錢通:
日期顯示:
類變量:
用static修飾的變量,是類共有的變量,可以通過類名來訪問。同時需要遵守訪問修飾符的權限。
類方法和類變量相似。
細節:
類方法中不能使用和對象有關的關鍵字,如this和super。
類方法只能訪問靜態變量或靜態方法。
要在靜態方法中訪問,非靜態方法或變量的話,可以通過在靜態方法中new一個類,通過類訪問非靜態成員。
main方法:
由java虛擬機調用,而虛擬機所在為不同類,因此為public
Java虛擬機在執行main方法時,不必創建對象,所以為static
Java執行的程序,參數1,參數2,參數3,作為三個字符串數組傳入args數組中
代碼塊:
(修飾符(static)){
代碼
}(;)
代碼塊在構造器被調用時優先執行。
當有static修飾時,代碼塊隨著類的加載而執行,并且只會執行一次
普通代碼塊:在對象創建時執行(new)
類的加載:在創建對象實例時(new)
創建子類對象實例,父類也會被加載(父類先加載)
使用類的靜態成員時
創建對象時:在一個類中調用順序:
(1)使用new創建對象之后,靜態代碼塊和靜態屬性初始化調用的優先級一樣,哪個在前先調用哪個,如上圖先調用靜態代碼塊。多個靜態代碼塊和多個靜態屬性初始化的調用順序同樣。
(2)普通代碼塊和普通對象初始化,順序同上
(3)調用構造方法
構造器代碼順尋:
(1).父類構造器
(2)本類代碼塊
(3)本類構造器代碼
總結:先執行靜態(先父類后子類),再普通(先父類后子類)。
靜態代碼塊只能調用靜態成員,普通代碼塊可以調用任意成員。
單例模式-餓漢式:
1將構造器私有化
2在類的內部直接創建
3提供一個公共的static方法,返回對象
缺點:創建了對象但是沒有使用,造成資源浪費
單例模式-餓漢式:
1構造器私有化
2定義一個static靜態對象
3提供一個public的static方法,可以返回一個對象
4當用戶使用getInstacnce時才返回對象,再次使用時返回同一個對象。
final關鍵詞:
1可以用來修飾類:使類無法被繼承(不希望被其中方法被重寫)
2修飾方法,使方法無法被改寫
3修飾屬性,使屬性無法被修改
4修飾局部變量,使無法被修改
細節:
1被final修飾的變量,需要在進行初始化,如在定義時,通過構造器,通過代碼塊
如果還有static修飾,則不能在構造器中賦值(代碼塊為靜態)
2.final不能修飾構造器
3..final和static搭配使用,效率更高,不會導致類加載
4.包裝類都是final類型,如String
抽象類:
當父類的一些方法不能確定時,用abstra修飾該方法。
用abstra修飾的方法沒有方法體
抽象類不能被實例化(不能通過new的方式創建)
抽象類可以沒有抽象方法,有抽象方法的類必須是抽象類
abstra只能修飾類和方法
抽象類本質還是類,可以有任意成員
當一個類繼承抽象類后,它本身必須是一個抽象類或者實現父類中所有的抽象方法
抽象方法不能被private,final,static關鍵詞修飾
接口:
interface 接口名{}
class 類名 implements 接口{
自己的屬性
自己的方法:
必須實現的接口的抽象方法
}
細節:
接口不能被實例化(即new)
接口中的方法都是public方法,抽象方法可以不用abstra修飾
一個普通類實現接口,必須將改接口所有方法實現,可以使用alt+enter
抽象類去實現接口時,可以不實現接口的抽象方法
一個類可以實現多個接口
接口中的屬性都是public static final 修飾符
接口可以繼承接口,不能繼承類
接口的修飾符只能是public或者默認,和類相同
接口可以解決單繼承的問題
內部類:
局部內部類:
即在類中的一個方法中的類,該類可以直接訪問外部類所有的成員(包括私有),不能使用修飾符(本質上是局部變量),但是可以用final修飾
作用域:僅僅在定義它的方法或代碼塊中。
外部類在方法中可以創建內部類對象,然后調用成員
當外部類和內部類的成員重名時,訪問時默認遵循就近原則,可以通過外部類.this.成員,來訪問
匿名內部類:
是一個類,同時是一個對象。是一個局部變量。
作用:簡化開發
匿名內部類的本質是一個匿名類繼承一個類或者實現一個接口
第二個演示表示匿名內部類是一個對象。
匿名內部類可以當作實參直接傳遞
創建內部成員類的方法:
2.
靜態內部類:
是類的成員,遵循相同的訪問規則。
枚舉:
將構造器私有化,刪掉set方法,將定義常量對象寫在前面。
細節:
創建枚舉對象時,自動繼承了Enum類。
成員必須放在前面,且用逗號隔開,最后一個用分號。
如果調用的構造器是無參時,“()”可以省略。
Enum的成員方法:
name()返回成員名稱
ordinal()返回成員序號(從0開始)
values()返回成員數組
可以通過增強for循環來實現遍歷
valueOf(“常量名”),在枚舉中尋找該常量名
常量1.compare To(常量2),返回得到常量1的編號減常量2的編號。
注解:
如:重寫方法上的@Override
只能用在方法上,可以刪掉,加上后編譯器會檢驗方法是否被重寫。
@Deprecated
可以修飾方法,類,字段,參數等到,用于做版本升級過渡
@SuppressWarnings
用于抑制警告,可以使用@ SuppressWarnings({“all“})抑制所有警告,也可以換成其它類型用于抑制相應類型的警告。
異常處理:
當程序出現一個異常后,可以讓程序繼續向下執行
使用ctrl+alt+t對可能出現異常的代碼塊進行異常處理。
細節:
當異常發生時,異常后面的代碼不再執行,直接跳入catch代碼塊中
如果異常沒有發生,則catch代碼塊不執行
finall代碼塊無論如何都會執行
可以沒有catch,只有try和finally,此時若發生異常,程序會在執行完finally后結束。
Finally代碼塊必須執行,雖然在catch中返回3
Throws:
Throws的對象可以是異常類型本身也可以是它的父類
子類在重寫父類的方法時,拋出的異常類型要么和父類一致,要么是父類所拋出異常的子類異常
包裝類:
精度提升,三元運算符是一個整體
包裝類的轉換
包裝類中的方法:
String類
String類有很多構造器:
用finally修飾的變量指向的地址不可改變。
當常量池中有變量時
String字符串特性:
該語句創建了兩個對象(若常量池中無haha)
說明:String時一個finally類,其內容不可改變。
編譯器會優化:判斷創建的常量池對象是否有引用的指向
等價于 Sting a = “helloabc”;
String 中的intern方法:
如果池中有“s1+s2“字符串,則返回該字符串的地址,若沒有則創建一個該字符串
常用方法:
示例:如果找不到,則返回-1;第一次出現的位置。可以找字符串
從下標6開始截取字符串
前閉后開截取字符串
示例:
注意:原字符串沒有被替換
StringBuffer:
直接父類:AbstractStringBuilder
父類中有屬性 char[] value 不是final類型
StringBuffer是一個finally類,不能被繼承
String轉StringBuffer
StringBuffer轉String
StringBuffer中的方法:
如果要對String進行大量修改,就不要使用String,考慮StringBuffer,如果是單線程同時考慮StringBuilder
Math方法:
round為四舍五入保留整數
Arrays類:
如果傳入的值為負數,則會報錯
System方法:
System.exit(0)
0表示程序正常退出
Src:原數組
0:從原數組開始拷貝的位置
Dest:目的數組
0:從目的數字開始拷貝的位置
處理大數和需要保持高精度計算時使用
Date:
Calendar:
Local:
集合:
ArrayList演示:
迭代器:
List接口:
集合中的元素有序,且可以重復
每個元素都有對應的索引
可以根據其索引號來獲取元素
ArraysList:
1.ArrayList基本等同于vector,效率高,但是不安全
2.ArrayList中維護了一個Object類型的數組
Transient表示該屬性不會被序列化
當創建ArrayList對象時,如果用的是無參構造器,則初始容量為0,第一次添加時數組擴容為10,如果需要再次擴容則擴容為當前容量的1.5倍。
如果使用指定大小的構造器,則在需要再次擴容則擴容為當前容量的1.5倍。
Vector:
底層依然是一個可變的數組
安全,但是效率不高
如果是無參,則在第一次添加后擴容為10,以后每次需要擴容為當前的2倍
ArrayList和LinkList都是不安全的
Set接口:
無序,沒有索引
不允許重復元素
雖然取出的順序不是添加的順序,但是順序是固定的。
可以用迭代器和增強for循環進行遍歷,不能用普通for循環,因為沒有get方法
HashSet底層是hashmap,是一個數組加鏈表的結構
再添加一個元素時,先得到hash值,然后轉換成索引值。
根據索引值存放到數組對應的位置
若對應的位置已有元素,則調用equals方法與元素進行比較,如果相同則放棄添加,如果不相同則添加到最后。
當一條鏈表的元素個數超過8以后,并且table的大小>=64,就會進行樹化。
當添加的元素個數大于閾值(當前數組大小的0.75倍,數組初始化大小為16)時,數組會進行擴容,擴大為原來的兩倍,同時閾值也會擴大為2倍。
Map:
保存具有映射關系的數據
Key和value可以是任何引用類型的數據,會封裝到HashMap$Node對象中
Key不允許重復,否則會覆蓋
Key和value都可以為null,但是key只能有一個,value可以有多個
5.k-v最后是HashMap$Nodenode = newNode(hash,key,value,null)
6.為了方便程序員遍歷,還會創建EntrySet集合,該集合存放的元素的類型Entry,而一個Entry對象就有k,v,EntrySet
7.entrySet中定義的類型是Map.Entry,但是實際上存放的還是HashMap$Node,因為Node實現了Map.Entry
8.當把HashMap$Node對象存放到EntrySet就方便我們的遍歷,因為Map.Entry提供了重要的方法:getKey和getValue
遍歷方式:
HashTable:
鍵和值都不能為空,否則會拋出異常
使用方法基本和HashMap一樣
每次擴容變為原容量的2倍+1,初始容量為11
Properties:
Treeset:有序,可以自定義
自定義比較器的作用:決定了數據的順序,同時決定了數據能否被添加進去的規則,如上圖:以長度升序排列字符串,如果有長度相同的情況則無法添加
Collection工具類:
下面的代碼會報錯,原因是在底層要嘗試把加進去的對象轉換成Comparable,對象沒有實現comparable接口,因此會有轉換類型的異常。
泛型:
1.為了約束數據類型
2.省去轉型的麻煩
約束加入的類型只能為Dog
不用再向下轉型
用來解決數據的安全性問題
作用:可以在類聲明時通過一個表示表示類中的某個屬性,或是某個方法的返回類型,或是參數類型
泛型使用細節:
1.泛型指向的數據類型要求是引用類型,不能是基本數據類型。如:
Int是基本數據類型
2.在指定泛型后,傳入的數據類型可以是其本身。也可以是其子類
3.使用形式:后面的括號里的內容可以省略,推薦這種寫法
4.如果沒有指定泛型,則默認為Object類型
自定義泛型:
1.泛型標識符可以有多個,一般都是大寫字母
2.普通成員(屬性,方法)可以使用泛型
3.使用泛型的數組不能初始化(因為數組在new時,不能確定類型,因此無法開辟空間)
4.靜態方法中不能使用泛型(靜態方法在類加載時,對象還未創建,無法完成初始化)
自定義泛型接口:
1.接口中,靜態成員不能使用泛型
2.泛型接口的類型,在繼承接口或實現接口時確定
3.沒有指定類型,默認為Object
泛型在方法中的使用:
1.泛型方法可以定義在普通類中,也可以定義在泛型類中
2.當泛型方法被調用時,類型會確定
3.泛型方法,可以使用類聲明的泛型類型,也可以使用自己聲明的泛型
4.注意泛型方法和方法使用了泛型的區別
形如:
R要在參數中使用,在調用方法時,會根據傳入的參數的類型,變化R的類型
Say1方法使用了泛型
Say2方法是泛型方法,同時也使用了泛型
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧