Java核心語法
書籍:《Java核心技術(shù)卷一》《Java核心技術(shù)卷二》
java包結(jié)構(gòu):核心包寓搬,Java1一同出現(xiàn)
applet:一種網(wǎng)頁動態(tài)效果技術(shù)
awt:用于創(chuàng)建用戶界面和繪制圖形圖像,使用本地方法离例,顯示效果平臺不統(tǒng)一佩谣,swing以此為基礎(chǔ)
beans:Javabeans就是符合某種特定的規(guī)范的Java類
io:io流操作绽昏,字符流和字節(jié)流
lang:提供基礎(chǔ)類协屡,例如基本數(shù)據(jù)類型和一些接口,Object類是重點(diǎn)
math:支持大數(shù)字的類
net:scoket以及一些協(xié)議的支持類
nio:新增的緩存流
rmi:支持遠(yuǎn)程方法
security:加密框架
sql:數(shù)據(jù)庫相關(guān)類全谤,主要是驅(qū)動類肤晓、連接類、結(jié)果集類等
text:格式化處理
time:時間日期认然、時區(qū)等
util:日期(Data)類补憾、日歷 (Calendar)類、隨機(jī)數(shù)(Random)類卷员、一些集合類盈匾、異常類
javax包結(jié)構(gòu):擴(kuò)展包,后期特性和改進(jìn)
accessibility
annotation
imageio
lang/ model
management
naming
print
rmi
script
security
sound
sql
swing
tools
xml
org包結(jié)構(gòu):組織提供包毕骡,特殊處理類
ietf/ jgss
omg
w3c/ dom:網(wǎng)頁解析器
xml/ sax:xml解析器
一.基本數(shù)據(jù)類型
六種數(shù)字類型(四個整數(shù)型削饵,兩個浮點(diǎn)型):byte,short,int,long,float,doutle
一種字符類型:char
一種布爾型:boolean
常量修飾符:final double PI = 3.1415927;
強(qiáng)制類型轉(zhuǎn)化:int i1 = 123; byte b = (byte)i1;//強(qiáng)制類型轉(zhuǎn)換為byte
二.變量類型
類變量:獨(dú)立于方法之外的變量,用 static 修飾未巫。靜態(tài)變量儲存在靜態(tài)存儲區(qū)窿撬。靜態(tài)變量在第一次被訪問時創(chuàng)建,在程序結(jié)束時銷毀橱赠。類變量具有默認(rèn)值尤仍。
實(shí)例變量:獨(dú)立于方法之外的變量,不過沒有 static 修飾狭姨。實(shí)例變量具有默認(rèn)值宰啦。
局部變量:類的方法中的變量。局部變量是在棧上分配的饼拍。局部變量沒有默認(rèn)值赡模,所以局部變量被聲明后,必須經(jīng)過初始化师抄,才可以使用漓柑。
public class Variable{
static int allClicks=0; // 類變量
String str="hello world"; // 實(shí)例變量
public void method(){
int i =0; // 局部變量
}
}
三.運(yùn)算符
- 算術(shù)運(yùn)算符
- 關(guān)系運(yùn)算符
- 位運(yùn)算符
- 邏輯運(yùn)算符(&&、||叨吮、!)
- 賦值運(yùn)算符
- 其他運(yùn)算符
// 條件運(yùn)算符
variable x = (expression) ? value if true : value if false
// 如果 a 等于 1 成立辆布,則設(shè)置 b 為 20,否則為 30
b = (a == 1) ? 20 : 30;
// 類型檢查運(yùn)算符
( Object reference variable ) instanceof (class/interface type)
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 類型茶鉴,所以返回真
四.流程控制
循環(huán)
while( 布爾表達(dá)式 ) {
//循環(huán)內(nèi)容
}
do {
//代碼語句
}while(布爾表達(dá)式);
for(初始化; 布爾表達(dá)式; 更新) {
//代碼語句
}
for(聲明語句 : 表達(dá)式){
//代碼句子
}
break;continue;
條件
if(布爾表達(dá)式){
//如果布爾表達(dá)式的值為true
}else{
//如果布爾表達(dá)式的值為false
}
if(布爾表達(dá)式 1){
//如果布爾表達(dá)式 1的值為true執(zhí)行代碼
}else if(布爾表達(dá)式 2){
//如果布爾表達(dá)式 2的值為true執(zhí)行代碼
}else if(布爾表達(dá)式 3){
//如果布爾表達(dá)式 3的值為true執(zhí)行代碼
}else {
//如果以上布爾表達(dá)式都不為true執(zhí)行代碼
}
switch語句
switch(expression){
case value :
//語句
break; //可選
case value :
//語句
break; //可選
//你可以有任意數(shù)量的case語句
default : //可選
//語句
}
五.string類型(不可變)
創(chuàng)建字符串:String greeting = "spring";
字符串長度:int len = site.length();
連接字符串1:
"我的名字是 ".concat("Runoob");
連接字符串2:
"Hello," + " runoob" + "!"
按字典順序比較兩個字符串:
int compareTo(String anotherString)
測試此字符串是否以指定的前綴開始:
boolean startsWith(String prefix)
測試此字符串是否以指定的后綴結(jié)束:
boolean endsWith(String suffix)
返回字符在此字符串中第一次索引:
int indexOf(int ch)
返回子字符串最后一次的索引锋玲,從指定的索引開始反向搜索:
int lastIndexOf(String str, int fromIndex)
返回子字符串第一次的索引:
int indexOf(String str)
替換字符串中字符:
String replace(char oldChar, char newChar)
替換正則表達(dá)式的子字符串:
String replaceAll(String regex, String replacement)
正則表達(dá)式拆分此字符串
String[\] split(String regex)根據(jù)給定正則表達(dá)式的匹配拆分此字符串
六.stringBuffer(可變)
創(chuàng)建:StringBuffer sBuffer = new StringBuffer("菜鳥教程官網(wǎng):");
追加字符串:public StringBuffer append(String s)
字符串反轉(zhuǎn):public StringBuffer reverse()
移除字符:public delete(int start, int end)
插入字符:public insert(int offset, int i)
字符串替換:replace(int start, int end, String str)
其余函數(shù)同string類型
七.數(shù)組
聲明數(shù)組:
dataType[] arrayRefVar;
創(chuàng)建數(shù)組:
arrayRefVar = new dataType[arraySize];
作為參數(shù):
public static void printArray(int[] array)
Array類方法:
二分查找算法在給定數(shù)組中搜索給定值的對象:
public static int binarySearch(Object[] a, Object key)
指定的 int 值分配給指定數(shù)組指定范圍中每個元素,同樣適用于所有的其他基本數(shù)據(jù)類型:
public static void fill(int[] a, int val)
指定對象數(shù)組根據(jù)其元素的自然順序進(jìn)行升序排列
public static void sort(Object[] a)
八.面向?qū)ο笾绢?/h3>
常類(不可繼承涵叮、方法不可修改):final class SingleDog
靜態(tài)變量(類共享變量):public static String name = "Spring";
靜態(tài)方法(類共享方法):public static void sleep()
Object類:toString()惭蹂、equals()、hashCode()
常類(不可繼承涵叮、方法不可修改):final class SingleDog
靜態(tài)變量(類共享變量):public static String name = "Spring";
靜態(tài)方法(類共享方法):public static void sleep()
Object類:toString()惭蹂、equals()、hashCode()
繼承類
構(gòu)造順序割粮、在子類中構(gòu)造父類盾碗、在子類中使用父類函數(shù)
public class Show {
public static void main(String[] args){
//構(gòu)造B時,發(fā)現(xiàn)A先被構(gòu)造
B testB = new B();
//使用super調(diào)用父類方法
testB = new B("test");
}
}
class A{
public A(){
System.out.println("classA");
}
}
class B extends A{
public B(String in){
//父類構(gòu)造函數(shù)必須放在第一行
super(in+"A");
System.out.println(in+"B");
super.printA();
}
}
九.面向?qū)ο笾鄳B(tài)
接口:接口是隱式抽象的舀瓢,接口中每一個方法也是隱式抽象的廷雅,接口中的方法都是公有的。
抽象類abstract class:不能實(shí)例化對象之外京髓,類的其它功能依然存在航缀。一個類只能繼承一個抽象類,而一個類卻可以實(shí)現(xiàn)多個接口朵锣。
父類引用指向子類對象谬盐,但只能使用父類出現(xiàn)過的方法。
十.面向?qū)ο笾畠?nèi)部類
接口只是解決了部分問題诚些,而內(nèi)部類使得多重繼承的解決方案變得更加完整
成員內(nèi)部類
不能有任何static類和方法飞傀,只有靜態(tài)內(nèi)部類才能定義。靜態(tài)內(nèi)部類與靜態(tài)類大致相同诬烹,但是能用外部類數(shù)據(jù)
public class InnerTest {
public static void main(String[] args){
Outer outer = new Outer();
Outer.Inter inter = outer.new Inter();
//內(nèi)部類訪問外部類數(shù)據(jù)
inter.show();
}
}
class Outer{
public Outer(){}
private int value = 11;
public int getValue() {
return value;
}
class Inter{
public Inter(){}
public void show(){
System.out.println(getValue());
}
}
}
局部內(nèi)部類
定義在方法內(nèi)或作用域
public class Parcel5 {
public Destionation destionation(String str){
//局部內(nèi)部類
class PDestionation implements Destionation{
private String label;
private PDestionation(String whereTo){
label = whereTo;
}
public String readLabel(){
return label;
}
}
//結(jié)束定義
return new PDestionation(str);
}
public static void main(String[] args) {
Parcel5 parcel5 = new Parcel5();
Destionation d = parcel5.destionation("chenssy");
}
}
匿名內(nèi)部類
用于實(shí)現(xiàn)接口
button.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e) {
System.out.println("你按了按鈕");
}
});
十一.包裝類
基本數(shù)據(jù)類型 | 對應(yīng)的包裝類 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
裝箱:int m = 500; Integer iobj = new Integer(m);
拆箱:Integer x = 5;double d = x.doubleValue();
字符串轉(zhuǎn)指定類型:int m = Integer.parseInt("123");
指定類型轉(zhuǎn)字符串:int m = 500;String s = Integer.toString(m);
自動裝箱和拆箱:Integer obj = m; int n = obj;
獲取類型信息:Integer.MIN_VALUE;Integer.MAX_VALUE;
十二.時間日期DATE
類庫:java.util.Date
創(chuàng)建對象:
以當(dāng)前時間創(chuàng)建:
new Date()
指定毫秒數(shù)創(chuàng)建:
new Date(long millisec)
比較時間先后:
boolean after(Date date)
boolean before(Date date)
int compareTo(Date date)
設(shè)置和獲取毫秒:
long getTime( )
void setTime(long time)
輸出:String toString( )
十三.數(shù)學(xué)計(jì)算
Math類:類中僅有靜態(tài)變量和靜態(tài)方法
Math.PI:π
算數(shù)運(yùn)算:
兩數(shù)最小值:
T min(T,T)
兩數(shù)最大值:T max(T,T)
絕對值:
T abs(T)
冪次方運(yùn)算a^b:
Math.pow(a, b)
進(jìn)位:
向上取整:
double Math.ceil(float/double)
向下取整:
double Math.floor(float/double)
返回最接近的整數(shù)值:
double Math.rint(double d)
四舍五入:
long round(double d);int round(float f)
隨機(jī)數(shù)[0, 1)范圍:double Math.random()
十四.格式化
抽象父類
父抽象類:java.text.Format
將對象格式化為字符串:format(Object obj, StringBuffer toAppendTo, FieldPosition pos)
將字符串反格式為對象:parseObject(String source, ParsePosition pos)
時間日期
抽象類:java.text.DateFormat
提供工廠方法以使用:
1.
getDateInstance()
輸出樣式:2015-12-10
2.
getDateTimeInstance()
輸出樣式:2015-12-10 10:21:41
3.
getTimeInstance()
輸出樣式:10:21:41
4.
getInstance()
輸出樣式:15-12-10 上午10:21
Date date = new Date(); DateFormat df1 = DateFormat.getInstance(); System.out.println(df1.format(date));
具體類java.text.SimpleDateFormat
字母 日期或時間元素 表示 示例 G
Era 標(biāo)志符 Text AD
y
年 Year 1996
;96
M
年中的月份 Month July
;Jul
;07
w
年中的周數(shù) Number 27
W
月份中的周數(shù) Number 2
D
年中的天數(shù) Number 189
d
月份中的天數(shù) Number 10
F
月份中的星期 Number 2
E
星期中的天數(shù) Text Tuesday; Tue
a
Am/pm Text PM
H
一天中的小時數(shù)(0-23) Number 0
k
一天中的小時數(shù)(1-24) Number 24
K
am/pm 中的小時數(shù)(0-11) Number 0
h
am/pm 中的小時數(shù)(1-12) Number 12
m
小時中的分鐘數(shù) Number 30
s
分鐘中的秒數(shù) Number 55
S
毫秒數(shù) Number 978
z
時區(qū) General time zone Pacific Standard Time
;PST
;GMT-08:00
Z
時區(qū) RFC 822 time zone -0800
Date d = new Date(); /* h 1-12輸出格式: 2017-04-16 01:01:22 */ DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println(format1.format(d));
數(shù)值格式化
抽象父類:java.text.NumberFormat
同樣使用工廠方法構(gòu)建對象:
1.
getCurrencyInstance()
方法砸烦,根據(jù)當(dāng)前語言環(huán)境獲取貨幣數(shù)值格式。傳遞Locale對象可以獲取指定語言環(huán)境下的貨幣數(shù)值格式绞吁。2.
getInstance()
和getNumberInstance()
方法都會獲取到常規(guī)數(shù)值格式3.
getIntegerInstance()
方法獲取常規(guī)整數(shù)值格式幢痘,如果需要格式化的數(shù)值為小數(shù),則會將數(shù)值四舍五入為最接近的整數(shù)4.
getPercentInstance()
方法獲取百分比的數(shù)值格式
具體子類:java.text.DecimalFormat
可在創(chuàng)建對象時指定格式:
DecimalFormat format2 = new DecimalFormat("##.##");
符號 含義 0 表示一個數(shù)字家破,被格式化數(shù)值不夠的位數(shù)會補(bǔ)0 # 表示一個數(shù)字颜说,被格式化數(shù)值不夠的位數(shù)會忽略 . 小數(shù)點(diǎn)分隔符的占位符 , 分組分隔符的占位符 - 缺省負(fù)數(shù)前綴 % 將數(shù)值乘以100并顯示為百分?jǐn)?shù) \u2030 將數(shù)值乘以1000并顯示為千分?jǐn)?shù)
也可創(chuàng)建對象后使用函數(shù)進(jìn)行設(shè)置:
setMaximumFractionDigits(int newValue)
方法购岗,設(shè)置小數(shù)部分中允許的最大數(shù)字位數(shù)
setMinimumFractionDigits(int newValue)
方法,設(shè)置小數(shù)部分中允許的最小數(shù)字位數(shù)门粪,如果原數(shù)小數(shù)位數(shù)不夠的話喊积,會補(bǔ)零。
對于數(shù)值的整數(shù)部分玄妈,默認(rèn)3個數(shù)字為一組進(jìn)行顯示砰逻,同樣對此我們也可以自定義谆棱,使用
setGroupingSize(int i)
方法追他,設(shè)置分組中一組的位數(shù)震捣。
setGroupingUsed(boolean value)
方法設(shè)置是否使用分組,true表示使用酝锅,false表示取消分組
setMaximumIntegerDigits(int newValue)
方法設(shè)置整數(shù)部分允許的最大數(shù)字位數(shù)
setMinimumIntegerDigits(int newValue)
方法設(shè)置整數(shù)部分允許的最小數(shù)字位數(shù)DecimalFormat format3 = new DecimalFormat("0000.00"); System.out.println(format3.format(12.345));//輸出0012.35
具體子類:java.text.ChoiceFormat
實(shí)例:數(shù)字與字符串?dāng)?shù)組對應(yīng)诡必,類似枚舉
double[] limits = { 3, 4, 5, 6, 7, 8, 9 }; String[] formats = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" }; ChoiceFormat format = new ChoiceFormat(limits, formats); System.out.println(format.format(2.5));//將會輸出"星期一" /**3.6介于3和4之間,所以會匹配3屈张,又由于3在limits數(shù)組中的索引是0擒权,所以會在formats數(shù)組徐照索引0的值,即輸出"星期一" */ System.out.println(format.format(3.6));
常用函數(shù):主要為區(qū)間函數(shù)
1.
nextDouble(double d)
靜態(tài)方法查找大于d的最小double值阁谆,用在limits數(shù)組中碳抄,從而使limits數(shù)組形成一個右開區(qū)間數(shù)組,例如limits = {0,1,ChoiceFormat.nextDouble(1)}
2.
nextDouble(double d, boolean positive)
靜態(tài)方法场绿,如果positive參數(shù)為true剖效,表示查找大于d的最小double值;如果positive參數(shù)為false焰盗,表示查找小于d的最大double值璧尸,這樣就可以使limits形成一個左開區(qū)間數(shù)組。3.
previousDouble(double d)
靜態(tài)方法熬拒,查找小于d的最大double值同樣可以在創(chuàng)建時指定格式:
ChoiceFormat cf = new ChoiceFormat("1#is 1 | 1<is more than 1"); System.out.println(cf.format(1));//輸出"is 1" System.out.println(cf.format(2));//輸出"is more than 1" System.out.println(cf.format(0));//輸出"is 1"
消息格式化
具體類:java.text.MessageFormat
功能:將字符串按照指定格式拼接
條件:格式化字符串+對象數(shù)組
直接使用:String value = MessageFormat.format("oh, {0} is 'a' pig", "Spring");
兩個單引號才表示一個單引號:
String value = MessageFormat.format("oh, {0} is ''a'' pig", "Spring");
單引號會使其后面的占位符均失效:
MessageFormat.format("'{0}{1}", 1, 2); // 結(jié)果{0}{1}
無論是有引號字符串還是無引號字符串爷光,左花括號都是不支持的,應(yīng)使用單引號包圍:'{'
創(chuàng)建對象后使用:
MessageFormat temp = new MessageFormat(pattern);
temp.format(arrays);
十五.格式化字符串
重載方法:
使用當(dāng)前本地區(qū)域?qū)ο筮M(jìn)行格式化:
String String.format(String fmt, Object... args);
自定義本地區(qū)域?qū)ο蟾袷交址?code>String String.format(Locale locale, String fmt, Object... args);
編寫格式:%[argument_index$][flags][width][.precision]conversion
argument_indexs and %1$s", "A", "B");//B and A`
flag 輸出格式字符:
String.format("%,09d", -3872);//-0003,872
width 最小寬度:十進(jìn)制整數(shù)
.precision 限制字符數(shù)(精度):十進(jìn)制整數(shù)
conversion 轉(zhuǎn)化類型:%s,%d,%f
特殊轉(zhuǎn)換符:
b(布爾類型)澎粟、n(換行)蛀序、%(百分號)
字符、字符串
格式化:%[index$][標(biāo)識][最小寬度]轉(zhuǎn)換符
轉(zhuǎn)換符:字符串s活烙、字符c
標(biāo)識符:左對齊徐裸,右邊以空格補(bǔ)充 -
例子:
String.format("%-7s", "hmc")
整數(shù)
格式化:%[index$][標(biāo)識]*[最小寬度]轉(zhuǎn)換符
轉(zhuǎn)換符:d(十進(jìn)制整數(shù))、x(十六進(jìn)制整數(shù))啸盏、o(八進(jìn)制整數(shù))
標(biāo)識:
-(在最小寬度內(nèi)左對齊,不可以與0標(biāo)識一起使用)重贺、0(若內(nèi)容長度不足最小寬度,則在左邊用0來填充)
,對8進(jìn)制和16進(jìn)制气笙,8進(jìn)制前添加一個0,16進(jìn)制前添加0x次企。
+(結(jié)果總包含一個+或-號)、空格(正數(shù)前加空格健民,負(fù)數(shù)前加-號)
,抒巢,只用與十進(jìn)制贫贝,每3位數(shù)字間用,分隔秉犹。
(,若結(jié)果為負(fù)數(shù)稚晚,則用括號括住崇堵,且不顯示符號。例子:
String.format("%(,d",-1000)//(1,000)
浮點(diǎn)數(shù)
格式化:%[index$][標(biāo)識]*[最小寬度][.精度]轉(zhuǎn)換符
轉(zhuǎn)換符:
f客燕,(十進(jìn)制浮點(diǎn)數(shù)鸳劳,顯示9位有效數(shù)字,且會進(jìn)行四舍五入也搓。)
a赏廓,浮點(diǎn)數(shù)型(十六進(jìn)制)。
e傍妒,指數(shù)類型幔摸。如9.38e+5。
g颤练,浮點(diǎn)數(shù)型(比%f既忆,%a長度短些,顯示6位有效數(shù)字嗦玖,且會進(jìn)行四舍五入)標(biāo)識符同整數(shù)
時間日期
格式化:%[index$]t轉(zhuǎn)換符
時間轉(zhuǎn)化符:
H, 24小時制的小時(不足兩位補(bǔ)零)
k, 24小時制的小時(不足兩位不補(bǔ)零)
I, 12小時制的小時(不足兩位補(bǔ)零)
i, 12小時制的小時(不足兩位不補(bǔ)零)
M, 分鐘(不足兩位補(bǔ)零)
S, 秒(不足兩位補(bǔ)零)
L, 毫秒(不足三位補(bǔ)零)
N, 毫秒(不足9位補(bǔ)零)
p, 小寫字母的上午或下午標(biāo)記患雇,如中文為“下午”,英文為pm
z, 相對于GMT的時區(qū)偏移量宇挫,如+0800
Z, 時區(qū)縮寫苛吱,如CST
s, 自1970-1-1 00:00:00起經(jīng)過的秒數(shù)
Q, 自1970-1-1 00:00:00起經(jīng)過的豪秒
日期轉(zhuǎn)化符:
c,星期六 十月 27 14:21:20 CST 2007
F器瘪,2007-10-27
D翠储,10/27/07
r,02:25:51 下午
T娱局,14:28:16
R彰亥,14:28
b, 月份簡稱
B, 月份全稱
a, 星期簡稱
A, 星期全稱
C, 年前兩位(不足兩位補(bǔ)零)
y, 年后兩位(不足兩位補(bǔ)零)
j, 當(dāng)年的第幾天
m, 月份(不足兩位補(bǔ)零)
d, 日期(不足兩位補(bǔ)零)
e, 日期(不足兩位不補(bǔ)零)
十六.集合
類結(jié)構(gòu)
Collection(接口)/
set(接口)/
HashSet(具體類)
LinkedHashSet(具體類)
SortedSet(接口)/
TreeSet(具體類)
List(接口)/
ArrayList(具體類)
Vector(具體類)
LinkedList(具體類)①
Queue(接口)/
LinkedList(具體類)①
PriorityQueue(具體類)
Map(接口)/
HashTable(具體類)
LinkedHashMap(具體類)
HashMap(具體類)
SortedMap(接口)/
TreeMap(具體類)
集合工具類
Collection
方法 | 描述 |
---|---|
copy | 列表間復(fù)制 |
max、mix | 最大衰齐、最小元素 |
sort | 排序 |
Arrays
方法 | 描述 |
---|---|
binarySearch | 二分查找 |
copyOf | 復(fù)制 |
copyOfRange | 指定范圍復(fù)制 |
sort | 排序 |
asList | 參數(shù)轉(zhuǎn)列表 |
視圖
定義:具有限制的集合對象
Test[] tests = new Test[10];
List<Test> testList = Arrays.asList(tests);
具有訪問數(shù)組元素set任斋,get的方法。但是如果調(diào)用改變數(shù)組的方法就會拋出異常。所以可以說視圖對象可以說是具有限制的集合對象废酷。
十七.異常
類結(jié)構(gòu)
Throwable/
Error(錯誤瘟檩,無法再程序中處理)
Exception(意外)/
IOException/
EOFException
FileNotFoundException
MalformedURLException
UnknownHostException
ClassNotFoundException
CloneNotSupportedException
RuntimeException/
ArithmeticException
ClassCastException
IllegalArgumentException
IllegalStateException
IndexOutOfBoundsException
NoSuchElementException
NullPointerException
異常的操作
異常處理 | 自定義異常類 | 主動拋出異常 | finaly語句 |
---|---|---|---|
catch語句 | 繼承于Exception類 | 本函數(shù)不處理異常,拋出異常給外層函數(shù) | 覆蓋返回語句 |
依次匹配處理 | 實(shí)現(xiàn)方法:getMessage(); | 直接拋出異常:throw 對象 |
十八.IO流管理
類結(jié)構(gòu)圖
[圖片上傳失敗...(image-335ddc-1556974885379)]
分類說明
File類 | RandomAccessFile | PrintStream | 緩沖讀與Scanner | 序列化 |
---|---|---|---|---|
提供文件相關(guān)信息澈蟆,文件名屬性 | 隨機(jī)訪問文件位置 | 包含System.in墨辛、System.out、System.err | Scanner不需要顯式的處理錯誤趴俘,而緩沖流需要 | implements Serializable |
查詢操作睹簇、目錄操作 | 重定向:①新建一個對象 ②setIn、setOut寥闪、setErr函數(shù) | 不是繼承關(guān)系 | 不需要實(shí)現(xiàn)函數(shù) |
文件類函數(shù)
復(fù)制太惠、移動和刪除 | 獲取文件信息 | 文件加鎖機(jī)制 |
---|---|---|
Files.copy(fromPath,toPath) | exists | FileLock lock() |
Files.move(fromPath,toPath) | isHidden | FileLock tryLock() |
Files.delete(path) | isReadable、isWritable... | void close():釋放鎖 |
迭代目錄中的文件:
try(DirectoryStream<Path> entries = Files.newDirectoryStream(dir)){
for(Path entry:entries)
Process entries
}
十九.反射
前提:擁有字節(jié)碼(.class)
定義:在運(yùn)行過程中獲取和使用類疲憋,例如構(gòu)造出一個類凿渊、提取類成員變量、運(yùn)行成員函數(shù)缚柳。
Java中實(shí)現(xiàn)反射的類:
java.lang.Class;
java.lang.reflect.Constructor;
java.lang.reflect.Field;
java.lang.reflect.Method;
java.lang.reflect.Modifier;
獲取class對象
①Object.getClass()
②對象.class //屬性
③class.forName()
構(gòu)造方法
// 獲取批量的方法:
public Constructor[] getConstructors()
所有"公有的"構(gòu)造方法
public Constructor[] getDeclaredConstructors()
獲取所有的構(gòu)造方法(包括私有埃脏、受保護(hù)、默認(rèn)秋忙、公有)
//獲取單個的方法:
public Constructor getConstructor(Class... parameterTypes
獲取單個的"公有的"構(gòu)造方法:
public Constructor getDeclaredConstructor(Class... parameterTypes)
獲取"某個構(gòu)造方法"可以是私有的彩掐,或受保護(hù)、默認(rèn)翰绊、公有
//調(diào)用構(gòu)造方法:
Constructor-->newInstance(Object... initargs)
獲取類成員變量
// 批量的
Field[] getFields()
獲取所有的"公有字段"
Field[] getDeclaredFields()
獲取所有字段佩谷,包括:私有、受保護(hù)监嗜、默認(rèn)谐檀、公有;
// 獲取單個的:
public Field getField(String fieldName)
獲取某個"公有的"字段裁奇;
public Field getDeclaredField(String fieldName)
獲取某個字段(可以是私有的)
// 設(shè)置字段的值:
Field --> public void set(Object obj,Object value):
// 參數(shù)說明:
// 1.obj:要設(shè)置的字段所在的對象桐猬;
// 2.value:要為字段設(shè)置的值;
// 3.本身是要修改的成員變量
成員方法
// 批量的:
public Method[] getMethods()
獲取所有"公有方法"刽肠;(包含了父類的方法也包含Object類)
public Method[] getDeclaredMethods()
獲取所有的成員方法溃肪,包括私有的(不包括繼承的)
// 獲取單個的:
public Method getMethod(String name,Class<?>... parameterTypes)
// 參數(shù):
// name : 方法名;
// Class ... : 形參的Class類型對象
public Method getDeclaredMethod(String name,Class<?>... parameterTypes)
// 調(diào)用方法:
Method --> public Object invoke(Object obj,Object... args)
// 參數(shù)說明:
// obj : 要調(diào)用方法的對象音五;
// args:調(diào)用方式時所傳遞的實(shí)參惫撰;
二十.枚舉
本質(zhì)
class MyEnum {
public static final int 變量名 = 0;
public static final int 變量名 = 1;
......
初始化所有對象,并加入列表
}
使用枚舉組織接口
public interface Food {
enum Coffee implements Food{
BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
}
enum Dessert implements Food{
FRUIT, CAKE, GELATO
}
}
二十一.泛型
泛型類
public class MultiType <E,T>{
E value1;
T value2;
public E getValue1(){
return value1;
}
public T getValue2(){
return value2;
}
}
MultiType<int,String> hmc = new MultiType<>();
泛型方法
public class Test1<T>{
public void testMethod(T t){
System.out.println(t.getClass().getName());
}
public <E> E testMethod1(E e){
return e;
}
}
// 測試方法
Test1<String> t = new Test1();
t.testMethod("generic");
Integer i = t.testMethod1(new Integer(1));
泛型接口
同“類”
public interface Iterable<T> {
}
通配符
<?>無限定通配符
只能調(diào)用 Collection 中與類型無關(guān)的方法
<?> 提供了只讀的功能,也就是它刪減了增加具體類型元素的能力,只保留與具體類型無關(guān)的功能夯膀。它不管裝載在這個容器內(nèi)的元素是什么類型诗充,它只關(guān)心元素的數(shù)量、容器是否為空
<? extends T>有上限的通配符
public void testSub(Collection<? extends Base> para){
}
// 以下不通過
para.add(new Sub());
para.add(new Base());
① 接受Base和其子類
② 依舊只讀
③ 明確了范圍
<? super T>有下限的通配符
public void testSuper(Collection<? super Sub> para){
}
1
2
// <? super T> 神奇的地方在于诱建,它擁有一定程度的寫操作的能力蝴蜓。
public void testSuper(Collection<? super Sub> para){
para.add(new Sub());//編譯通過
para.add(new Base());//編譯不通過
}
類型擦除
定義:泛型信息只存在于代碼編譯階段,在進(jìn)入 JVM 之前俺猿,與泛型相關(guān)的信息會被擦除掉茎匠,專業(yè)術(shù)語叫做類型擦除
① 一般情況下,泛型在jvm中被轉(zhuǎn)換為Object辜荠。
② 在使用<? extends xxx>的情況下汽抚,轉(zhuǎn)換成xxx。
與反射結(jié)合
無法通過編譯的操作
List<Integer> ls = new ArrayList<>();
ls.add(23);
ls.add("text"); //錯誤
顯然list被指定為int,無法添加字符串伯病。
但是,通過類型擦除否过,能在運(yùn)行階段添加到Object中午笛。
public class ToolTest {
public static void main(String[] args) {
List<Integer> ls = new ArrayList<>();
ls.add(23);
// ls.add("text");
try {
Method method = ls.getClass().getDeclaredMethod("add",Object.class);
// 通過反射,強(qiáng)行添加
method.invoke(ls,"test");
method.invoke(ls,42.9f);
} catch Exception e{
}
}
}
二十二.線程
參考:Java多線程學(xué)習(xí)(吐血超詳細(xì)總結(jié))
實(shí)現(xiàn) | 同步 | 阻塞隊(duì)列 | 線程安全集合 |
---|---|---|---|
繼承Thread | 鎖:Rentrantluh類+synchronized關(guān)鍵字 | BlockingQueue | 包:java.util.concurrent |
Runnable接口 | 監(jiān)視器 | ||
volatliet域 |
二十三.網(wǎng)絡(luò)編程
Socket客戶端
import java.net.*;
import java.io.*;
public class GreetingClient{
public static void main(String [] args){
String serverName = args[0];
int port = Integer.parseInt(args[1]);
try{
System.out.println("連接到主機(jī):" + serverName + " 苗桂,端口號:" + port);
Socket client = new Socket(serverName, port);
System.out.println("遠(yuǎn)程主機(jī)地址:" + client.getRemoteSocketAddress());
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("服務(wù)器響應(yīng): " + in.readUTF());
client.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
Socket服務(wù)器
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread {
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
}
public void run() {
while(true) {
try {
System.out.println("等待遠(yuǎn)程連接药磺,端口號為:" + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("遠(yuǎn)程主機(jī)地址:" + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("謝謝連接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}catch(SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
}catch(IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String [] args) {
int port = Integer.parseInt(args[0]);
try {
Thread t = new GreetingServer(port);
t.run();
}catch(IOException e) {
e.printStackTrace();
}
}
}
連接特征
多連接 | 半關(guān)閉 | 獲取Web資源 |
---|---|---|
多線程技術(shù)vo | void shutdownOutput() | URL類:web信息 |
原始線程一直接收請求 | void shuwdownInput() | URLConnection類,獲取網(wǎng)頁資源 |
不斷新建線程處理請求 | boolean isOutputShutdown() //另有對應(yīng)的 |
URL類例子
import java.net.*;
import java.io.*;
public class URLDemo{
public static void main(String [] args){
try{
URL url = new URL("http://www.runoob.com/index.html?language=cn#j2se");
System.out.println("URL 為:" + url.toString());
System.out.println("協(xié)議為:" + url.getProtocol());
System.out.println("驗(yàn)證信息:" + url.getAuthority());
System.out.println("文件名及請求參數(shù):" + url.getFile());
System.out.println("主機(jī)名:" + url.getHost());
System.out.println("路徑:" + url.getPath());
System.out.println("端口:" + url.getPort());
System.out.println("默認(rèn)端口:" + url.getDefaultPort());
System.out.println("請求參數(shù):" + url.getQuery());
System.out.println("定位位置:" + url.getRef());
}catch(IOException e){
e.printStackTrace();
}
}
}
發(fā)送表單和發(fā)送E-Mail
二十四.數(shù)據(jù)庫編程
一個簡單應(yīng)用
import java.sql.*;
public class MySQLDemo {
// JDBC 驅(qū)動名及數(shù)據(jù)庫 URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB";
// 數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
// 注冊 JDBC 驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
// 打開鏈接
System.out.println("連接數(shù)據(jù)庫...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
// 執(zhí)行查詢
System.out.println(" 實(shí)例化Statement對象...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, url FROM websites";
ResultSet rs = stmt.executeQuery(sql);
// 展開結(jié)果集數(shù)據(jù)庫
while(rs.next()){
// 通過字段檢索
int id = rs.getInt("id");
String name = rs.getString("name");
String url = rs.getString("url");
// 輸出數(shù)據(jù)
System.out.print("ID: " + id);
System.out.print(", 站點(diǎn)名稱: " + name);
System.out.print(", 站點(diǎn) URL: " + url);
System.out.print("\n");
}
// 完成后關(guān)閉
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
// 處理 JDBC 錯誤
se.printStackTrace();
}catch(Exception e){
// 處理 Class.forName 錯誤
e.printStackTrace();
}finally{
// 關(guān)閉資源
try{
if(stmt!=null) stmt.close();
}catch(SQLException se2){
}// 什么都不做
try{
if(conn!=null) conn.close();
}catch(SQLException se){
se.printStackTrace();
}
}
System.out.println("Goodbye!");
}
}
JDBC特性
預(yù)備語句(語句拼接) | 讀寫大對象 | 轉(zhuǎn)義功能 |
---|---|---|
String sql=“...”,中間變量以煤伟?號表示 | 二進(jìn)制大對象:BLOB癌佩、字符型:CLOB | 時間日期:d/t/ts |
PreparedStatement stat = conn.prepareStatement(sql); | 獲取:getBlob/Clob | 標(biāo)量函數(shù):{fn user()} |
stat.setString(1,publisher) //1表示第幾個位置,publisher為變量 | 生成新對象再寫入:connection.createBlob/Clob | like子句中‘_’需要使用‘!_’轉(zhuǎn)義 |
結(jié)果集
多結(jié)果集 | 可滾動和可更新 |
---|---|
使用stat.execute(command)查詢 | Statement stat = conn.createStatement(type,concurrency) |
getResultSet(),獲取第一個結(jié)果集 | TYPE值:TYPE_SCROLL_INSENSITIVE(可滾動不敏感)便锨、去掉IN即敏感 |
重復(fù)調(diào)用getMoreResults(),isResult判斷條件 | Concurrentcy值:CONCUR_UPDATABLE,結(jié)果集用于更新數(shù)據(jù)庫 |
行集和元數(shù)據(jù)(數(shù)據(jù)庫結(jié)構(gòu))
行集
行集分類 | 新建和填充crs | crs操作 |
---|---|---|
CachedRowset:緩存行集 | 新建:RowSetFactory factory = RowSetProvider.newFactory();CachedRowSet crs = factory.createCachedRowSet(); | 設(shè)置大形д蕖:crs.setPageSize(int); |
WebRowset:可以移動到Web應(yīng)用的其它層中 | 從結(jié)果集填充:crs.populate(result); | 下一頁:crs.nextPage() |
JdbcRowset:一個瘦包裝器,能將結(jié)果轉(zhuǎn)化為bean | 自動查詢:crs.set數(shù)據(jù)庫信息和查詢語句,crs.execute()查詢 | 寫回?cái)?shù)據(jù)庫:crs.acceptChanges(conn); |
元數(shù)據(jù)
數(shù)據(jù)庫結(jié)構(gòu) | 結(jié)果集結(jié)構(gòu) |
---|---|
ResultSet getTables():獲取所有表信息 | ResultSetMetaDate getMetaDate():獲取結(jié)果集信息 |
事務(wù)
將一組語句組成一個事物,便于保護(hù)數(shù)據(jù)完整性
簡單事務(wù)
conn.setAutoCommit(false); //取消一句一提交
Statement stat = conn.createStatement();
stat.executeUpdate(command1);
...
stat.executeUpdate(commandn);
conn.commit();
conn.rollback(); //出現(xiàn)錯誤則自動撤銷
保存點(diǎn)(不撤銷到事務(wù)開頭)
Savepoint svpt = conn.setSavepoint(); //新建中斷點(diǎn)
conn.releaseSavepoint(svpt); //釋放中斷點(diǎn)
批量更新
Statment stat = conn.createStatement();
String command = "xxx";
stat.addBatch(command); //添加命令
int[] counts = stat.executeBatch(); //批量提交
二十五.函數(shù)接口(lambda)
要求:
函數(shù)式接口放案,接口里抽象方法只能有一個姚建。
匿名類:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Before Java8, too much code for too little to do");
}
}).start();
使用lambda:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();
二十六.代理類
參考: 代理模式及JDK動態(tài)代理(InvocationHandler)的簡單實(shí)現(xiàn)與分析
結(jié)構(gòu)圖:
[圖片上傳失敗...(image-5a0326-1556974885379)]
原理:Interface InvocationHandler (阻礙器)
該接口中僅定義了一個方法:
public Object invoke(Object obj, Method method, Object[] args),在使用時吱殉,第一個參數(shù)obj一般是指代理類掸冤,method是被代理的方法,args為該方法的參數(shù)數(shù)組友雳。這個抽象方法在代理類中動態(tài)實(shí)現(xiàn)稿湿。
Proxy
該類即為動態(tài)代理類
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h),返回代理類的一個實(shí)例押赊,返回后的代理類可以當(dāng)作被代理類使用饺藤。
二十七.日志(輸出控制)
最簡單的等級控制
public class Test {
public static void main(String[] args) {
// 獲取對象
Logger logger = Logger.getLogger("logger");
// 發(fā)送消息
logger.info("hello world");
// 設(shè)置日志輸出等級
logger.setLevel(Level.INFO);
// 測試兩個等級
logger.log(Level.WARNING, "hello world1");
logger.log(Level.FINE,"hello world2");
// 再次發(fā)送消息
logger.info("hello world3");
}
}
輸出對象控制
Handle
Handler handler = new Handler() {
@Override
public void publish(LogRecord record) {
}
@Override
public void flush() {
}
@Override
public void close() throws SecurityException {
}
}
控制輸出格式
setFormatter
handler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
return null;
}
});
二十八.本地化
語系管理
//構(gòu)造一個系統(tǒng)默認(rèn)的Locale
Locale defaultLocale = Locale.getDefault();
//獲取當(dāng)前Java虛擬機(jī)線程默認(rèn)的國家和語言信息
String country = defaultLocale.getCountry();//返回國家地區(qū)代碼
String language = defaultLocale.getLanguage();//返回國家的語言
String displayCountry = defaultLocale.getDisplayCountry();//返回適合向用戶顯示的國家信息
String displayLanaguage = defaultLocale.getDisplayLanaguage();//返回適合向用戶展示的語言信息
String displayName = defaultLocale.getDisplayName();//返回適合向用戶展示的語言環(huán)境名
//根據(jù)國家地區(qū)和語言構(gòu)造一個Locale(語言環(huán)境)
Locale currentLocale = new Locale(“zh”, ”CN”);
數(shù)字格式
Locale loc = new Locale("de","DE");
NumberFormat currFmt = NumberFormat.getCurrencyInstance(loc);
double amt = 123456.78;
String result = currFmt.format(amt);
日期和時間
3 import java.text.DateFormat;
4 import java.text.ParseException;
5 import java.text.SimpleDateFormat;
6 import java.util.Date;
7 import java.util.Locale;
8
9 public class TestSimpleDateFormat {
10 public static void main(String args[]) throws ParseException {
11 TestSimpleDateFormat test = new TestSimpleDateFormat();
12 test.testDateFormat();
13
14 }
15
16 public void testDateFormat() throws ParseException {
17 //創(chuàng)建日期
18 Date date = new Date();
19 //創(chuàng)建不同的日期格式
20 DateFormat df1 = DateFormat.getInstance();
21 DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
22 DateFormat df3 = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); //產(chǎn)生一個指定國家指定長度的日期格式,長度不同,顯示的日期完整性也不同
23 DateFormat df4 = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒 EE", Locale.CHINA);
24 DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEEEE", Locale.US);
25 DateFormat df6 = new SimpleDateFormat("yyyy-MM-dd");
26 DateFormat df7 = new SimpleDateFormat("yyyy年MM月dd日");
27
28 //將日期按照不同格式進(jìn)行輸出
29 System.out.println("-------將日期按照不同格式進(jìn)行輸出------");
30 System.out.println("按照J(rèn)ava默認(rèn)的日期格式策精,默認(rèn)的區(qū)域 : " + df1.format(date));
31 System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE 舰始,系統(tǒng)默認(rèn)區(qū)域 :" + df2.format(date));
32 System.out.println("按照日期的FULL模式,區(qū)域設(shè)置為中文 : " + df3.format(date));
33 System.out.println("按照指定格式 yyyy年MM月dd日 hh時mm分ss秒 EE 咽袜,區(qū)域?yàn)橹形?: " + df4.format(date));
34 System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE 丸卷,區(qū)域?yàn)槊绹? : " + df5.format(date));
35 System.out.println("按照指定格式 yyyy-MM-dd ,系統(tǒng)默認(rèn)區(qū)域 : " + df6.format(date));
36
37 //將符合該格式的字符串轉(zhuǎn)換為日期询刹,若格式不相配谜嫉,則會出錯
38 Date date1 = df1.parse("07-11-30 下午2:32");
39 Date date2 = df2.parse("2007-11-30 02:51:07 星期五");
40 Date date3 = df3.parse("2007年11月30日 星期五");
41 Date date4 = df4.parse("2007年11月30日 02時51分18秒 星期五");
42 Date date5 = df5.parse("2007-11-30 02:51:18 Friday");
43 Date date6 = df6.parse("2007-11-30");
44
45 System.out.println("-------輸出將字符串轉(zhuǎn)換為日期的結(jié)果------");
46 System.out.println(date1);
47 System.out.println(date2);
48 System.out.println(date3);
49 System.out.println(date4);
50 System.out.println(date5);
51 System.out.println(date6);
52 }
53 }
資源包
ResourceBundle currentResources = ResourceBundle.getBundle(bundleName,currentLocale);
屬性文件(MyProgramStrings.properties):
computeButton=Rechnen
ResourceBundle bundle = ResourceBundle.getBundle("MyProgramStrings",locale);
String computeButtonLabel = bundle.getString("computeButton");
二十九.java虛擬機(jī)原理
[圖片上傳失敗...(image-a0be3b-1556974885379)]
棧和堆的對比
- 棧解決程序的運(yùn)行問題,即程序如何運(yùn)行凹联。
- 堆解決的是數(shù)據(jù)存儲問題沐兰,即數(shù)據(jù)怎么放。
- 堆中存的是對象的成員變量值蔽挠,棧中存的是基本數(shù)據(jù)類型和堆中對象的引用住闯。