一镜遣、Java 簡介
Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計語言和Java平臺的總稱。由James Gosling和同事們共同研發(fā)骂际,并在1995年正式推出引瀑。
Java分為三個體系:
JavaSE(J2SE)(Java2 Platform Standard Edition驼鹅,java平臺標準版)
JavaEE(J2EE)(Java 2 Platform,Enterprise Edition舰罚,java平臺企業(yè)版)
JavaME(J2ME)(Java 2 Platform Micro Edition纽门,java平臺微型版)薛耻。
二营罢、主要特性
Java語言是簡單的
Java語言是面向?qū)ο蟮?/p>
Java語言是分布式的
Java語言是健壯的
Java語言是安全的
Java語言是體系結(jié)構(gòu)中立的
Java語言是可移植的
Java語言是解釋型的
Java是高性能的
Java語言是多線程的
Java語言是動態(tài)的
三、Java 開發(fā)環(huán)境配置
window系統(tǒng)安裝java
1、下載JDK
首先我們需要下載java開發(fā)工具包JDK饲漾,下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html蝙搔,下載后JDK的安裝根據(jù)提示進行,還有安裝JDK的時候也會安裝JRE考传,一并安裝就可以了吃型。安裝JDK僚楞,安裝過程中可以自定義安裝目錄等信息赐写,例如我們選擇安裝目錄為?C:\Program Files (x86)\Java\jdk1.8.0_91
2、配置環(huán)境變量
1).安裝完成后跳座,右擊"我的電腦"端铛,點擊"屬性",選擇"高級系統(tǒng)設(shè)置"疲眷;
2).選擇"高級"選項卡禾蚕,點擊"環(huán)境變量";
然后就會出現(xiàn)如下圖所示的畫面:
在"系統(tǒng)變量"中設(shè)置3項屬性咪橙,JAVA_HOME,PATH,CLASSPATH(大小寫無所謂),若已存在則點擊"編輯"夕膀,不存在則點擊"新建"。
變量設(shè)置參數(shù)如下:
變量名:JAVA_HOME
變量值:C:\Program Files (x86)\Java\jdk1.8.0_91?// 要根據(jù)自己的實際路徑配置
變量名:CLASSPATH
變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;//記得前面有個"."
變量名:Path
變量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
3)JAVA_HOME 設(shè)置
4)PATH設(shè)置
5)CLASSPATH 設(shè)置
這是 Java 的環(huán)境配置,配置完成后,你可以啟動 Eclipse 來編寫代碼攘已,它會自動完成java環(huán)境的配置剧防。
注意:如果使用1.5以上版本的JDK鸡挠,不用設(shè)置CLASSPATH環(huán)境變量,也可以正常編譯和運行Java程序歉糜。
6)測試JDK是否安裝成功
"開始"->"運行"踊兜,鍵入"cmd"贰剥;
鍵入命令:?java -version、java、javac?幾個命令帆锋,出現(xiàn)以下信息,說明環(huán)境變量配置成功;
3梨水、流行JAVA開發(fā)工具
1)Eclipse
2)sts
3)IDEA
四、Java 基礎(chǔ)語法
一個Java程序可以認為是一系列對象的集合追葡,而這些對象通過調(diào)用彼此的方法來協(xié)同工作之斯。下面簡要介紹下類涨冀、對象垛孔、方法和實例變量的概念腋妙。
對象:對象是類的一個實例济竹,有狀態(tài)和行為袭景。例如单山,一條狗是一個對象狼忱,它的狀態(tài)有:顏色、名字、品種髓棋;行為有:搖尾巴、叫侨颈、吃等。
類:類是一個模板渴频,它描述一類對象的行為和狀態(tài)。
方法:方法就是行為,一個類可以有很多方法呛每。邏輯運算悯恍、數(shù)據(jù)修改以及所有動作都是在方法中完成的唉侄。
實例變量:每個對象都有獨特的實例變量须蜗,對象的狀態(tài)由這些實例變量的值決定蛉腌。
基本語法
編寫Java程序時忘蟹,應注意以下幾點:
大小寫敏感:Java是大小寫敏感的,這就意味著標識符Hello與hello是不同的嫡良。
類名:對于所有的類來說锰扶,類名的首字母應該大寫献酗。如果類名由若干單詞組成,那么每個單詞的首字母應該大寫,例如 MyFirstJavaClass 。
方法名:所有的方法名都應該以小寫字母開頭遏佣。如果方法名含有若干單詞,則后面的每個單詞首字母大寫湃窍。
源文件名:源文件名必須和類名相同笙僚。當保存文件的時候毁枯,你應該使用類名作為文件名保存(切記Java是大小寫敏感的)穷躁,文件名的后綴為.java。(如果文件名和類名不相同則會導致編譯錯誤)开仰。
主方法入口:所有的Java 程序由public static void main(String []args)方法開始執(zhí)行。
Java標識符
Java所有的組成部分都需要名字关拒。類名、變量名以及方法名都被稱為標識符幌缝。
關(guān)于Java標識符灸促,有以下幾點需要注意:
所有的標識符都應該以字母(A-Z或者a-z),美元符($)、或者下劃線(_)開始
首字符之后可以是字母(A-Z或者a-z),美元符($)涵卵、下劃線(_)或數(shù)字的任何字符組合
關(guān)鍵字不能用作標識符
標識符是大小寫敏感的
合法標識符舉例:age腿宰、$salary、_value缘厢、__1_value
非法標識符舉例:123abc吃度、-salary
Java修飾符
像其他語言一樣,Java可以使用修飾符來修飾類中方法和屬性贴硫。主要有兩類修飾符:
訪問控制修飾符 : default, public , protected, private
非訪問控制修飾符 : final, abstract, strictfp
Java變量
Java中主要有如下幾種類型的變量
局部變量
類變量(靜態(tài)變量)
成員變量(非靜態(tài)變量)
Java數(shù)組
數(shù)組是儲存在堆上的對象椿每,可以保存多個同類型變量。在后面的章節(jié)中英遭,我們將會學到如何聲明间护、構(gòu)造以及初始化一個數(shù)組。
Java枚舉
Java 5.0引入了枚舉挖诸,枚舉限制變量只能是預先設(shè)定好的值汁尺。使用枚舉可以減少代碼中的bug。
例如多律,我們?yōu)楣暝O(shè)計一個程序痴突,它將限制果汁為小杯搂蜓、中杯、大杯辽装。這就意味著它不允許顧客點除了這三種尺寸外的果汁
Java關(guān)鍵字
下面列出了Java保留字帮碰。這些保留字不能用于常量、變量拾积、和任何標識符的名稱殉挽。
Java 空行
空白行,或者有注釋的行拓巧,Java編譯器都會忽略掉斯碌。
繼承
在Java中,一個類可以由其他類派生肛度。如果你要創(chuàng)建一個類傻唾,而且已經(jīng)存在一個類具有你所需要的屬性或方法,那么你可以將新創(chuàng)建的類繼承該類贤斜。
利用繼承的方法策吠,可以重用已存在類的方法和屬性,而不用重寫這些代碼瘩绒。被繼承的類稱為超類(super class)猴抹,派生類稱為子類(subclass)。
接口
在Java中锁荔,接口可理解為對象間相互通信的協(xié)議蟀给。接口在繼承中扮演著很重要的角色。
接口只定義派生要用到的方法阳堕,但是方法的具體實現(xiàn)完全取決于派生類跋理。
Java 源程序與編譯型運行區(qū)別
如下圖所示:
五、Java 對象和類
Java作為一種面向?qū)ο笳Z言恬总。支持以下基本概念:
多態(tài)
繼承
封裝
抽象
類
對象
實例
方法
重載
本節(jié)我們重點研究對象和類的概念前普。
對象:對象是類的一個實例(對象不是找個女朋友),有狀態(tài)和行為壹堰。例如拭卿,一條狗是一個對象,它的狀態(tài)有:顏色贱纠、名字峻厚、品種;行為有:搖尾巴谆焊、叫惠桃、吃等。
類:類是一個模板,它描述一類對象的行為和狀態(tài)辜王。
Java中的對象
現(xiàn)在讓我們深入了解什么是對象劈狐。看看周圍真實的世界誓禁,會發(fā)現(xiàn)身邊有很多對象懈息,車肾档,狗摹恰,人等等。所有這些對象都有自己的狀態(tài)和行為怒见。
拿一條狗來舉例俗慈,它的狀態(tài)有:名字、品種遣耍、顏色闺阱,行為有:叫、搖尾巴和跑舵变。
對比現(xiàn)實對象和軟件對象酣溃,它們之間十分相似。
軟件對象也有狀態(tài)和行為纪隙。軟件對象的狀態(tài)就是屬性赊豌,行為通過方法體現(xiàn)。
在軟件開發(fā)中绵咱,方法操作對象內(nèi)部狀態(tài)的改變,對象的相互調(diào)用也是通過方法來完成。
Java中的類
類可以看成是創(chuàng)建Java對象的模板容客。
一個類可以包含以下類型變量:
局部變量:在方法翰意、構(gòu)造方法或者語句塊中定義的變量被稱為局部變量。變量聲明和初始化都是在方法中麸锉,方法結(jié)束后钠绍,變量就會自動銷毀。
成員變量:成員變量是定義在類中花沉,方法體之外的變量柳爽。這種變量在創(chuàng)建對象的時候?qū)嵗3蓡T變量可以被類中方法主穗、構(gòu)造方法和特定類的語句塊訪問泻拦。
類變量:類變量也聲明在類中,方法體之外忽媒,但必須聲明為static類型争拐。
一個類可以擁有多個方法.
構(gòu)造方法
每個類都有構(gòu)造方法。如果沒有顯式地為類定義構(gòu)造方法,Java編譯器將會為該類提供一個默認構(gòu)造方法架曹。
在創(chuàng)建一個對象的時候隘冲,至少要調(diào)用一個構(gòu)造方法。構(gòu)造方法的名稱必須與類同名绑雄,一個類可以有多個構(gòu)造方法展辞。
創(chuàng)建對象
對象是根據(jù)類創(chuàng)建的。在Java中万牺,使用關(guān)鍵字new來創(chuàng)建一個新的對象罗珍。創(chuàng)建對象需要以下三步:
聲明:聲明一個對象,包括對象名稱和對象類型脚粟。
實例化:使用關(guān)鍵字new來創(chuàng)建一個對象覆旱。
初始化:使用new創(chuàng)建對象時,會調(diào)用構(gòu)造方法初始化對象核无。
源文件聲明規(guī)則
在本節(jié)的最后部分扣唱,我們將學習源文件的聲明規(guī)則。當在一個源文件中定義多個類团南,并且還有import語句和package語句時噪沙,要特別注意這些規(guī)則。
一個源文件中只能有一個public類
一個源文件可以有多個非public類
源文件的名稱應該和public類的類名保持一致吐根。例如:源文件中public類的類名是Employee正歼,那么源文件應該命名為Employee.java。
如果一個類定義在某個包中佑惠,那么package語句應該在源文件的首行朋腋。
如果源文件包含import語句,那么應該放在package語句和類定義之間膜楷。如果沒有package語句旭咽,那么import語句應該在源文件中最前面。
import語句和package語句對源文件中定義的所有類都有效赌厅。在同一源文件中穷绵,不能給不同的類不同的包聲明。
類有若干種訪問級別特愿,并且類也分不同的類型:抽象類和final類等仲墨。這些將在訪問控制章節(jié)介紹。
除了上面提到的幾種類型揍障,Java還有一些特殊的類目养,如:內(nèi)部類、匿名類毒嫡。
Java包
包主要用來對類和接口進行分類癌蚁。當開發(fā)Java程序時,可能編寫成百上千的類,因此很有必要對類和接口進行分類努释。
Import語句
在Java中碘梢,如果給出一個完整的限定名,包括包名伐蒂、類名煞躬,那么Java編譯器就可以很容易地定位到源代碼或者類。Import語句就是用來提供一個合理的路徑逸邦,使得編譯器可以找到某個類恩沛。
六、Java 基本數(shù)據(jù)類型
變量就是申請內(nèi)存來存儲值昭雌。也就是說复唤,當創(chuàng)建變量的時候健田,需要在內(nèi)存中申請空間烛卧。
內(nèi)存管理系統(tǒng)根據(jù)變量的類型為變量分配存儲空間,分配的空間只能用來儲存該類型數(shù)據(jù)妓局。
因此总放,通過定義不同類型的變量,可以在內(nèi)存中儲存整數(shù)好爬、小數(shù)或者字符局雄。
Java 的兩大數(shù)據(jù)類型:
內(nèi)置數(shù)據(jù)類型
引用數(shù)據(jù)類型
1、內(nèi)置數(shù)據(jù)類型
Java語言提供了八種基本類型存炮。六種數(shù)字類型(四個整數(shù)型炬搭,兩個浮點型),一種字符類型穆桂,還有一種布爾型宫盔。
byte:
byte 數(shù)據(jù)類型是8位、有符號的享完,以二進制補碼表示的整數(shù)灼芭;
最小值是 -128(-2^7);
最大值是 127(2^7-1)般又;
默認值是 0彼绷;
byte 類型用在大型數(shù)組中節(jié)約空間,主要代替整數(shù)茴迁,因為 byte 變量占用的空間只有 int 類型的四分之一寄悯;
例子:byte a = 100,byte b = -50堕义。
short:
short 數(shù)據(jù)類型是 16 位猜旬、有符號的以二進制補碼表示的整數(shù)
最小值是 -32768(-2^15);
最大值是 32767(2^15 - 1);
Short 數(shù)據(jù)類型也可以像 byte 那樣節(jié)省空間昔馋。一個short變量是int型變量所占空間的二分之一筹吐;
默認值是 0;
例子:short s = 1000秘遏,short r = -20000丘薛。
int:
int 數(shù)據(jù)類型是32位、有符號的以二進制補碼表示的整數(shù)邦危;
最小值是 -2,147,483,648(-2^31)洋侨;
最大值是 2,147,483,647(2^31 - 1);
一般地整型變量默認為 int 類型倦蚪;
默認值是 0 希坚;
例子:int a = 100000, int b = -200000。
long:
long 數(shù)據(jù)類型是 64 位陵且、有符號的以二進制補碼表示的整數(shù)裁僧;
最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1)慕购;
這種類型主要使用在需要比較大整數(shù)的系統(tǒng)上聊疲;
默認值是 0L;
例子: long a = 100000L沪悲,Long b = -200000L获洲。
"L"理論上不分大小寫,但是若寫成"l"容易與數(shù)字"1"混淆殿如,不容易分辯贡珊。所以最好大寫。
float:
float 數(shù)據(jù)類型是單精度涉馁、32位门岔、符合IEEE 754標準的浮點數(shù);
float 在儲存大型浮點數(shù)組的時候可節(jié)省內(nèi)存空間谨胞;
默認值是 0.0f固歪;
浮點數(shù)不能用來表示精確的值,如貨幣胯努;
例子:float f1 = 234.5f牢裳。
double:
double 數(shù)據(jù)類型是雙精度、64 位叶沛、符合IEEE 754標準的浮點數(shù)蒲讯;
浮點數(shù)的默認類型為double類型;
double類型同樣不能表示精確的值灰署,如貨幣判帮;
默認值是 0.0d局嘁;
例子:double d1 = 123.4。
boolean:
boolean數(shù)據(jù)類型表示一位的信息晦墙;
只有兩個取值:true 和 false悦昵;
這種類型只作為一種標志來記錄 true/false 情況;
默認值是 false晌畅;
例子:boolean one = true但指。
char:
char類型是一個單一的 16 位 Unicode 字符;
最小值是 \u0000(即為0)抗楔;
最大值是 \uffff(即為65,535)棋凳;
char 數(shù)據(jù)類型可以儲存任何字符;
例子:char letter = 'A';连躏。
2剩岳、引用類型
在Java中,引用類型的變量非常類似于C/C++的指針入热。引用類型指向一個對象拍棕,指向?qū)ο蟮淖兞渴且米兞俊_@些變量在聲明時被指定為一個特定的類型才顿,比如 Employee莫湘、Puppy 等。變量一旦聲明后郑气,類型就不能被改變了。
對象腰池、數(shù)組都是引用數(shù)據(jù)類型尾组。
所有引用類型的默認值都是null。
一個引用變量可以用來引用與任何與之兼容的類型示弓。
3讳侨、Java常量
常量在程序運行時,不會被修改的量奏属。
在 Java 中使用 final 關(guān)鍵字來修飾常量跨跨,聲明方式和變量類似:
final double PI = 3.1415927;
雖然常量名也可以用小寫,但為了便于識別囱皿,通常使用大寫字母表示常量勇婴。
字面量可以賦給任何內(nèi)置類型的變量。例如:
byte a = 68; char a = 'A'
4嘱腥、自動類型轉(zhuǎn)換
整型耕渴、實型(常量)、字符型數(shù)據(jù)可以混合運算齿兔。運算中橱脸,不同類型的數(shù)據(jù)先轉(zhuǎn)化為同一類型础米,然后進行運算。
轉(zhuǎn)換從低級到高級添诉。
數(shù)據(jù)類型轉(zhuǎn)換必須滿足如下規(guī)則:
1. 不能對boolean類型進行類型轉(zhuǎn)換屁桑。
2. 不能把對象類型轉(zhuǎn)換成不相關(guān)類的對象。
3. 在把容量大的類型轉(zhuǎn)換為容量小的類型時必須使用強制類型轉(zhuǎn)換栏赴。
4. 轉(zhuǎn)換過程中可能導致溢出或損失精度掏颊,例如:
int i =128; byte b = (byte)i;
因為byte類型時8位,最大值為127艾帐,所以當強制轉(zhuǎn)換為int類型值128時候就會導致溢出乌叶。
5. 浮點數(shù)到整數(shù)的轉(zhuǎn)換是通過舍棄小數(shù)得到,而不是四舍五入柒爸,例如:
5准浴、自動類型轉(zhuǎn)換
必須滿足轉(zhuǎn)換前的數(shù)據(jù)類型的位數(shù)要低于轉(zhuǎn)換后的數(shù)據(jù)類型
6、強制類型轉(zhuǎn)換
1. 條件是轉(zhuǎn)換的數(shù)據(jù)類型必須是兼容的捎稚。
2. 格式:(type)value type是要強制類型轉(zhuǎn)換后的數(shù)據(jù)類型 實例:
7乐横、隱含強制類型轉(zhuǎn)換
1. 整數(shù)的默認類型是 int。
2. 浮點型不存在這種情況今野,因為在定義 float 類型時必須在數(shù)字后面跟上 F 或者 f葡公。
七、Java 變量類型
在Java語言中条霜,所有的變量在使用前必須聲明催什。聲明變量的基本格式如下:
type identifier [ = value][, identifier [= value] ...] ;
格式說明:type為Java數(shù)據(jù)類型爆哑。identifier是變量名食拜∩眨可以使用逗號隔開來聲明多個同類型變量壳咕。
Java語言支持的變量類型有:
類變量:獨立于方法之外的變量编丘,用 static 修飾顽爹。
實例變量:獨立于方法之外的變量起愈,不過沒有 static 修飾用狱。
局部變量:類的方法中的變量麸恍。
Java 局部變量
局部變量聲明在方法灵巧、構(gòu)造方法或者語句塊中;
局部變量在方法抹沪、構(gòu)造方法刻肄、或者語句塊被執(zhí)行的時候創(chuàng)建,當它們執(zhí)行完成后采够,變量將會被銷毀肄方;
訪問修飾符不能用于局部變量;
局部變量只在聲明它的方法蹬癌、構(gòu)造方法或者語句塊中可見权她;
局部變量是在棧上分配的虹茶。
局部變量沒有默認值,所以局部變量被聲明后隅要,必須經(jīng)過初始化蝴罪,才可以使用。
實例變量
實例變量聲明在一個類中步清,但在方法要门、構(gòu)造方法和語句塊之外;
當一個對象被實例化之后廓啊,每個實例變量的值就跟著確定欢搜;
實例變量在對象創(chuàng)建的時候創(chuàng)建,在對象被銷毀的時候銷毀谴轮;
實例變量的值應該至少被一個方法炒瘟、構(gòu)造方法或者語句塊引用,使得外部能夠通過這些方式獲取實例變量信息第步;
實例變量可以聲明在使用前或者使用后疮装;
訪問修飾符可以修飾實例變量;
實例變量對于類中的方法粘都、構(gòu)造方法或者語句塊是可見的廓推。一般情況下應該把實例變量設(shè)為私有。通過使用訪問修飾符可以使實例變量對子類可見翩隧;
實例變量具有默認值樊展。數(shù)值型變量的默認值是0,布爾型變量的默認值是false鸽心,引用類型變量的默認值是null滚局。變量的值可以在聲明時指定,也可以在構(gòu)造方法中指定顽频;
實例變量可以直接通過變量名訪問。但在靜態(tài)方法以及其他類中太闺,就應該使用完全限定名:ObejectReference.VariableName糯景。
類變量(靜態(tài)變量)
類變量也稱為靜態(tài)變量,在類中以static關(guān)鍵字聲明省骂,但必須在方法構(gòu)造方法和語句塊之外蟀淮。
無論一個類創(chuàng)建了多少個對象,類只擁有類變量的一份拷貝钞澳。
靜態(tài)變量除了被聲明為常量外很少使用怠惶。常量是指聲明為public/private,final和static類型的變量轧粟。常量初始化后不可改變策治。
靜態(tài)變量儲存在靜態(tài)存儲區(qū)脓魏。經(jīng)常被聲明為常量,很少單獨使用static聲明變量通惫。
靜態(tài)變量在程序開始時創(chuàng)建茂翔,在程序結(jié)束時銷毀。
與實例變量具有相似的可見性履腋。但為了對類的使用者可見珊燎,大多數(shù)靜態(tài)變量聲明為public類型。
默認值和實例變量相似遵湖。數(shù)值型變量默認值是0悔政,布爾型默認值是false,引用類型默認值是null延旧。變量的值可以在聲明的時候指定谋国,也可以在構(gòu)造方法中指定。此外垄潮,靜態(tài)變量還可以在靜態(tài)語句塊中初始化烹卒。
靜態(tài)變量可以通過:ClassName.VariableName的方式訪問。
類變量被聲明為public static final類型時弯洗,類變量名稱一般建議使用大寫字母旅急。如果靜態(tài)變量不是public和final類型,其命名方式與實例變量以及局部變量的命名方式一致牡整。
八藐吮、Java 修飾符
Java語言提供了很多修飾符,主要分為以下兩類:
訪問修飾符
非訪問修飾符
修飾符用來定義類逃贝、方法或者變量谣辞,通常放在語句的最前端。
訪問控制修飾符
Java中沐扳,可以使用訪問控制符來保護對類泥从、變量、方法和構(gòu)造方法的訪問沪摄。Java支持4種不同的訪問權(quán)限躯嫉。
默認的,也稱為?default杨拐,在同一包內(nèi)可見祈餐,不使用任何修飾符。
私有的哄陶,以?private?修飾符指定帆阳,在同一類內(nèi)可見。
共有的屋吨,以?public?修飾符指定蜒谤,對所有類可見山宾。
受保護的,以?protected?修飾符指定芭逝,對同一包內(nèi)的類和所有子類可見塌碌。
我們可以可以通過以下表來說明訪問權(quán)限:
訪問控制
修飾符當前類同一包內(nèi)子孫類其他包
publicYYYY
protectedYYYN
defaultYYNN
privateYNNN
默認訪問修飾符-不使用任何關(guān)鍵字
使用默認訪問修飾符聲明的變量和方法,對同一個包內(nèi)的類是可見的旬盯。接口里的變量都隱式聲明為 public static final,而接口里的方法默認情況下訪問權(quán)限為 public台妆。
如下例所示,變量和方法的聲明可以不使用任何修飾符胖翰。
私有訪問修飾符-private
私有訪問修飾符是最嚴格的訪問級別接剩,所以被聲明為?private?的方法、變量和構(gòu)造方法只能被所屬類訪問萨咳,并且類和接口不能聲明為?private懊缺。
聲明為私有訪問類型的變量只能通過類中公共的 getter 方法被外部類訪問。
Private 訪問修飾符的使用主要用來隱藏類的實現(xiàn)細節(jié)和保護類的數(shù)據(jù)培他。
公有訪問修飾符-public
被聲明為 public 的類鹃两、方法、構(gòu)造方法和接口能夠被任何其他類訪問舀凛。
如果幾個相互訪問的 public 類分布在不同的包中俊扳,則需要導入相應 public 類所在的包。由于類的繼承性猛遍,類所有的公有方法和變量都能被其子類繼承馋记。
受保護的訪問修飾符-protected
被聲明為 protected 的變量、方法和構(gòu)造器能被同一個包中的任何其他類訪問懊烤,也能夠被不同包中的子類訪問梯醒。
protected 訪問修飾符不能修飾類和接口,方法和成員變量能夠聲明為 protected腌紧,但是接口的成員變量和成員方法不能聲明為 protected茸习。
子類能訪問 protected 修飾符聲明的方法和變量,這樣就能保護不相關(guān)的類使用這些方法和變量壁肋。
訪問控制和繼承
請注意以下方法繼承的規(guī)則:
父類中聲明為 public 的方法在子類中也必須為 public逮光。
父類中聲明為 protected 的方法在子類中要么聲明為 protected,要么聲明為 public墩划,不能聲明為 private。
父類中聲明為 private 的方法嗡综,不能夠被繼承乙帮。
非訪問修飾符
為了實現(xiàn)一些其他的功能,Java 也提供了許多非訪問修飾符极景。
static 修飾符察净,用來創(chuàng)建類方法和類變量驾茴。
final 修飾符,用來修飾類氢卡、方法和變量锈至,final 修飾的類不能夠被繼承,修飾的方法不能被繼承類重新定義译秦,修飾的變量為常量峡捡,是不可修改的。
abstract 修飾符筑悴,用來創(chuàng)建抽象類和抽象方法们拙。
synchronized 和 volatile 修飾符,主要用于線程的編程阁吝。
static 修飾符
靜態(tài)變量:
static 關(guān)鍵字用來聲明獨立于對象的靜態(tài)變量砚婆,無論一個類實例化多少對象,它的靜態(tài)變量只有一份拷貝突勇。 靜態(tài)變量也被稱為類變量装盯。局部變量不能被聲明為 static 變量。
靜態(tài)方法:
static 關(guān)鍵字用來聲明獨立于對象的靜態(tài)方法甲馋。靜態(tài)方法不能使用類的非靜態(tài)變量埂奈。靜態(tài)方法從參數(shù)列表得到數(shù)據(jù),然后計算這些數(shù)據(jù)摔刁。
對類變量和方法的訪問可以直接使用?classname.variablename?和?classname.methodname?的方式訪問挥转。
final 修飾符
final 變量:
? ? ? final 變量能被顯式地初始化并且只能初始化一次。被聲明為 final 的對象的引用不能指向不同的對象共屈。但是 final 對象里的數(shù)據(jù)可以被改變绑谣。也就是說 final 對象的引用不能改變,但是里面的值可以改變拗引。
? ? ? final 修飾符通常和 static 修飾符一起使用來創(chuàng)建類常量借宵。
final 方法
? ? ? 類中的 final 方法可以被子類繼承,但是不能被子類修改矾削。
? ? ? ? 聲明 final 方法的主要目的是防止該方法的內(nèi)容被修改壤玫。
final 類
? ? ? final 類不能被繼承,沒有類能夠繼承 final 類的任何特性哼凯。
abstract 修飾符
抽象類:
抽象類不能用來實例化對象欲间,聲明抽象類的唯一目的是為了將來對該類進行擴充。
一個類不能同時被 abstract 和 final 修飾断部。如果一個類包含抽象方法猎贴,那么該類一定要聲明為抽象類,否則將出現(xiàn)編譯錯誤。
抽象類可以包含抽象方法和非抽象方法她渴。
抽象方法
抽象方法是一種沒有任何實現(xiàn)的方法达址,該方法的的具體實現(xiàn)由子類提供。
抽象方法不能被聲明成 final 和 static趁耗。
任何繼承抽象類的子類必須實現(xiàn)父類的所有抽象方法沉唠,除非該子類也是抽象類。
如果一個類包含若干個抽象方法苛败,那么該類必須聲明為抽象類满葛。抽象類可以不包含抽象方法。
抽象方法的聲明以分號結(jié)尾著拭,例如:public abstract sample();纱扭。
synchronized 修飾符
synchronized 關(guān)鍵字聲明的方法同一時間只能被一個線程訪問。synchronized 修飾符可以應用于四個訪問修飾符儡遮。
transient 修飾符
序列化的對象包含被 transient 修飾的實例變量時乳蛾,java 虛擬機(JVM)跳過該特定的變量。
該修飾符包含在定義變量的語句中鄙币,用來預處理類和變量的數(shù)據(jù)類型肃叶。
volatile 修飾符
volatile 修飾的成員變量在每次被線程訪問時,都強制從共享內(nèi)存中重新讀取該成員變量的值十嘿。而且形导,當成員變量發(fā)生變化時婿牍,會強制線程將變化值回寫到共享內(nèi)存蒋畜。這樣在任何時刻饶号,兩個不同的線程總是看到某個成員變量的同一個值。
一個 volatile 對象引用可能是 null咳燕。
通常情況下勿决,在一個線程調(diào)用 run() 方法(在 Runnable 開啟的線程),在另一個線程調(diào)用 stop() 方法招盲。 如果?第一行?中緩沖區(qū)的 active 值被使用低缩,那么在?第二行?的 active 值為 false 時循環(huán)不會停止。
九曹货、Java 運算符
計算機的最基本用途之一就是執(zhí)行數(shù)學運算咆繁,作為一門計算機語言,Java也提供了一套豐富的運算符來操縱變量顶籽。我們可以把運算符分成以下幾組:
算術(shù)運算符
關(guān)系運算符
位運算符
邏輯運算符
賦值運算符
其他運算符
算術(shù)運算符
算術(shù)運算符用在數(shù)學表達式中玩般,它們的作用和在數(shù)學中的作用一樣。
操作符描述例子
+加法 - 相加運算符兩側(cè)的值A(chǔ) + B 等于 30
-減法 - 左操作數(shù)減去右操作數(shù)A – B 等于 -10
*乘法 - 相乘操作符兩側(cè)的值A(chǔ) * B等于200
/除法 - 左操作數(shù)除以右操作數(shù)B / A等于2
%取模 - 左操作數(shù)除以右操作數(shù)的余數(shù)B%A等于0
++自增: 操作數(shù)的值增加1B++ 或 ++B 等于 21
--自減: 操作數(shù)的值減少1B-- 或 --B 等于 19
自增自減運算符
? ? 1礼饱、自增(++)自減(--)運算符是一種特殊的算術(shù)運算符壤短,在算術(shù)運算符中需要兩個操作數(shù)來進行運算设拟,而自增自減運算符是一個操作數(shù)
2、前綴自增自減法(++a,--a):?先進行自增或者自減運算久脯,再進行表達式運算。
3镰吆、后綴自增自減法(a++,a--):?先進行表達式運算帘撰,再進行自增或者自減運算
關(guān)系運算符
下表為Java支持的關(guān)系運算符
表格中的實例整數(shù)變量A的值為10,變量B的值為20:
運算符描述例子
==檢查如果兩個操作數(shù)的值是否相等万皿,如果相等則條件為真摧找。(A == B)為假(非真)。
!=檢查如果兩個操作數(shù)的值是否相等牢硅,如果值不相等則條件為真蹬耘。(A != B) 為真。
> 檢查左操作數(shù)的值是否大于右操作數(shù)的值减余,如果是那么條件為真综苔。(A> B)非真。
< 檢查左操作數(shù)的值是否小于右操作數(shù)的值位岔,如果是那么條件為真如筛。(A
> =檢查左操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是那么條件為真抒抬。(A> = B)為假杨刨。
<=檢查左操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是那么條件為真擦剑。(A <= B)為真妖胀。
位運算符
Java定義了位運算符,應用于整數(shù)類型(int)惠勒,長整型(long)赚抡,短整型(short),字符型(char)捉撮,和字節(jié)型(byte)等類型怕品。
操作符描述例子
&如果相對應位都是1,則結(jié)果為1巾遭,否則為0(A&B)肉康,得到12,即0000 1100
|如果相對應位都是0灼舍,則結(jié)果為0吼和,否則為1(A | B)得到61,即 0011 1101
^如果相對應位值相同骑素,則結(jié)果為0炫乓,否則為1(A ^ B)得到49,即 0011 0001
?按位補運算符翻轉(zhuǎn)操作數(shù)的每一位,即0變成1末捣,1變成0侠姑。(?A)得到-61,即1100 0011
<< 按位左移運算符箩做。左操作數(shù)按位左移右操作數(shù)指定的位數(shù)莽红。A << 2得到240,即 1111 0000
>> 按位右移運算符邦邦。左操作數(shù)按位右移右操作數(shù)指定的位數(shù)安吁。A >> 2得到15即 1111
>>> 按位右移補零操作符。左操作數(shù)的值按右操作數(shù)指定的位數(shù)右移燃辖,移動得到的空位以零填充鬼店。A>>>2得到15即0000 1111
邏輯運算符
下表列出了邏輯運算符的基本運算,假設(shè)布爾變量A為真黔龟,變量B為假
操作符描述例子
&&稱為邏輯與運算符妇智。當且僅當兩個操作數(shù)都為真,條件才為真捌锭。(A && B)為假俘陷。
| |稱為邏輯或操作符。如果任何兩個操作數(shù)任何一個為真观谦,條件為真拉盾。(A | | B)為真。
豁状!稱為邏輯非運算符捉偏。用來反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為true泻红,則邏輯非運算符將得到false夭禽。!(A && B)為真谊路。
短路邏輯運算符
當使用與邏輯運算符時讹躯,在兩個操作數(shù)都為true時,結(jié)果才為true缠劝,但是當?shù)玫降谝粋€操作為false時潮梯,其結(jié)果就必定是false,這時候就不會再判斷第二個操作了惨恭。
賦值運算符
下面是Java語言支持的賦值運算符:
操作符描述例子
=簡單的賦值運算符秉馏,將右操作數(shù)的值賦給左側(cè)操作數(shù)C = A + B將把A + B得到的值賦給C
+ =加和賦值操作符,它把左操作數(shù)和右操作數(shù)相加賦值給左操作數(shù)C + = A等價于C = C + A
- =減和賦值操作符脱羡,它把左操作數(shù)和右操作數(shù)相減賦值給左操作數(shù)C - = A等價于C = C -
A
* =乘和賦值操作符萝究,它把左操作數(shù)和右操作數(shù)相乘賦值給左操作數(shù)C * = A等價于C = C * A
/ =除和賦值操作符免都,它把左操作數(shù)和右操作數(shù)相除賦值給左操作數(shù)C / = A等價于C = C / A
(%)=取模和賦值操作符,它把左操作數(shù)和右操作數(shù)取模后賦值給左操作數(shù)C%= A等價于C = C%A
<< =左移位賦值運算符C << = 2等價于C = C << 2
>> =右移位賦值運算符C >> = 2等價于C = C >> 2
&=按位與賦值運算符C&= 2等價于C = C&2
^ =按位異或賦值操作符C ^ = 2等價于C = C ^ 2
| =按位或賦值操作符C | = 2等價于C = C | 2
條件運算符(?:)
條件運算符也被稱為三元運算符帆竹。該運算符有3個操作數(shù)绕娘,并且需要判斷布爾表達式的值。該運算符的主要是決定哪個值應該賦值給變量馆揉。
variable x = (expression) ? value if true : value if false
instanceof 運算符
該運算符用于操作對象實例业舍,檢查該對象是否是一個特定類型(類類型或接口類型)。
instanceof運算符使用格式如下:
( Object reference variable ) instanceof (class/interface type)
如果運算符左側(cè)變量所指的對象升酣,是操作符右側(cè)類或接口(class/interface)的一個對象,那么結(jié)果為真态罪。
Java運算符優(yōu)先級
當多個運算符出現(xiàn)在一個表達式中噩茄,誰先誰后呢?這就涉及到運算符的優(yōu)先級別的問題复颈。在一個多運算符的表達式中绩聘,運算符優(yōu)先級不同會導致最后得出的結(jié)果差別甚大。
例如耗啦,(1+3)+(3+2)*2凿菩,這個表達式如果按加號最優(yōu)先計算,答案就是 18帜讲,如果按照乘號最優(yōu)先衅谷,答案則是 14。
再如似将,x = 7 + 3 * 2;這里x得到13获黔,而不是20,因為乘法運算符比加法運算符有較高的優(yōu)先級在验,所以先計算3 * 2得到6玷氏,然后再加7。
下表中具有最高優(yōu)先級的運算符在的表的最上面腋舌,最低優(yōu)先級的在表的底部盏触。
類別操作符關(guān)聯(lián)性
后綴() [] . (點操作符)左到右
一元+ + - !?從右到左
乘性 * /%左到右
加性 + -左到右
移位 >> >>>? << 左到右
關(guān)系 >> = << = 左到右
相等 ==? !=左到右
按位與&左到右
按位異或^左到右
按位或|左到右
邏輯與&&左到右
邏輯或| |左到右
條件块饺?:從右到左
賦值= + = - = * = / =%= >> = << =&= ^ = | =從右到左
逗號赞辩,左到右
十、Java 循環(huán)結(jié)構(gòu) - for, while 及 do...while
順序結(jié)構(gòu)的程序語句只能被執(zhí)行一次刨沦。如果您想要同樣的操作執(zhí)行多次,诗宣,就需要使用循環(huán)結(jié)構(gòu)。
Java中有三種主要的循環(huán)結(jié)構(gòu):
while?循環(huán)
do…while?循環(huán)
for?循環(huán)
while 循環(huán)
while是最基本的循環(huán)想诅,它的結(jié)構(gòu)為:
while( 布爾表達式 ) { //循環(huán)內(nèi)容? }
只要布爾表達式為 true召庞,循環(huán)體會一直執(zhí)行下去岛心。
do…while 循環(huán)
對于 while 語句而言,如果不滿足條件篮灼,則不能進入循環(huán)忘古。但有時候我們需要即使不滿足條件,也至少執(zhí)行一次诅诱。
do…while 循環(huán)和 while 循環(huán)相似髓堪,不同的是,do…while 循環(huán)至少會執(zhí)行一次娘荡。
do { //代碼語句 }while(布爾表達式);
注意:布爾表達式在循環(huán)體的后面干旁,所以語句塊在檢測布爾表達式之前已經(jīng)執(zhí)行了。 如果布爾表達式的值為 true炮沐,則語句塊一直執(zhí)行争群,直到布爾表達式的值為 false。
for循環(huán)
雖然所有循環(huán)結(jié)構(gòu)都可以用 while 或者 do...while表示大年,但 Java 提供了另一種語句 —— for 循環(huán)换薄,使一些循環(huán)結(jié)構(gòu)變得更加簡單。
for循環(huán)執(zhí)行的次數(shù)是在執(zhí)行前就確定的翔试。語法格式如下:
for(初始化; 布爾表達式; 更新) { //代碼語句? }
關(guān)于 for 循環(huán)有以下幾點說明:
最先執(zhí)行初始化步驟轻要。可以聲明一種類型垦缅,但可初始化一個或多個循環(huán)控制變量冲泥,也可以是空語句。
然后失都,檢測布爾表達式的值柏蘑。如果為 true,循環(huán)體被執(zhí)行粹庞。如果為false咳焚,循環(huán)終止,開始執(zhí)行循環(huán)體后面的語句庞溜。
執(zhí)行一次循環(huán)后革半,更新循環(huán)控制變量。
再次檢測布爾表達式流码。循環(huán)執(zhí)行上面的過程又官。
Java 增強 for 循環(huán)
Java5 引入了一種主要用于數(shù)組的增強型 for 循環(huán)。
Java 增強 for 循環(huán)語法格式如下:
for(聲明語句 : 表達式) { //代碼句子? }
聲明語句:聲明新的局部變量漫试,該變量的類型必須和數(shù)組元素的類型匹配六敬。其作用域限定在循環(huán)語句塊,其值與此時數(shù)組元素的值相等驾荣。
表達式:表達式是要訪問的數(shù)組名外构,或者是返回值為數(shù)組的方法普泡。
break 關(guān)鍵字
break 主要用在循環(huán)語句或者 switch 語句中,用來跳出整個語句塊审编。
break 跳出最里層的循環(huán)撼班,并且繼續(xù)執(zhí)行該循環(huán)下面的語句。
語法
break 的用法很簡單垒酬,就是循環(huán)結(jié)構(gòu)中的一條語句:
break;
continue 關(guān)鍵字
continue 適用于任何循環(huán)控制結(jié)構(gòu)中砰嘁。作用是讓程序立刻跳轉(zhuǎn)到下一次循環(huán)的迭代。
在 for 循環(huán)中勘究,continue 語句使程序立即跳轉(zhuǎn)到更新語句矮湘。
在 while 或者 do…while 循環(huán)中,程序立即跳轉(zhuǎn)到布爾表達式的判斷語句口糕。
語法
continue 就是循環(huán)體中一條簡單的語句:
continue;
十一板祝、Java 分支結(jié)構(gòu) - if...else/swithich
順序結(jié)構(gòu)只能順序執(zhí)行,不能進行判斷和選擇走净,因此需要分支結(jié)構(gòu)。
Java 有兩種分支結(jié)構(gòu):
if?語句
switch?語句
if 語句
一個 if 語句包含一個布爾表達式和一條或多條語句孤里。
語法
if 語句的用語法如下:
if(布爾表達式) { //如果布爾表達式為true將執(zhí)行的語句? }
如果布爾表達式的值為 true伏伯,則執(zhí)行 if 語句中的代碼塊,否則執(zhí)行 if 語句塊后面的代碼捌袜。
if...else語句
if 語句后面可以跟 else 語句说搅,當 if 語句的布爾表達式值為 false 時,else 語句塊會被執(zhí)行虏等。
語法
if…else 的用法如下:
if(布爾表達式){ //如果布爾表達式的值為true? }else{ //如果布爾表達式的值為false? }
if...else if...else 語句
if 語句后面可以跟 elseif…else 語句弄唧,這種語句可以檢測到多種可能的情況。
使用 if霍衫,else if候引,else 語句的時候,需要注意下面幾點:
if 語句至多有 1 個 else 語句敦跌,else 語句在所有的 elseif 語句之后澄干。
if 語句可以有若干個 elseif 語句,它們必須在 else 語句之前柠傍。
一旦其中一個 else if 語句檢測為 true麸俘,其他的 else if 以及 else 語句都將跳過執(zhí)行。
嵌套的 if…else 語句
使用嵌套的 if…else 語句是合法的惧笛。也就是說你可以在另一個 if 或者 elseif 語句中使用 if 或者 elseif 語句从媚。
語法
嵌套的 if…else 語法格式如下:
if(布爾表達式 1){ ////如果布爾表達式 1的值為true執(zhí)行代碼? if(布爾表達式 2){ ////如果布爾表達式 2的值為true執(zhí)行代碼? } }
你可以像 if 語句一樣嵌套 else if...else。
switch 語句
switch 語句判斷一個變量與一系列值中某個值是否相等患整,每個值稱為一個分支拜效。
語法
switch 語法格式如下:
switch(expression){ case value : //語句? break; //可選? case value : //語句? break; //可選? //你可以有任意數(shù)量的case語句? default : //可選? //語句? }
switch 語句有如下規(guī)則:
switch 語句中的變量類型可以是: byte喷众、short、int 或者 char拂檩。從 Java SE 7 開始侮腹,switch 支持字符串類型了,同時 case 標簽必須為字符串常量或字面量稻励。
switch 語句可以擁有多個 case 語句父阻。每個 case 后面跟一個要比較的值和冒號探膊。
case 語句中的值的數(shù)據(jù)類型必須與變量的數(shù)據(jù)類型相同所森,而且只能是常量或者字面常量。
當變量的值與 case 語句的值相等時儡羔,那么 case 語句之后的語句開始執(zhí)行煤篙,直到 break 語句出現(xiàn)才會跳出 switch 語句斟览。
當遇到 break 語句時,switch 語句終止辑奈。程序跳轉(zhuǎn)到 switch 語句后面的語句執(zhí)行苛茂。case 語句不必須要包含 break 語句。如果沒有 break 語句出現(xiàn)鸠窗,程序會繼續(xù)執(zhí)行下一條 case 語句妓羊,直到出現(xiàn) break 語句。
switch 語句可以包含一個 default 分支稍计,該分支必須是 switch 語句的最后一個分支躁绸。default 在沒有 case 語句的值和變量值相等的時候執(zhí)行。default 分支不需要 break 語句臣嚣。
十二净刮、Java Number & Math 類
一般地,當需要使用數(shù)字的時候硅则,我們通常使用內(nèi)置數(shù)據(jù)類型淹父,如:byte、int抢埋、long弹灭、double?等。
然而揪垄,在實際開發(fā)過程中穷吮,我們經(jīng)常會遇到需要使用對象,而不是內(nèi)置數(shù)據(jù)類型的情形饥努。為了解決這個問題捡鱼,Java 語言為每一個內(nèi)置數(shù)據(jù)類型提供了對應的包裝類。
所有的包裝類(Integer酷愧、Long驾诈、Byte缠诅、Double、Float乍迄、Short)都是抽象類 Number 的子類管引。
這種由編譯器特別支持的包裝稱為裝箱,所以當內(nèi)置數(shù)據(jù)類型被當作對象使用的時候闯两,編譯器會把內(nèi)置類型裝箱為包裝類褥伴。相似的,編譯器也可以把一個對象拆箱為內(nèi)置類型漾狼。Number 類屬于 java.lang 包重慢。
Java Math 類
Java 的 Math 包含了用于執(zhí)行基本數(shù)學運算的屬性和方法,如初等指數(shù)逊躁、對數(shù)似踱、平方根和三角函數(shù)。
Math 的方法都被定義為 static 形式稽煤,通過 Math 類可以在主函數(shù)中直接調(diào)用核芽。
Number & Math 類方法
下面的表中列出的是 Number & Math 類常用的一些方法:
序號方法與描述
將 Number 對象轉(zhuǎn)換為xxx數(shù)據(jù)類型的值并返回。
將number對象與參數(shù)比較酵熙。
判斷number對象是否與參數(shù)相等狞洋。
返回一個 Number 對象指定的內(nèi)置數(shù)據(jù)類型
以字符串形式返回值。
將字符串解析為int類型绿店。
返回參數(shù)的絕對值。
對整形變量向左取整庐橙,返回類型為double型假勿。
對整型變量向右取整。返回類型為double類型态鳖。
10rint()
返回與參數(shù)最接近的整數(shù)转培。返回類型為double。
11round()
返回一個最接近的int浆竭、long型值浸须。
12min()
返回兩個參數(shù)中的最小值。
13max()
返回兩個參數(shù)中的最大值邦泄。
14exp()
返回自然數(shù)底數(shù)e的參數(shù)次方删窒。
15log()
返回參數(shù)的自然數(shù)底數(shù)的對數(shù)值。
16pow()
返回第一個參數(shù)的第二個參數(shù)次方顺囊。
17sqrt()
求參數(shù)的算術(shù)平方根肌索。
18sin()
求指定double類型參數(shù)的正弦值。
19cos()
求指定double類型參數(shù)的余弦值特碳。
20tan()
求指定double類型參數(shù)的正切值诚亚。
21asin()
求指定double類型參數(shù)的反正弦值晕换。
22acos()
求指定double類型參數(shù)的反余弦值。
23atan()
求指定double類型參數(shù)的反正切值站宗。
24atan2()
將笛卡爾坐標轉(zhuǎn)換為極坐標闸准,并返回極坐標的角度值。
將參數(shù)轉(zhuǎn)化為角度梢灭。
將角度轉(zhuǎn)換為弧度夷家。
27random()
返回一個隨機數(shù)。
十三或辖、Java Character 類
Character 類用于對單個字符進行操作瘾英。
Character 類在對象中包裝一個基本類型?char?的值。
然而颂暇,在實際開發(fā)過程中缺谴,我們經(jīng)常會遇到需要使用對象,而不是內(nèi)置數(shù)據(jù)類型的情況耳鸯。為了解決這個問題湿蛔,Java語言為內(nèi)置數(shù)據(jù)類型char提供了包裝類Character類。
Character類提供了一系列方法來操縱字符县爬。你可以使用Character的構(gòu)造方法創(chuàng)建一個Character類對象阳啥,
在某些情況下,Java編譯器會自動創(chuàng)建一個Character對象财喳。
例如察迟,將一個char類型的參數(shù)傳遞給需要一個Character類型參數(shù)的方法時,那么編譯器會自動地將char類型參數(shù)轉(zhuǎn)換為Character對象耳高。 這種特征稱為裝箱扎瓶,反過來稱為拆箱。
轉(zhuǎn)義序列
前面有反斜杠(\)的字符代表轉(zhuǎn)義字符泌枪,它對編譯器來說是有特殊含義的概荷。
下面列表展示了Java的轉(zhuǎn)義序列:
轉(zhuǎn)義序列描述
\t在文中該處插入一個tab鍵
\b在文中該處插入一個后退鍵
\n在文中該處換行
\r在文中該處插入回車
\f在文中該處插入換頁符
\'在文中該處插入單引號
\"在文中該處插入雙引號
\\在文中該處插入反斜杠
Character 方法
下面是Character類的方法:
序號方法與描述
是否是一個字母
是否是一個數(shù)字字符
是否是一個空格
是否是大寫字母
是否是小寫字母
指定字母的大寫形式
7toLowerCase()
指定字母的小寫形式
8toString()
返回字符的字符串形式,字符串的長度僅為1
十四碌燕、Java String 類
字符串廣泛應用 在Java 編程中误证,在 Java 中字符串屬于對象,Java 提供了 String 類來創(chuàng)建和操作字符串修壕。
創(chuàng)建字符串
創(chuàng)建字符串最簡單的方式如下:
String greeting = "菜鳥教程";
在代碼中遇到字符串常量時愈捅,這里的值是 "菜鳥教程"",編譯器會使用該值創(chuàng)建一個 String 對象慈鸠。
和其它對象一樣改鲫,可以使用關(guān)鍵字和構(gòu)造方法來創(chuàng)建 String 對象。
String 類有 11 種構(gòu)造方法,這些方法提供不同的參數(shù)來初始化字符串像棘,比如提供一個字符數(shù)組參數(shù)稽亏。
字符串長度
用于獲取有關(guān)對象的信息的方法稱為訪問器方法。
String 類的一個訪問器方法是 length() 方法缕题,它返回字符串對象包含的字符數(shù)截歉。
連接字符串
String 類提供了連接兩個字符串的方法:
string1.concat(string2);
返回 string2 連接 string1 的新字符串。也可以對字符串常量使用 concat() 方法, 更常用的是使用'+'操作符來連接字符串.
創(chuàng)建格式化字符串
我們知道輸出格式化數(shù)字可以使用 printf() 和 format() 方法烟零。
String 類使用靜態(tài)方法 format() 返回一個String 對象而不是 PrintStream 對象瘪松。
String 類的靜態(tài)方法 format() 能用來創(chuàng)建可復用的格式化字符串,而不僅僅是用于一次打印輸出锨阿。
String 方法
下面是 String 類支持的方法宵睦,更多詳細,參看?Java String API?文檔:
SN(序號)方法描述
返回指定索引處的 char 值墅诡。
把這個字符串和另一個對象比較壳嚎。
3int compareTo(String anotherString)
按字典順序比較兩個字符串。
4int compareToIgnoreCase(String str)
按字典順序比較兩個字符串末早,不考慮大小寫烟馅。
將指定字符串連接到此字符串的結(jié)尾。
6boolean contentEquals(StringBuffer sb)
當且僅當字符串與指定的StringButter有相同順序的字符時候返回真然磷。
7static String copyValueOf(char[] data)
返回指定數(shù)組中表示該字符序列的 String郑趁。
8static String copyValueOf(char[] data, int offset, int count)
返回指定數(shù)組中表示該字符序列的 String。
9boolean endsWith(String suffix)
測試此字符串是否以指定的后綴結(jié)束姿搜。
10boolean equals(Object anObject)
將此字符串與指定的對象比較寡润。
11boolean equalsIgnoreCase(String anotherString)
將此 String 與另一個 String 比較,不考慮大小寫舅柜。
使用平臺的默認字符集將此 String 編碼為 byte 序列悦穿,并將結(jié)果存儲到一個新的 byte 數(shù)組中。
13byte[] getBytes(String charsetName)
使用指定的字符集將此 String 編碼為 byte 序列业踢,并將結(jié)果存儲到一個新的 byte 數(shù)組中。
14void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
將字符從此字符串復制到目標字符數(shù)組礁扮。
返回此字符串的哈希碼知举。
返回指定字符在此字符串中第一次出現(xiàn)處的索引。
17int indexOf(int ch, int fromIndex)
返回在此字符串中第一次出現(xiàn)指定字符處的索引太伊,從指定的索引開始搜索雇锡。
返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
19int indexOf(String str, int fromIndex)
返回指定子字符串在此字符串中第一次出現(xiàn)處的索引僚焦,從指定的索引開始锰提。
返回字符串對象的規(guī)范化表示形式。
返回指定字符在此字符串中最后一次出現(xiàn)處的索引。
22int lastIndexOf(int ch, int fromIndex)
返回指定字符在此字符串中最后一次出現(xiàn)處的索引立肘,從指定的索引處開始進行反向搜索边坤。
返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引。
24int lastIndexOf(String str, int fromIndex)
返回指定子字符串在此字符串中最后一次出現(xiàn)處的索引谅年,從指定的索引開始反向搜索茧痒。
返回此字符串的長度。
26boolean matches(String regex)
告知此字符串是否匹配給定的正則表達式融蹂。
27boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
測試兩個字符串區(qū)域是否相等旺订。
28boolean regionMatches(int toffset, String other, int ooffset, int len)
測試兩個字符串區(qū)域是否相等。
29String replace(char oldChar, char newChar)
返回一個新的字符串超燃,它是通過用 newChar 替換此字符串中出現(xiàn)的所有 oldChar 得到的区拳。
30String replaceAll(String regex, String replacement
使用給定的 replacement 替換此字符串所有匹配給定的正則表達式的子字符串。
31String replaceFirst(String regex, String replacement)
使用給定的 replacement 替換此字符串匹配給定的正則表達式的第一個子字符串意乓。
32String[] split(String regex)
根據(jù)給定正則表達式的匹配拆分此字符串樱调。
33String[] split(String regex, int limit)
根據(jù)匹配給定的正則表達式來拆分此字符串。
34boolean startsWith(String prefix)
測試此字符串是否以指定的前綴開始洽瞬。
35boolean startsWith(String prefix, int toffset)
測試此字符串從指定索引開始的子字符串是否以指定前綴開始本涕。
36CharSequence subSequence(int beginIndex, int endIndex)
返回一個新的字符序列,它是此序列的一個子序列伙窃。
37String substring(int beginIndex)
返回一個新的字符串菩颖,它是此字符串的一個子字符串。
38String substring(int beginIndex, int endIndex)
返回一個新字符串为障,它是此字符串的一個子字符串晦闰。
將此字符串轉(zhuǎn)換為一個新的字符數(shù)組。
使用默認語言環(huán)境的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為小寫鳍怨。
41String toLowerCase(Locale locale)
使用給定 Locale 的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為小寫呻右。
返回此對象本身(它已經(jīng)是一個字符串!)鞋喇。
使用默認語言環(huán)境的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為大寫声滥。
44String toUpperCase(Locale locale)
使用給定 Locale 的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為大寫。
返回字符串的副本侦香,忽略前導空白和尾部空白落塑。
46static String valueOf(primitive data type x)
返回給定data type類型x參數(shù)的字符串表示形式。
十五罐韩、Java StringBuffer 和 StringBuilder 類
當對字符串進行修改的時候憾赁,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是散吵,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改龙考,并且不產(chǎn)生新的未使用對象蟆肆。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問)晦款。
由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢炎功,所以多數(shù)情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下柬赐,則必須使用 StringBuffer 類亡问。
StringBuffer 方法
以下是 StringBuffer 類支持的主要方法:
序號方法描述
1public StringBuffer append(String s)
將指定的字符串追加到此字符序列。
2public StringBuffer reverse()
將此字符序列用其反轉(zhuǎn)形式取代肛宋。
3public delete(int start, int end)
移除此序列的子字符串中的字符州藕。
4public insert(int offset, int i)
將 int 參數(shù)的字符串表示形式插入此序列中。
5replace(int start, int end, String str)
使用給定 String 中的字符替換此序列的子字符串中的字符酝陈。
下面的列表里的方法和 String 類的方法類似:
序號方法描述
1int capacity()
返回當前容量床玻。
2char charAt(int index)
返回此序列中指定索引處的 char 值。
3void ensureCapacity(int minimumCapacity)
確保容量至少等于指定的最小值沉帮。
4void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
將字符從此序列復制到目標字符數(shù)組 dst锈死。
5int indexOf(String str)
返回第一次出現(xiàn)的指定子字符串在該字符串中的索引。
6int indexOf(String str, int fromIndex)
從指定的索引處開始穆壕,返回第一次出現(xiàn)的指定子字符串在該字符串中的索引待牵。
7int lastIndexOf(String str)
返回最右邊出現(xiàn)的指定子字符串在此字符串中的索引。
8int lastIndexOf(String str, int fromIndex)
返回最后一次出現(xiàn)的指定子字符串在此字符串中的索引喇勋。
9int length()
返回長度(字符數(shù))缨该。
10void setCharAt(int index, char ch)
將給定索引處的字符設(shè)置為 ch。
11void setLength(int newLength)
設(shè)置字符序列的長度川背。
12CharSequence subSequence(int start, int end)
返回一個新的字符序列贰拿,該字符序列是此序列的子序列。
13String substring(int start)
返回一個新的 String熄云,它包含此字符序列當前所包含的字符子序列膨更。
14String substring(int start, int end)
返回一個新的 String,它包含此序列當前所包含的字符子序列缴允。
15String toString()
返回此序列中數(shù)據(jù)的字符串表示形式荚守。
十六、Java 數(shù)組
數(shù)組對于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一练般,當然不同語言對數(shù)組的實現(xiàn)及處理也不盡相同矗漾。
Java 語言中提供的數(shù)組是用來存儲固定大小的同類型元素。
你可以聲明一個數(shù)組變量踢俄,如 numbers[100] 來代替直接聲明 100 個獨立變量 number0,number1晴及,....都办,number99。
本教程將為大家介紹 Java 數(shù)組的聲明、創(chuàng)建和初始化琳钉,并給出其對應的代碼势木。
聲明數(shù)組變量
首先必須聲明數(shù)組變量,才能在程序中使用數(shù)組歌懒。下面是聲明數(shù)組變量的語法:
dataType[] arrayRefVar; // 首選的方法? 或 dataType arrayRefVar[]; // 效果相同啦桌,但不是首選方法
注意:?建議使用?dataType[] arrayRefVar?的聲明風格聲明數(shù)組變量。 dataType arrayRefVar[] 風格是來自 C/C++ 語言 及皂,在Java中采用是為了讓 C/C++ 程序員能夠快速理解java語言甫男。
創(chuàng)建數(shù)組
Java語言使用new操作符來創(chuàng)建數(shù)組,語法如下:
arrayRefVar = new dataType[arraySize];
上面的語法語句做了兩件事:
一验烧、使用 dataType[arraySize] 創(chuàng)建了一個數(shù)組寨辩。
二掠哥、把新創(chuàng)建的數(shù)組的引用賦值給變量 arrayRefVar。
數(shù)組變量的聲明,和創(chuàng)建數(shù)組可以用一條語句完成温兼,如下所示:
dataType[] arrayRefVar = new dataType[arraySize];
另外,你還可以使用如下的方式創(chuàng)建數(shù)組植锉。
dataType[] arrayRefVar = {value0, value1, ..., valuek};
數(shù)組的元素是通過索引訪問的泥栖。數(shù)組索引從 0 開始,所以索引值從 0 到 arrayRefVar.length-1弧满。
下面的圖片描繪了數(shù)組 myList婆跑。這里 myList 數(shù)組里有 10 個 double 元素,它的下標從 0 到 9谱秽。
處理數(shù)組
數(shù)組的元素類型和數(shù)組的大小都是確定的洽蛀,所以當處理數(shù)組元素時候,我們通常使用基本循環(huán)或者 foreach 循環(huán)疟赊。
foreach 循環(huán)
JDK 1.5 引進了一種新的循環(huán)類型郊供,被稱為 foreach 循環(huán)或者加強型循環(huán),它能在不使用下標的情況下遍歷數(shù)組近哟。
數(shù)組作為函數(shù)的參數(shù)
數(shù)組可以作為參數(shù)傳遞給方法驮审。
數(shù)組作為函數(shù)的返回值
多維數(shù)組
多維數(shù)組可以看成是數(shù)組的數(shù)組,比如二維數(shù)組就是一個特殊的一維數(shù)組吉执,其每一個元素都是一個一維數(shù)組疯淫。
多維數(shù)組的動態(tài)初始化(以二維數(shù)組為例)
1. 直接為每一維分配空間,格式如下:
type arrayName = new typ[arraylenght1][arraylenght2];
type 可以為基本數(shù)據(jù)類型和復合數(shù)據(jù)類型戳玫,arraylenght1 和 arraylenght2 必須為正整數(shù)熙掺,arraylenght1 為行數(shù),arraylenght2 為列數(shù)咕宿。
例如:
int a[][] = new int[2][3];
解析:
二維數(shù)組 a 可以看成一個兩行三列的數(shù)組币绩。
2. 從最高維開始蜡秽,分別為每一維分配空間,例如:
String s[][] = new String[2][]; s[0] = new String[2]; s[1] = new String[3]; s[0][0] = new String("Good"); s[0][1] = new String("Luck"); s[1][0] = new String("to"); s[1][1] = new String("you"); s[1][2] = new String("!");
解析:
s[0]=new String[2] 和 s[1]=new String[3] 是為最高維分配引用空間缆镣,也就是為最高維限制其能保存數(shù)據(jù)的最長的長度芽突,然后再為其每個數(shù)組元素單獨分配空間 s0=new String("Good") 等操作。
多維數(shù)組的引用(以二維數(shù)組為例)
對二維數(shù)組中的每個元素董瞻,引用方式為?arrayName[index1][index2]寞蚌,例如:
num[1][0];
Arrays 類
java.util.Arrays 類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的钠糊。
具有以下功能:
給數(shù)組賦值:通過 fill 方法挟秤。
對數(shù)組排序:通過 sort 方法,按升序。
比較數(shù)組:通過 equals 方法比較數(shù)組中元素值是否相等眠蚂。
查找數(shù)組元素:通過 binarySearch 方法能對排序好的數(shù)組進行二分查找法操作煞聪。
具體說明請查看下表:
序號方法和說明
1public static int binarySearch(Object[] a, Object key)
用二分查找算法在給定數(shù)組中搜索給定值的對象(Byte,Int,double等)。數(shù)組在調(diào)用前必須排序好的逝慧。如果查找值包含在數(shù)組中昔脯,則返回搜索鍵的索引;否則返回 (-(插入點) - 1)笛臣。
2public static boolean equals(long[] a, long[] a2)
如果兩個指定的 long 型數(shù)組彼此相等云稚,則返回 true。如果兩個數(shù)組包含相同數(shù)量的元素沈堡,并且兩個數(shù)組中的所有相應元素對都是相等的静陈,則認為這兩個數(shù)組是相等的。換句話說诞丽,如果兩個數(shù)組以相同順序包含相同的元素鲸拥,則兩個數(shù)組是相等的。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte僧免,short刑赶,Int等)。
3public static void fill(int[] a, int val)
將指定的 int 值分配給指定 int 型數(shù)組指定范圍中的每個元素懂衩。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte撞叨,short,Int等)浊洞。
4public static void sort(Object[] a)
對指定對象數(shù)組根據(jù)其元素的自然順序進行升序排列牵敷。同樣的方法適用于所有的其他基本數(shù)據(jù)類型(Byte,short法希,Int等)枷餐。
十七、Java 日期時間
java.util 包提供了 Date 類來封裝當前的日期和時間苫亦。 Date 類提供兩個構(gòu)造函數(shù)來實例化 Date 對象毛肋。
第一個構(gòu)造函數(shù)使用當前日期和時間來初始化對象奕锌。
Date( )
第二個構(gòu)造函數(shù)接收一個參數(shù),該參數(shù)是從1970年1月1日起的毫秒數(shù)村生。
Date(long millisec)
Date對象創(chuàng)建以后,可以調(diào)用下面的方法饼丘。
序號方法和描述
1boolean after(Date date)
若當調(diào)用此方法的Date對象在指定日期之后返回true,否則返回false趁桃。
2boolean before(Date date)
若當調(diào)用此方法的Date對象在指定日期之前返回true,否則返回false。
3Object clone( )
返回此對象的副本肄鸽。
4int compareTo(Date date)
比較當調(diào)用此方法的Date對象和指定日期卫病。兩者相等時候返回0蟀苛。調(diào)用對象在指定日期之前則返回負數(shù)逮诲。調(diào)用對象在指定日期之后則返回正數(shù)梅鹦。
5int compareTo(Object obj)
若obj是Date類型則操作等同于compareTo(Date) 。否則它拋出ClassCastException嗤栓。
6boolean equals(Object date)
當調(diào)用此方法的Date對象和指定日期相等時候返回true,否則返回false。
7long getTime( )
返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 對象表示的毫秒數(shù)。
8int hashCode( )
返回此對象的哈希碼值全封。
9void setTime(long time)
用自1970年1月1日00:00:00 GMT以后time毫秒數(shù)設(shè)置時間和日期攒暇。
10String toString( )
轉(zhuǎn)換Date對象為String表示形式就轧,并返回該字符串解愤。
獲取當前日期時間
Java中獲取當前日期和時間很簡單,使用 Date 對象的 toString() 方法來打印當前日期和時間哼鬓。
日期比較
Java使用以下三種方法來比較兩個日期:
使用 getTime() 方法獲取兩個日期(自1970年1月1日經(jīng)歷的毫秒數(shù)值),然后比較這兩個值。
使用方法 before(),after() 和 equals()券册。例如耕赘,一個月的12號比18號早九火,則 new Date(99, 2, 12).before(new Date (99, 2, 18)) 返回true。
使用 compareTo() 方法虑鼎,它是由 Comparable 接口定義的,Date 類實現(xiàn)了這個接口昨忆。
使用 SimpleDateFormat 格式化日期
SimpleDateFormat 是一個以語言環(huán)境敏感的方式來格式化和分析日期的類。SimpleDateFormat 允許你選擇任何用戶自定義日期時間格式來運行胁勺。
SimpleDateFormat ft = new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
這一行代碼確立了轉(zhuǎn)換的格式寥裂,其中 yyyy 是完整的公元年褐啡,MM 是月份低飒,dd 是日期莉恼,HH:mm:ss 是時尿背、分、秒茴晋。
注意:有的格式大寫啡直,有的格式小寫撮执,例如 MM 是月份颜凯,mm 是分蕾额;HH 是 24 小時制募壕,而 hh 是 12 小時制筐眷。
日期和時間的格式化編碼
時間模式字符串用來指定時間格式资溃。在此模式中宝恶,所有的 ASCII 字母被保留為模式字母,定義如下:
字母描述示例
G紀元標記AD
y四位年份2001
M月份July or 07
d一個月的日期10
h A.M./P.M. (1~12)格式小時12
H一天中的小時 (0~23)22
m分鐘數(shù)30
s秒數(shù)55
S毫秒數(shù)234
E星期幾Tuesday
D一年中的日子360
F一個月中第幾周的周幾2 (second Wed. in July)
w一年中第幾周40
W一個月中第幾周1
aA.M./P.M. 標記PM
k一天中的小時(1~24)24
K A.M./P.M. (0~11)格式小時10
z時區(qū)Eastern Standard Time
'文字定界符Delimiter
"單引號`
使用printf格式化日期
printf 方法可以很輕松地格式化時間和日期。使用兩個字母格式,它以 %t開頭并且以下面表格中的一個字母結(jié)尾。
轉(zhuǎn)? 換? 符說? ? 明示? ? 例
c包括全部日期和時間信息星期六 十月 27 14:21:20 CST 2007
F"年-月-日"格式2007-10-27
D"月/日/年"格式10/27/07
r"HH:MM:SS PM"格式(12時制)02:25:51 下午
T"HH:MM:SS"格式(24時制)14:28:16
R"HH:MM"格式(24時制)14:28
解析字符串為時間
SimpleDateFormat 類有一些附加的方法,特別是parse()厂抽,它試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串。
Java 休眠(sleep)
sleep()使當前線程進入停滯狀態(tài)(阻塞當前線程),讓出CPU的使用、目的是不讓當前線程獨自霸占該進程所獲的CPU資源,以留一定時間給其他線程執(zhí)行的機會。
Calendar類
我們現(xiàn)在已經(jīng)能夠格式化并創(chuàng)建一個日期對象了,但是我們?nèi)绾尾拍茉O(shè)置和獲取日期數(shù)據(jù)的特定部分呢翼雀,比如說小時肋殴,日官地,或者分鐘? 我們又如何在日期的這些部分加上或者減去值呢? 答案是使用Calendar 類氯析。
Calendar類的功能要比Date類強大很多,而且在實現(xiàn)方式上也比Date類要復雜一些。
Calendar類是一個抽象類,在實際使用時實現(xiàn)特定的子類的對象,創(chuàng)建對象的過程對程序員來說是透明的,只需要使用getInstance方法創(chuàng)建即可。
創(chuàng)建一個代表系統(tǒng)當前日期的Calendar對象
Calendar c = Calendar.getInstance();//默認是當前日期
創(chuàng)建一個指定日期的Calendar對象
使用Calendar類代表特定的時間惶看,需要首先創(chuàng)建一個Calendar的對象劫窒,然后再設(shè)定該對象中的年月日參數(shù)來完成。
Calendar類對象字段類型
Calendar類中用一下這些常量表示不同的意義,jdk內(nèi)的很多類其實都是采用的這種思想
常量描述
Calendar.YEAR年份
Calendar.MONTH月份
Calendar.DATE日期
Calendar.DAY_OF_MONTH日期,和上面的字段意義完全相同
Calendar.HOUR12小時制的小時
Calendar.HOUR_OF_DAY24小時制的小時
Calendar.MINUTE分鐘
Calendar.SECOND秒
Calendar.DAY_OF_WEEK星期幾
GregorianCalendar類
Calendar類實現(xiàn)了公歷日歷,GregorianCalendar是Calendar類的一個具體實現(xiàn)。
Calendar 的getInstance()方法返回一個默認用當前的語言環(huán)境和時區(qū)初始化的GregorianCalendar對象铆遭。GregorianCalendar定義了兩個字段:AD和BC橄妆。這是代表公歷定義的兩個時代矢劲。
下面列出GregorianCalendar對象的幾個構(gòu)造方法:
序號構(gòu)造函數(shù)和說明
1GregorianCalendar()
在具有默認語言環(huán)境的默認時區(qū)內(nèi)使用當前時間構(gòu)造一個默認的 GregorianCalendar丸逸。
2GregorianCalendar(int year, int month, int date)
在具有默認語言環(huán)境的默認時區(qū)內(nèi)構(gòu)造一個帶有給定日期設(shè)置的 GregorianCalendar
3GregorianCalendar(int year, int month, int date, int hour, int minute)
為具有默認語言環(huán)境的默認時區(qū)構(gòu)造一個具有給定日期和時間設(shè)置的 GregorianCalendar。
4GregorianCalendar(int year, int month, int date, int hour, int minute, int second)
為具有默認語言環(huán)境的默認時區(qū)構(gòu)造一個具有給定日期和時間設(shè)置的 GregorianCalendar。
5GregorianCalendar(Locale aLocale)
在具有給定語言環(huán)境的默認時區(qū)內(nèi)構(gòu)造一個基于當前時間的 GregorianCalendar。
6GregorianCalendar(TimeZone zone)
在具有默認語言環(huán)境的給定時區(qū)內(nèi)構(gòu)造一個基于當前時間的 GregorianCalendar。
7GregorianCalendar(TimeZone zone, Locale aLocale)
在具有給定語言環(huán)境的給定時區(qū)內(nèi)構(gòu)造一個基于當前時間的 GregorianCalendar咏窿。
這里是GregorianCalendar 類提供的一些有用的方法列表:
序號方法和說明
1void add(int field, int amount)
根據(jù)日歷規(guī)則,將指定的(有符號的)時間量添加到給定的日歷字段中。
2protected void computeFields()
轉(zhuǎn)換UTC毫秒值為時間域值
3protected void computeTime()
覆蓋Calendar ,轉(zhuǎn)換時間域值為UTC毫秒值
4boolean equals(Object obj)
比較此 GregorianCalendar 與指定的 Object。
5int get(int field)
獲取指定字段的時間值
6int getActualMaximum(int field)
返回當前日期灰瞻,給定字段的最大值
7int getActualMinimum(int field)
返回當前日期肆氓,給定字段的最小值
8int getGreatestMinimum(int field)
返回此 GregorianCalendar 實例給定日歷字段的最高的最小值捐凭。
9Date getGregorianChange()
獲得格里高利歷的更改日期。
10int getLeastMaximum(int field)
返回此 GregorianCalendar 實例給定日歷字段的最低的最大值
11int getMaximum(int field)
返回此 GregorianCalendar 實例的給定日歷字段的最大值托猩。
12Date getTime()
獲取日歷當前時間。
13long getTimeInMillis()
獲取用長整型表示的日歷的當前時間
14TimeZone getTimeZone()
獲取時區(qū)。
15int getMinimum(int field)
返回給定字段的最小值晃琳。
16int hashCode()
重寫hashCode.
17boolean isLeapYear(int year)
確定給定的年份是否為閏年围段。
18void roll(int field, boolean up)
在給定的時間字段上添加或減去(上/下)單個時間單元灸芳,不更改更大的字段谒获。
19void set(int field, int value)
用給定的值設(shè)置時間字段展东。
20void set(int year, int month, int date)
設(shè)置年、月、日的值荷辕。
21void set(int year, int month, int date, int hour, int minute)
設(shè)置年、月惫谤、日溜歪、小時若专、分鐘的值。
22void set(int year, int month, int date, int hour, int minute, int second)
設(shè)置年蝴猪、月膊爪、日、小時嚎莉、分鐘米酬、秒的值。
23void setGregorianChange(Date date)
設(shè)置 GregorianCalendar 的更改日期趋箩。
24void setTime(Date date)
用給定的日期設(shè)置Calendar的當前時間淮逻。
25void setTimeInMillis(long millis)
用給定的long型毫秒數(shù)設(shè)置Calendar的當前時間。
26void setTimeZone(TimeZone value)
用給定時區(qū)值設(shè)置當前時區(qū)阁簸。
27String toString()
返回代表日歷的字符串爬早。
關(guān)于 Calender 類的完整列表,你可以參考標準的?Java文檔启妹。
十八筛严、Java 正則表達式
正則表達式定義了字符串的模式。
正則表達式可以用來搜索饶米、編輯或處理文本桨啃。
正則表達式并不僅限于某一種語言,但是在每種語言中有細微的差別檬输。
正則表達式實例
一個字符串其實就是一個簡單的正則表達式照瘾,例如?Hello World?正則表達式匹配 "Hello World" 字符串。
.(點號)也是一個正則表達式丧慈,它匹配任何一個字符如:"a" 或 "1"析命。
下表列出了一些正則表達式的實例及描述:
正則表達式描述
this is text匹配字符串 "this is text"
this\s+is\s+text注意字符串中的?\s+。
匹配單詞 "this" 后面的?\s+?可以匹配多個空格逃默,之后匹配 is 字符串鹃愤,再之后?\s+?匹配多個空格然后再跟上 text 字符串。
可以匹配這個實例:this is text
^\d+(\.\d+)?^ 定義了以什么開始
\d+ 匹配一個或多個數(shù)字
? 設(shè)置括號內(nèi)的選項是可選的
\. 匹配 "."
可以匹配的實例:"5", "1.5" 和 "2.21"完域。
Java 正則表達式和 Perl 的是最為相似的软吐。
java.util.regex 包主要包括以下三個類:
Pattern 類:
pattern 對象是一個正則表達式的編譯表示。Pattern 類沒有公共構(gòu)造方法吟税。要創(chuàng)建一個 Pattern 對象凹耙,你必須首先調(diào)用其公共靜態(tài)編譯方法,它返回一個 Pattern 對象肠仪。該方法接受一個正則表達式作為它的第一個參數(shù)肖抱。
Matcher 類:
Matcher 對象是對輸入字符串進行解釋和匹配操作的引擎。與Pattern 類一樣藤韵,Matcher 也沒有公共構(gòu)造方法虐沥。你需要調(diào)用 Pattern 對象的 matcher 方法來獲得一個 Matcher 對象熊经。
PatternSyntaxException:
PatternSyntaxException 是一個非強制異常類泽艘,它表示一個正則表達式模式中的語法錯誤欲险。
捕獲組
捕獲組是把多個字符當一個單獨單元進行處理的方法,它通過對括號內(nèi)的字符分組來創(chuàng)建匹涮。
例如天试,正則表達式 (dog) 創(chuàng)建了單一分組,組里包含"d"然低,"o"喜每,和"g"。
捕獲組是通過從左至右計算其開括號來編號雳攘。例如带兜,在表達式((A)(B(C))),有四個這樣的組:
((A)(B(C)))
(A)
(B(C))
(C)
可以通過調(diào)用 matcher 對象的 groupCount 方法來查看表達式有多少個分組吨灭。groupCount 方法返回一個 int 值刚照,表示matcher對象當前有多個捕獲組。
還有一個特殊的組(group(0))喧兄,它總是代表整個表達式无畔。該組不包括在 groupCount 的返回值中。
正則表達式語法
字符說明
\將下一字符標記為特殊字符吠冤、文本浑彰、反向引用或八進制轉(zhuǎn)義符。例如拯辙,"n"匹配字符"n"郭变。"\n"匹配換行符。序列"\\"匹配"\"涯保,"\("匹配"("饵较。
^匹配輸入字符串開始的位置。如果設(shè)置了?RegExp?對象的?Multiline?屬性遭赂,^ 還會與"\n"或"\r"之后的位置匹配循诉。
$匹配輸入字符串結(jié)尾的位置。如果設(shè)置了?RegExp?對象的?Multiline?屬性撇他,$ 還會與"\n"或"\r"之前的位置匹配茄猫。
*零次或多次匹配前面的字符或子表達式。例如困肩,zo* 匹配"z"和"zoo"划纽。* 等效于 {0,}。
+一次或多次匹配前面的字符或子表達式锌畸。例如勇劣,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效于 {1,}比默。
?零次或一次匹配前面的字符或子表達式幻捏。例如,"do(es)?"匹配"do"或"does"中的"do"命咐。? 等效于 {0,1}篡九。
{n}n?是非負整數(shù)。正好匹配?n?次醋奠。例如榛臼,"o{2}"與"Bob"中的"o"不匹配粒督,但與"food"中的兩個"o"匹配没讲。
{n,}n?是非負整數(shù)。至少匹配?n?次驶乾。例如塞祈,"o{2,}"不匹配"Bob"中的"o"路呜,而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"织咧。"o{0,}"等效于"o*"胀葱。
{n,m}M?和?n?是非負整數(shù),其中?n?<=?m笙蒙。匹配至少?n?次抵屿,至多?m?次。例如捅位,"o{1,3}"匹配"fooooood"中的頭三個 o轧葛。'o{0,1}' 等效于 'o?'。注意:您不能將空格插入逗號和數(shù)字之間艇搀。
?當此字符緊隨任何其他限定符(*尿扯、+、?焰雕、{n}衷笋、{n,}、{n,m})之后時矩屁,匹配模式是"非貪心的"辟宗。"非貪心的"模式匹配搜索到的、盡可能短的字符串吝秕,而默認的"貪心的"模式匹配搜索到的泊脐、盡可能長的字符串。例如烁峭,在字符串"oooo"中容客,"o+?"只匹配單個"o"秕铛,而"o+"匹配所有"o"。
.匹配除"\r\n"之外的任何單個字符缩挑。若要匹配包括"\r\n"在內(nèi)的任意字符但两,請使用諸如"[\s\S]"之類的模式。
(pattern)匹配?pattern?并捕獲該匹配的子表達式调煎【登玻可以使用?$0…$9?屬性從結(jié)果"匹配"集合中檢索捕獲的匹配己肮。若要匹配括號字符 ( )士袄,請使用"\("或者"\)"。
(?:pattern)匹配?pattern?但不捕獲該匹配的子表達式谎僻,即它是一個非捕獲匹配娄柳,不存儲供以后使用的匹配。這對于用"or"字符 (|) 組合模式部件的情況很有用艘绍。例如赤拒,'industr(?:y|ies) 是比 'industry|industries' 更經(jīng)濟的表達式。
(?=pattern)執(zhí)行正向預測先行搜索的子表達式诱鞠,該表達式匹配處于匹配?pattern?的字符串的起始點的字符串挎挖。它是一個非捕獲匹配,即不能捕獲供以后使用的匹配航夺。例如蕉朵,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"阳掐。預測先行不占用字符始衅,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后缭保,而不是在組成預測先行的字符后汛闸。
(?!pattern)執(zhí)行反向預測先行搜索的子表達式,該表達式匹配不處于匹配?pattern?的字符串的起始點的搜索字符串艺骂。它是一個非捕獲匹配诸老,即不能捕獲供以后使用的匹配。例如钳恕,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows"孕锄,但不匹配"Windows 2000"中的"Windows"。預測先行不占用字符苞尝,即發(fā)生匹配后畸肆,下一匹配的搜索緊隨上一匹配之后,而不是在組成預測先行的字符后宙址。
x|y匹配?x?或?y轴脐。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"大咱。
[xyz]字符集恬涧。匹配包含的任一字符。例如碴巾,"[abc]"匹配"plain"中的"a"溯捆。
[^xyz]反向字符集。匹配未包含的任何字符厦瓢。例如提揍,"[^abc]"匹配"plain"中"p","l"煮仇,"i"劳跃,"n"。
[a-z]字符范圍浙垫。匹配指定范圍內(nèi)的任何字符刨仑。例如,"[a-z]"匹配"a"到"z"范圍內(nèi)的任何小寫字母夹姥。
[^a-z]反向范圍字符杉武。匹配不在指定的范圍內(nèi)的任何字符。例如辙售,"[^a-z]"匹配任何不在"a"到"z"范圍內(nèi)的任何字符轻抱。
\b匹配一個字邊界,即字與空格間的位置圾亏。例如十拣,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"志鹃。
\B非字邊界匹配夭问。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"曹铃。
\cx匹配?x?指示的控制字符缰趋。例如,\cM 匹配 Control-M 或回車符陕见。x?的值必須在 A-Z 或 a-z 之間秘血。如果不是這樣,則假定 c 就是"c"字符本身评甜。
\d數(shù)字字符匹配灰粮。等效于 [0-9]。
\D非數(shù)字字符匹配忍坷。等效于 [^0-9]粘舟。
\f換頁符匹配熔脂。等效于 \x0c 和 \cL。
\n換行符匹配柑肴。等效于 \x0a 和 \cJ霞揉。
\r匹配一個回車符。等效于 \x0d 和 \cM晰骑。
\s匹配任何空白字符适秩,包括空格、制表符硕舆、換頁符等秽荞。與 [ \f\n\r\t\v] 等效。
\S匹配任何非空白字符岗宣。與 [^ \f\n\r\t\v] 等效蚂会。
\t制表符匹配淋样。與 \x09 和 \cI 等效耗式。
\v垂直制表符匹配。與 \x0b 和 \cK 等效趁猴。
\w匹配任何字類字符刊咳,包括下劃線。與"[A-Za-z0-9_]"等效儡司。
\W與任何非單詞字符匹配娱挨。與"[^A-Za-z0-9_]"等效。
\xn匹配?n捕犬,此處的?n?是一個十六進制轉(zhuǎn)義碼跷坝。十六進制轉(zhuǎn)義碼必須正好是兩位數(shù)長。例如碉碉,"\x41"匹配"A"柴钻。"\x041"與"\x04"&"1"等效。允許在正則表達式中使用 ASCII 代碼垢粮。
\num匹配?num贴届,此處的?num?是一個正整數(shù)。到捕獲匹配的反向引用蜡吧。例如毫蚓,"(.)\1"匹配兩個連續(xù)的相同字符。
\n標識一個八進制轉(zhuǎn)義碼或反向引用昔善。如果 \n?前面至少有?n?個捕獲子表達式元潘,那么?n?是反向引用。否則君仆,如果?n?是八進制數(shù) (0-7)翩概,那么?n?是八進制轉(zhuǎn)義碼啸澡。
\nm標識一個八進制轉(zhuǎn)義碼或反向引用。如果 \nm?前面至少有?nm?個捕獲子表達式氮帐,那么?nm?是反向引用嗅虏。如果 \nm?前面至少有?n?個捕獲,則?n?是反向引用上沐,后面跟有字符?m皮服。如果兩種前面的情況都不存在,則 \nm?匹配八進制值?nm参咙,其中?n?和?m?是八進制數(shù)字 (0-7)龄广。
\nml當?n?是八進制數(shù) (0-3),m?和?l?是八進制數(shù) (0-7) 時蕴侧,匹配八進制轉(zhuǎn)義碼?nml择同。
\un匹配?n,其中?n?是以四位十六進制數(shù)表示的 Unicode 字符净宵。例如敲才,\u00A9 匹配版權(quán)符號 (?)。
根據(jù) Java Language Specification 的要求择葡,Java 源代碼的字符串中的反斜線被解釋為 Unicode 轉(zhuǎn)義或其他字符轉(zhuǎn)義紧武。因此必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護敏储,不被 Java 字節(jié)碼編譯器解釋阻星。例如,當解釋為正則表達式時已添,字符串字面值 "\b" 與單個退格字符匹配妥箕,而 "\\b" 與單詞邊界匹配。字符串字面值 "\(hello\)" 是非法的更舞,將導致編譯時錯誤畦幢;要與字符串 (hello) 匹配,必須使用字符串字面值 "\\(hello\\)"疏哗。
Matcher 類的方法
索引方法
索引方法提供了有用的索引值呛讲,精確表明輸入字符串中在哪能找到匹配:
序號方法及說明
1public int start()
返回以前匹配的初始索引。
2public int start(int group)
返回在以前的匹配操作期間返奉,由給定組所捕獲的子序列的初始索引
3public int end()
返回最后匹配字符之后的偏移量贝搁。
4public int end(int group)
返回在以前的匹配操作期間,由給定組所捕獲子序列的最后字符之后的偏移量芽偏。
研究方法
研究方法用來檢查輸入字符串并返回一個布爾值雷逆,表示是否找到該模式:
序號方法及說明
1public boolean lookingAt()
嘗試將從區(qū)域開頭開始的輸入序列與該模式匹配。
2public boolean find()
嘗試查找與該模式匹配的輸入序列的下一個子序列污尉。
3public boolean find(int start)
重置此匹配器膀哲,然后嘗試查找匹配該模式往产、從指定索引開始的輸入序列的下一個子序列。
4public boolean matches()
嘗試將整個區(qū)域與模式匹配某宪。
替換方法
替換方法是替換輸入字符串里文本的方法:
序號方法及說明
1public Matcher appendReplacement(StringBuffer sb, String replacement)
實現(xiàn)非終端添加和替換步驟仿村。
2public StringBuffer appendTail(StringBuffer sb)
實現(xiàn)終端添加和替換步驟。
3public String replaceAll(String replacement)
替換模式與給定替換字符串相匹配的輸入序列的每個子序列兴喂。
4public String replaceFirst(String replacement)
替換模式與給定替換字符串匹配的輸入序列的第一個子序列蔼囊。
5public static String quoteReplacement(String s)
返回指定字符串的字面替換字符串。這個方法返回一個字符串衣迷,就像傳遞給Matcher類的appendReplacement 方法一個字面字符串一樣工作畏鼓。
matches 和 lookingAt 方法
matches 和 lookingAt 方法都用來嘗試匹配一個輸入序列模式。它們的不同是 matcher 要求整個序列都匹配壶谒,而lookingAt 不要求云矫。
lookingAt 方法雖然不需要整句都匹配,但是需要從第一個字符開始匹配汗菜。
replaceFirst 和 replaceAll 方法
replaceFirst 和 replaceAll 方法用來替換匹配正則表達式的文本让禀。不同的是,replaceFirst 替換首次匹配呵俏,replaceAll 替換所有匹配堆缘。
appendReplacement 和 appendTail 方法
Matcher 類也提供了appendReplacement 和 appendTail 方法用于文本替換:
PatternSyntaxException 類的方法
PatternSyntaxException 是一個非強制異常類滔灶,它指示一個正則表達式模式中的語法錯誤普碎。
PatternSyntaxException 類提供了下面的方法來幫助我們查看發(fā)生了什么錯誤。
序號方法及說明
1public String getDescription()
獲取錯誤的描述录平。
2public int getIndex()
獲取錯誤的索引麻车。
3public String getPattern()
獲取錯誤的正則表達式模式。
4public String getMessage()
返回多行字符串斗这,包含語法錯誤及其索引的描述动猬、錯誤的正則表達式模式和模式中錯誤索引的可視化指示。
十九表箭、Java 方法
在前面幾個章節(jié)中我們經(jīng)常使用到?System.out.println()赁咙,那么它是什么呢?
println() 是一個方法免钻。
System 是系統(tǒng)類彼水。
out 是標準輸出對象。
這句話的用法是調(diào)用系統(tǒng)類 System 中的標準輸出對象 out 中的方法 println()极舔。
那么什么是方法呢凤覆?
Java方法是語句的集合,它們在一起執(zhí)行一個功能拆魏。
方法是解決一類問題的步驟的有序組合
方法包含于類或?qū)ο笾?/p>
方法在程序中被創(chuàng)建盯桦,在其他地方被引用
方法的優(yōu)點
1. 使程序變得更簡短而清晰慈俯。
2. 有利于程序維護。
3. 可以提高程序開發(fā)的效率拥峦。
4. 提高了代碼的重用性贴膘。
方法的命名規(guī)則
1. 必須以字母、'_'或'$'開頭略号。
2. 可以包括數(shù)字步鉴,但不能以它開頭。
方法的定義
一般情況下璃哟,定義一個方法包含以下語法:
修飾符 返回值類型 方法名(參數(shù)類型 參數(shù)名){ ... 方法體 ... return 返回值; }
方法包含一個方法頭和一個方法體氛琢。下面是一個方法的所有部分:
修飾符:修飾符,這是可選的随闪,告訴編譯器如何調(diào)用該方法阳似。定義了該方法的訪問類型。
返回值類型 :方法可能會返回值铐伴。returnValueType 是方法返回值的數(shù)據(jù)類型撮奏。有些方法執(zhí)行所需的操作,但沒有返回值当宴。在這種情況下畜吊,returnValueType 是關(guān)鍵字void。
方法名:是方法的實際名稱户矢。方法名和參數(shù)表共同構(gòu)成方法簽名玲献。
參數(shù)類型:參數(shù)像是一個占位符。當方法被調(diào)用時梯浪,傳遞值給參數(shù)捌年。這個值被稱為實參或變量。參數(shù)列表是指方法的參數(shù)類型挂洛、順序和參數(shù)的個數(shù)礼预。參數(shù)是可選的,方法可以不包含任何參數(shù)虏劲。
方法體:方法體包含具體的語句托酸,定義該方法的功能。
參數(shù)可以有多個:
static float interest(float principal, int year){...}
注意:?在一些其它語言中方法指過程和函數(shù)柒巫。一個返回非void類型返回值的方法稱為函數(shù)励堡;一個返回void類型返回值的方法叫做過程。
方法調(diào)用
Java 支持兩種調(diào)用方法的方式吻育,根據(jù)方法是否返回值來選擇念秧。
當程序調(diào)用一個方法時,程序的控制權(quán)交給了被調(diào)用的方法布疼。當被調(diào)用方法的返回語句執(zhí)行或者到達方法體閉括號時候交還控制權(quán)給程序摊趾。
當方法返回一個值的時候币狠,方法調(diào)用通常被當做一個值。例如:
int larger = max(30, 40);
如果方法返回值是void砾层,方法調(diào)用一定是一條語句蒸辆。例如瑰抵,方法println返回void刀脏。下面的調(diào)用是個語句:
System.out.println("歡迎訪問菜鳥教程蚪腐!");
void 關(guān)鍵字
本節(jié)說明如何聲明和調(diào)用一個 void 方法。
下面的例子聲明了一個名為 printGrade 的方法侨糟,并且調(diào)用它來打印給定的分數(shù)碍扔。
通過值傳遞參數(shù)
調(diào)用一個方法時候需要提供參數(shù),你必須按照參數(shù)列表指定的順序提供秕重。
方法的重載
上面使用的max方法僅僅適用于int型數(shù)據(jù)不同。但如果你想得到兩個浮點類型數(shù)據(jù)的最大值呢?
解決方法是創(chuàng)建另一個有相同名字但參數(shù)不同的方法溶耘,如下面代碼所示:
public static double max(double num1, double num2) { if (num1 > num2) return num1; else return num2; }
如果你調(diào)用max方法時傳遞的是int型參數(shù)二拐,則 int型參數(shù)的max方法就會被調(diào)用;
如果傳遞的是double型參數(shù)凳兵,則double類型的max方法體會被調(diào)用百新,這叫做方法重載;
就是說一個類的兩個方法擁有相同的名字庐扫,但是有不同的參數(shù)列表饭望。
Java編譯器根據(jù)方法簽名判斷哪個方法應該被調(diào)用。
方法重載可以讓程序更清晰易讀聚蝶。執(zhí)行密切相關(guān)任務(wù)的方法應該使用相同的名字杰妓。
重載的方法必須擁有不同的參數(shù)列表。你不能僅僅依據(jù)修飾符或者返回類型的不同來重載方法碘勉。
變量作用域
變量的范圍是程序中該變量可以被引用的部分。
方法內(nèi)定義的變量被稱為局部變量桩卵。
局部變量的作用范圍從聲明開始验靡,直到包含它的塊結(jié)束。
局部變量必須聲明才可以使用雏节。
方法的參數(shù)范圍涵蓋整個方法胜嗓。參數(shù)實際上是一個局部變量。
for循環(huán)的初始化部分聲明的變量钩乍,其作用范圍在整個循環(huán)辞州。
但循環(huán)體內(nèi)聲明的變量其適用范圍是從它聲明到循環(huán)體結(jié)束。它包含如下所示的變量聲明:
你可以在一個方法里寥粹,不同的非嵌套塊中多次聲明一個具有相同的名稱局部變量变过,但你不能在嵌套塊內(nèi)兩次聲明局部變量埃元。
命令行參數(shù)的使用
有時候你希望運行一個程序時候再傳遞給它消息。這要靠傳遞命令行參數(shù)給main()函數(shù)實現(xiàn)媚狰。
命令行參數(shù)是在執(zhí)行程序時候緊跟在程序名字后面的信息岛杀。
構(gòu)造方法
當一個對象被創(chuàng)建時候,構(gòu)造方法用來初始化該對象崭孤。構(gòu)造方法和它所在類的名字相同类嗤,但構(gòu)造方法沒有返回值。
通常會使用構(gòu)造方法給一個類的實例變量賦初值辨宠,或者執(zhí)行其它必要的步驟來創(chuàng)建一個完整的對象遗锣。
不管你與否自定義構(gòu)造方法,所有的類都有構(gòu)造方法嗤形,因為Java自動提供了一個默認構(gòu)造方法黄伊,它把所有成員初始化為0。
一旦你定義了自己的構(gòu)造方法派殷,默認構(gòu)造方法就會失效还最。
可變參數(shù)
JDK 1.5 開始,Java支持傳遞同類型的可變參數(shù)給一個方法毡惜。
方法的可變參數(shù)的聲明如下所示:
typeName... parameterName
在方法聲明中拓轻,在指定參數(shù)類型后加一個省略號(...) 。
一個方法中只能指定一個可變參數(shù)经伙,它必須是方法的最后一個參數(shù)扶叉。任何普通的參數(shù)必須在它之前聲明。
finalize() 方法
Java 允許定義這樣的方法帕膜,它在對象被垃圾收集器析構(gòu)(回收)之前調(diào)用枣氧,這個方法叫做 finalize( ),它用來清除回收對象垮刹。
例如达吞,你可以使用 finalize() 來確保一個對象打開的文件被關(guān)閉了。
在 finalize() 方法里荒典,你必須指定在對象銷毀時候要執(zhí)行的操作酪劫。
finalize() 一般格式是:
protected void finalize() { // 在這里終結(jié)代碼? }
關(guān)鍵字 protected 是一個限定符,它確保 finalize() 方法不會被該類以外的代碼調(diào)用寺董。
當然覆糟,Java 的內(nèi)存回收可以由 JVM 來自動完成。如果你手動使用遮咖,則可以使用上面的方法滩字。
二十、Java 流(Stream)、文件(File)和IO
Java.io?包幾乎包含了所有操作輸入麦箍、輸出需要的類漓藕。所有這些流類代表了輸入源和輸出目標。
Java.io?包中的流支持很多種格式内列,比如:基本類型撵术、對象、本地化字符集等等话瞧。
一個流可以理解為一個數(shù)據(jù)的序列嫩与。輸入流表示從一個源讀取數(shù)據(jù),輸出流表示向一個目標寫數(shù)據(jù)交排。
Java 為 I/O 提供了強大的而靈活的支持划滋,使其更廣泛地應用到文件傳輸和網(wǎng)絡(luò)編程中。
讀取控制臺輸入
Java 的控制臺輸入由 System.in 完成埃篓。
為了獲得一個綁定到控制臺的字符流处坪,你可以把 System.in 包裝在一個 BufferedReader 對象中來創(chuàng)建一個字符流。
下面是創(chuàng)建 BufferedReader 的基本語法:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader 對象創(chuàng)建后架专,我們便可以使用 read() 方法從控制臺讀取一個字符同窘,或者用 readLine() 方法讀取一個字符串。
從控制臺讀取多字符輸入
從 BufferedReader 對象讀取一個字符要使用 read() 方法部脚,它的語法如下:
int read( ) throws IOException
每次調(diào)用 read() 方法想邦,它從輸入流讀取一個字符并把該字符作為整數(shù)值返回。 當流結(jié)束的時候返回 -1委刘。該方法拋出 IOException丧没。
從控制臺讀取字符串
從標準輸入讀取一個字符串需要使用 BufferedReader 的 readLine() 方法。
它的一般格式是:
String readLine( ) throws IOException
控制臺輸出
在此前已經(jīng)介紹過锡移,控制臺的輸出由 print( ) 和 println() 完成呕童。這些方法都由類 PrintStream 定義,System.out 是該類對象的一個引用淆珊。
PrintStream 繼承了 OutputStream類夺饲,并且實現(xiàn)了方法 write()。這樣套蒂,write() 也可以用來往控制臺寫操作钞支。
PrintStream 定義 write() 的最簡單格式如下所示:
void write(int byteval)
該方法將 byteval 的低八位字節(jié)寫到流中。
讀寫文件
如前所述操刀,一個流被定義為一個數(shù)據(jù)序列。輸入流用于從源讀取數(shù)據(jù)婴洼,輸出流用于向目標寫數(shù)據(jù)骨坑。
下圖是一個描述輸入流和輸出流的類層次圖。
下面將要討論的兩個重要的流是 FileInputStream 和 FileOutputStream:
FileInputStream
該流用于從文件讀取數(shù)據(jù),它的對象可以用關(guān)鍵字 new 來創(chuàng)建欢唾。
有多種構(gòu)造方法可用來創(chuàng)建對象且警。
可以使用字符串類型的文件名來創(chuàng)建一個輸入流對象來讀取文件:
InputStream f = new FileInputStream("C:/java/hello");
也可以使用一個文件對象來創(chuàng)建一個輸入流對象來讀取文件。我們首先得使用 File() 方法來創(chuàng)建一個文件對象:
File f = new File("C:/java/hello"); InputStream out = new FileInputStream(f);
創(chuàng)建了InputStream對象礁遣,就可以使用下面的方法來讀取流或者進行其他的流操作斑芜。
序號方法及描述
1public void close() throws IOException{}
關(guān)閉此文件輸入流并釋放與此流有關(guān)的所有系統(tǒng)資源。拋出IOException異常祟霍。
2protected void finalize()throws IOException {}
這個方法清除與該文件的連接杏头。確保在不再引用文件輸入流時調(diào)用其 close 方法。拋出IOException異常沸呐。
3public int read(int r)throws IOException{}
這個方法從 InputStream 對象讀取指定字節(jié)的數(shù)據(jù)醇王。返回為整數(shù)值。返回下一字節(jié)數(shù)據(jù)崭添,如果已經(jīng)到結(jié)尾則返回-1寓娩。
4public int read(byte[] r) throws IOException{}
這個方法從輸入流讀取r.length長度的字節(jié)。返回讀取的字節(jié)數(shù)呼渣。如果是文件結(jié)尾則返回-1棘伴。
5public int available() throws IOException{}
返回下一次對此輸入流調(diào)用的方法可以不受阻塞地從此輸入流讀取的字節(jié)數(shù)。返回一個整數(shù)值屁置。
除了 InputStream 外焊夸,還有一些其他的輸入流,
ByteArrayInputStream
DataInputStream
FileOutputStream
該類用來創(chuàng)建一個文件并向文件中寫數(shù)據(jù)缰犁。
如果該流在打開文件進行輸出前淳地,目標文件不存在,那么該流會創(chuàng)建該文件帅容。
有兩個構(gòu)造方法可以用來創(chuàng)建 FileOutputStream 對象颇象。
使用字符串類型的文件名來創(chuàng)建一個輸出流對象:
OutputStream f = new FileOutputStream("C:/java/hello")
也可以使用一個文件對象來創(chuàng)建一個輸出流來寫文件。我們首先得使用File()方法來創(chuàng)建一個文件對象:
File f = new File("C:/java/hello"); OutputStream f = new FileOutputStream(f);
創(chuàng)建OutputStream 對象完成后并徘,就可以使用下面的方法來寫入流或者進行其他的流操作遣钳。
序號方法及描述
1public void close() throws IOException{}
關(guān)閉此文件輸入流并釋放與此流有關(guān)的所有系統(tǒng)資源。拋出IOException異常麦乞。
2protected void finalize()throws IOException {}
這個方法清除與該文件的連接蕴茴。確保在不再引用文件輸入流時調(diào)用其 close 方法。拋出IOException異常姐直。
3public void write(int w)throws IOException{}
這個方法把指定的字節(jié)寫到輸出流中倦淀。
4public void write(byte[] w)
把指定數(shù)組中w.length長度的字節(jié)寫到OutputStream中。
除了OutputStream外声畏,還有一些其他的輸出流:
ByteArrayOutputStream
DataOutputStream
文件和I/O
還有一些關(guān)于文件和I/O的類撞叽,我們也需要知道:
File Class(類)
FileReader Class(類)
FileWriter Class(類)
Java中的目錄
創(chuàng)建目錄:
File類中有兩個方法可以用來創(chuàng)建文件夾:
mkdir( )方法創(chuàng)建一個文件夾姻成,成功則返回true,失敗則返回false愿棋。失敗表明File對象指定的路徑已經(jīng)存在科展,或者由于整個路徑還不存在,該文件夾不能被創(chuàng)建糠雨。
mkdirs()方法創(chuàng)建一個文件夾和它的所有父文件夾才睹。
注意:?Java 在 UNIX 和 Windows 自動按約定分辨文件路徑分隔符。如果你在 Windows 版本的 Java 中使用分隔符 (/) 甘邀,路徑依然能夠被正確解析琅攘。
讀取目錄
一個目錄其實就是一個 File 對象,它包含其他文件和文件夾鹃答。
如果創(chuàng)建一個 File 對象并且它是一個目錄乎澄,那么調(diào)用 isDirectory() 方法會返回 true。
可以通過調(diào)用該對象上的 list() 方法测摔,來提取它包含的文件和文件夾的列表置济。
刪除目錄或文件
刪除文件可以使用?java.io.File.delete()?方法。
以下代碼會刪除目錄/tmp/java/锋八,即便目錄不為空浙于。
二十一、Java Scanner 類
java.util.Scanner 是 Java5 的新特征挟纱,我們可以通過 Scanner 類來獲取用戶的輸入羞酗。
下面是創(chuàng)建 Scanner 對象的基本語法:
Scanner s = new Scanner(System.in);
通過 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串,在讀取前我們一般需要 使用 hasNext 與 hasNextLine 判斷是否還有輸入的數(shù)據(jù):
next() 與 nextLine() 區(qū)別
next():
1紊服、一定要讀取到有效字符后才可以結(jié)束輸入檀轨。
2、對輸入有效字符之前遇到的空白欺嗤,next() 方法會自動將其去掉参萄。
3、只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結(jié)束符煎饼。
next() 不能得到帶有空格的字符串讹挎。
nextLine():
1、以Enter為結(jié)束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符吆玖。
2筒溃、可以獲得空白。
如果要輸入 int 或 float 類型的數(shù)據(jù)沾乘,在 Scanner 類中也有支持怜奖,但是在輸入之前最好先使用 hasNextXxx() 方法進行驗證,再使用 nextXxx() 來讀取翅阵。
二十二烦周、Java 異常處理
異常是程序中的一些錯誤尽爆,但并不是所有的錯誤都是異常怎顾,并且錯誤有時候是可以避免的读慎。
比如說,你的代碼少了一個分號槐雾,那么運行出來結(jié)果是提示是錯誤 java.lang.Error夭委;如果你用System.out.println(11/0),那么你是因為你用0做了除數(shù)募强,會拋出 java.lang.ArithmeticException 的異常株灸。
異常發(fā)生的原因有很多,通常包含以下幾大類:
用戶輸入了非法數(shù)據(jù)擎值。
要打開的文件不存在慌烧。
網(wǎng)絡(luò)通信時連接中斷,或者JVM內(nèi)存溢出鸠儿。
這些異常有的是因為用戶錯誤引起屹蚊,有的是程序錯誤引起的,還有其它一些是因為物理錯誤引起的进每。-
要理解Java異常處理是如何工作的汹粤,你需要掌握以下三種類型的異常:
檢查性異常:最具代表的檢查性異常是用戶錯誤或問題引起的異常,這是程序員無法預見的田晚。例如要打開一個不存在文件時嘱兼,一個異常就發(fā)生了,這些異常在編譯時不能被簡單地忽略贤徒。
運行時異常:?運行時異常是可能被程序員避免的異常芹壕。與檢查性異常相反,運行時異辰幽危可以在編譯時被忽略踢涌。
錯誤:?錯誤不是異常,而是脫離程序員控制的問題鲫趁。錯誤在代碼中通常被忽略斯嚎。例如,當棧溢出時挨厚,一個錯誤就發(fā)生了堡僻,它們在編譯也檢查不到的。
Exception 類的層次
所有的異常類是從 java.lang.Exception 類繼承的子類疫剃。
Exception 類是 Throwable 類的子類钉疫。除了Exception類外,Throwable還有一個子類Error 巢价。
Java 程序通常不捕獲錯誤牲阁。錯誤一般發(fā)生在嚴重故障時固阁,它們在Java程序處理的范疇之外。
Error 用來指示運行時環(huán)境發(fā)生的錯誤城菊。
例如备燃,JVM 內(nèi)存溢出。一般地凌唬,程序不會從錯誤中恢復并齐。
異常類有兩個主要的子類:IOException 類和 RuntimeException 類。
在 Java 內(nèi)置類中(接下來會說明)客税,有大部分常用檢查性和非檢查性異常况褪。
Java 內(nèi)置異常類
Java 語言定義了一些異常類在 java.lang 標準包中。
標準運行時異常類的子類是最常見的異常類更耻。由于 java.lang 包是默認加載到所有的 Java 程序的测垛,所以大部分從運行時異常類繼承而來的異常都可以直接使用。
Java 根據(jù)各個類庫也定義了一些其他的異常秧均,下面的表中列出了 Java 的非檢查性異常食侮。
異常描述
ArithmeticException當出現(xiàn)異常的運算條件時,拋出此異常熬北。例如疙描,一個整數(shù)"除以零"時,拋出此類的一個實例讶隐。
ArrayIndexOutOfBoundsException用非法索引訪問數(shù)組時拋出的異常起胰。如果索引為負或大于等于數(shù)組大小,則該索引為非法索引巫延。
ArrayStoreException試圖將錯誤類型的對象存儲到一個對象數(shù)組時拋出的異常效五。
ClassCastException當試圖將對象強制轉(zhuǎn)換為不是實例的子類時,拋出該異常炉峰。
IllegalArgumentException拋出的異常表明向方法傳遞了一個不合法或不正確的參數(shù)畏妖。
IllegalMonitorStateException拋出的異常表明某一線程已經(jīng)試圖等待對象的監(jiān)視器,或者試圖通知其他正在等待對象的監(jiān)視器而本身沒有指定監(jiān)視器的線程疼阔。
IllegalStateException在非法或不適當?shù)臅r間調(diào)用方法時產(chǎn)生的信號戒劫。換句話說,即 Java 環(huán)境或 Java 應用程序沒有處于請求操作所要求的適當狀態(tài)下婆廊。
IllegalThreadStateException線程沒有處于請求操作所要求的適當狀態(tài)時拋出的異常迅细。
IndexOutOfBoundsException指示某排序索引(例如對數(shù)組、字符串或向量的排序)超出范圍時拋出淘邻。
NegativeArraySizeException如果應用程序試圖創(chuàng)建大小為負的數(shù)組茵典,則拋出該異常。
NullPointerException當應用程序試圖在需要對象的地方使用 null 時宾舅,拋出該異常
NumberFormatException當應用程序試圖將字符串轉(zhuǎn)換成一種數(shù)值類型统阿,但該字符串不能轉(zhuǎn)換為適當格式時彩倚,拋出該異常。
SecurityException由安全管理器拋出的異常扶平,指示存在安全侵犯帆离。
StringIndexOutOfBoundsException此異常由 String 方法拋出,指示索引或者為負蜻直,或者超出字符串的大小盯质。
UnsupportedOperationException當不支持請求的操作時,拋出該異常概而。
下面的表中列出了 Java 定義在 java.lang 包中的檢查性異常類。
異常描述
ClassNotFoundException應用程序試圖加載類時囱修,找不到相應的類赎瑰,拋出該異常。
CloneNotSupportedException當調(diào)用 Object 類中的 clone 方法克隆對象破镰,但該對象的類無法實現(xiàn) Cloneable 接口時餐曼,拋出該異常。
IllegalAccessException拒絕訪問一個類的時候鲜漩,拋出該異常源譬。
InstantiationException當試圖使用 Class 類中的 newInstance 方法創(chuàng)建一個類的實例,而指定的類對象因為是一個接口或是一個抽象類而無法實例化時孕似,拋出該異常踩娘。
InterruptedException一個線程被另一個線程中斷,拋出該異常喉祭。
NoSuchFieldException請求的變量不存在
NoSuchMethodException請求的方法不存在
異常方法
下面的列表是 Throwable 類的主要方法:
序號方法及說明
1public String getMessage()
返回關(guān)于發(fā)生的異常的詳細信息殉簸。這個消息在Throwable 類的構(gòu)造函數(shù)中初始化了邢滑。
2public Throwable getCause()
返回一個Throwable 對象代表異常原因。
3public String toString()
使用getMessage()的結(jié)果返回類的串級名字。
4public void printStackTrace()
打印toString()結(jié)果和棧層次到System.err饲梭,即錯誤輸出流。
5public StackTraceElement [] getStackTrace()
返回一個包含堆棧層次的數(shù)組玉雾。下標為0的元素代表棧頂跨算,最后一個元素代表方法調(diào)用堆棧的棧底。
6public Throwable fillInStackTrace()
用當前的調(diào)用棧層次填充Throwable 對象棧層次鹉究,添加到棧層次任何先前信息中宇立。
捕獲異常
使用 try 和 catch 關(guān)鍵字可以捕獲異常。try/catch 代碼塊放在異撤蝗模可能發(fā)生的地方泄伪。
try/catch代碼塊中的代碼稱為保護代碼,使用 try/catch 的語法如下:
try { // 程序代碼 }catch(ExceptionName e1) { //Catch 塊 }
Catch 語句包含要捕獲異常類型的聲明匿级。當保護代碼塊中發(fā)生一個異常時蟋滴,try 后面的 catch 塊就會被檢查染厅。
如果發(fā)生的異常包含在 catch 塊中,異常會被傳遞到該 catch 塊津函,這和傳遞一個參數(shù)到方法是一樣肖粮。
多重捕獲塊
一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲。
多重捕獲塊的語法如下所示:
try{ // 程序代碼? }catch(異常類型1 異常的變量名1){ // 程序代碼? }catch(異常類型2 異常的變量名2){ // 程序代碼? }catch(異常類型2 異常的變量名2){ // 程序代碼? }
上面的代碼段包含了 3 個 catch塊尔苦。
可以在 try 語句后面添加任意數(shù)量的 catch 塊涩馆。
如果保護代碼中發(fā)生異常,異常被拋給第一個 catch 塊允坚。
如果拋出異常的數(shù)據(jù)類型與 ExceptionType1 匹配魂那,它在這里就會被捕獲。
如果不匹配稠项,它會被傳遞給第二個 catch 塊涯雅。
如此,直到異常被捕獲或者通過所有的 catch 塊展运。
throws/throw 關(guān)鍵字:
如果一個方法沒有捕獲一個檢查性異常活逆,那么該方法必須使用 throws 關(guān)鍵字來聲明。throws 關(guān)鍵字放在方法簽名的尾部拗胜。
也可以使用 throw 關(guān)鍵字拋出一個異常蔗候,無論它是新實例化的還是剛捕獲到的。
finally關(guān)鍵字
finally 關(guān)鍵字用來創(chuàng)建在 try 代碼塊后面執(zhí)行的代碼塊埂软。
無論是否發(fā)生異常锈遥,finally 代碼塊中的代碼總會被執(zhí)行。
在 finally 代碼塊中仰美,可以運行清理類型等收尾善后性質(zhì)的語句迷殿。
finally 代碼塊出現(xiàn)在 catch 代碼塊最后,語法如下:
try{ // 程序代碼? }catch(異常類型1 異常的變量名1){ // 程序代碼? }catch(異常類型2 異常的變量名2){ // 程序代碼? }finally{ // 程序代碼? }
注意下面事項:
catch 不能獨立于 try 存在咖杂。
在 try/catch 后面添加 finally 塊并非強制性要求的庆寺。
try 代碼后不能既沒 catch 塊也沒 finally 塊。
try, catch, finally 塊之間不能添加任何代碼诉字。
聲明自定義異常
在 Java 中你可以自定義異常懦尝。編寫自己的異常類時需要記住下面的幾點。
所有異常都必須是 Throwable 的子類壤圃。
如果希望寫一個檢查性異常類陵霉,則需要繼承 Exception 類。
如果你想寫一個運行時異常類伍绳,那么需要繼承 RuntimeException 類踊挠。
可以像下面這樣定義自己的異常類:
class MyException extends Exception{ }
只繼承Exception 類來創(chuàng)建的異常類是檢查性異常類。
下面的 InsufficientFundsException 類是用戶定義的異常類,它繼承自 Exception效床。
一個異常類和其它任何類一樣睹酌,包含有變量和方法。
通用異常
在Java中定義了兩種類型的異常和錯誤剩檀。
JVM(Java虛擬機)?異常:由 JVM 拋出的異潮镅兀或錯誤。例如:NullPointerException 類沪猴,ArrayIndexOutOfBoundsException 類辐啄,ClassCastException 類。
程序級異常:由程序或者API程序拋出的異常运嗜。例如 IllegalArgumentException 類壶辜,IllegalStateException 類。
二十三洗出、java面向?qū)ο?/p>
Java 繼承
繼承的概念
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石士复,因為它允許創(chuàng)建分等級層次的類。
繼承就是子類繼承父類的特征和行為翩活,使得子類對象(實例)具有父類的實例域和方法,或子類從父類繼承方法便贵,使得子類具有父類相同的行為菠镇。
繼承的特性
子類擁有父類非private的屬性,方法承璃。
子類可以擁有自己的屬性和方法利耍,即子類可以對父類進行擴展。
子類可以用自己的方式實現(xiàn)父類的方法盔粹。
Java的繼承是單繼承隘梨,但是可以多重繼承,單繼承就是一個子類只能繼承一個父類舷嗡,多重繼承就是轴猎,例如A類繼承B類,B類繼承C類进萄,所以按照關(guān)系就是C類是B類的父類捻脖,B類是A類的父類,這是java繼承區(qū)別于C++繼承的一個特性中鼠。
提高了類之間的耦合性(繼承的缺點可婶,耦合度高就會造成代碼之間的聯(lián)系)。
繼承關(guān)鍵字
繼承可以使用 extends 和 implements 這兩個關(guān)鍵字來實現(xiàn)繼承援雇,而且所有的類都是繼承于 java.lang.Object矛渴,當一個類沒有繼承的兩個關(guān)鍵字,則默認繼承object(這個類在?java.lang?包中惫搏,所以不需要?import)祖先類具温。
extends關(guān)鍵字
在 Java 中蚕涤,類的繼承是單一繼承,也就是說桂躏,一個子類只能擁有一個父類钻趋,所以 extends 只能繼承一個類。
implements關(guān)鍵字
使用 implements 關(guān)鍵字可以變相的使java具有多繼承的特性剂习,使用范圍為類繼承接口的情況蛮位,可以同時繼承多個接口(接口跟接口之間采用逗號分隔)。
super 與 this 關(guān)鍵字
super關(guān)鍵字:我們可以通過super關(guān)鍵字來實現(xiàn)對父類成員的訪問鳞绕,用來引用當前對象的父類失仁。
this關(guān)鍵字:指向自己的引用。
final關(guān)鍵字
final 關(guān)鍵字聲明類可以把類定義為不能繼承的们何,即最終類萄焦;或者用于修飾方法,該方法不能被子類重寫:
構(gòu)造器
子類不能繼承父類的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù))冤竹,但是父類的構(gòu)造器帶有參數(shù)的拂封,則必須在子類的構(gòu)造器中顯式地通過super關(guān)鍵字調(diào)用父類的構(gòu)造器并配以適當?shù)膮?shù)列表。
如果父類有無參構(gòu)造器鹦蠕,則在子類的構(gòu)造器中用super調(diào)用父類構(gòu)造器不是必須的冒签,如果沒有使用super關(guān)鍵字,系統(tǒng)會自動調(diào)用父類的無參構(gòu)造器钟病。
Java 多態(tài)
多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力萧恕。
多態(tài)的優(yōu)點
1. 消除類型之間的耦合關(guān)系
2. 可替換性
3. 可擴充性
4. 接口性
5. 靈活性
6. 簡化性
多態(tài)存在的三個必要條件
繼承
重寫
父類引用指向子類對象
虛方法
我們將介紹在Java中,當設(shè)計類時肠阱,被重寫的方法的行為怎樣影響多態(tài)性票唆。我們已經(jīng)討論了方法的重寫,也就是子類能夠重寫父類的方法屹徘。當子類對象調(diào)用重寫的方法時走趋,調(diào)用的是子類的方法,而不是父類中被重寫的方法缘回。要想調(diào)用父類中被重寫的方法吆视,則必須使用關(guān)鍵字super。
多態(tài)的實現(xiàn)方式
方式一:重寫:
這個內(nèi)容已經(jīng)在上一章節(jié)詳細講過酥宴,就不再闡述啦吧,詳細可訪問:Java 重寫(Override)與重載(Overload)。
方式二:接口
1. 生活中的接口最具代表性的就是插座拙寡,例如一個三接頭的插頭都能接在三孔插座中授滓,因為這個是每個國家都有各自規(guī)定的接口規(guī)則,有可能到國外就不行,那是因為國外自己定義的接口類型般堆。
2. java中的接口類似于生活中的接口在孝,就是一些方法特征的集合,但沒有方法的實現(xiàn)淮摔。具體可以看 java接口 這一章節(jié)的內(nèi)容私沮。
方式三:抽象類和抽象方法
贊賞支持