您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java語法糖實例分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java語法糖實例分析”吧!
是由英國計算機科學(xué)家彼得·約翰·蘭達(Peter J. Landin)發(fā)明的一個術(shù)語,指計算機語言中添加的某種語法,這種語法對語言的功能并沒有影響,但是更方便程序員使用。通常來說使用語法糖能夠增加程序的可讀性,從而減少程序代碼出錯的機會。
功能和傳統(tǒng)的fori相似
代碼樣例
public class Test {
public static void main(String[] args) {
int[] num = new int[10];
for (int i = 0; i < 10; i++) {
num[i] = i;
}
//舊版本
for (int i = 0; i < num.length; i++) {
System.out.print(num[i]+" ");
}
System.out.println();
//新版本
for (int i:num) {
System.out.print(num[i]+" ");
}
}
}
輸出對比
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
特性
for-each從JDK5.0開始引入
for-each語法更加簡潔
for-each可以避免語法越界錯誤
fori可以刪除元素,for-each不可以
for-each遍歷時候不知道當(dāng)前元素的具體位置
for-each只能正向遍歷,不能反向遍歷
for-each不能同時遍歷兩個集合
變量的取值只在一個有限的集合里面
代碼樣例
public class Test {
public static void main(String[] args) {
enum Size{
SMALL,MEDIUM,LARGE;
}
Size s1 = Size.SMALL;
Size s2 = Size.MEDIUM;
Size s3 = Size.LARGE;
Size s4 = Size.SMALL;
System.out.println(s1==s4);
System.out.println(s3==s4);
}
}
輸出樣例
true
false
特性
enum聲明枚舉類,且都是Enum的 子類
enum內(nèi)部有多少個值,就有多少個實例對象
不能直接new枚舉類對象
除了枚舉的內(nèi)容 ,還可以添加屬性,方法 ,構(gòu)造函數(shù)
構(gòu)造函數(shù)只能是private類型,只能內(nèi)部調(diào)用
enum也繼承了Enum的子類,也繼承了相應(yīng)方法
ordinal()返回枚舉值所在的索引位置
compareTo()比較兩個枚舉值的索引位置大小
toString()放回枚舉值的字符串表示
valueOf()將字符串初始化為枚舉對象
values()返回所有的枚舉值
普通函數(shù)的形參列表是固定個數(shù)/類型/順序
JDK5.0提供了不定項參數(shù)(可變參數(shù))功能
代碼樣例
public class Test {
public static void main(String[] args) {
test("aaa");
test("aaa","bbb","ccc");
}
public static void test(String... args){
System.out.println(args.length);
for (String arg:args) {
System.out.println(arg);
}
}
}
輸出樣例
1
aaa
3
aaa
bbb
ccc
特性
類型后面加…表示,如代碼樣例所示
可變參數(shù),實際上是一個數(shù)組
一個方法只能有一個不定項參數(shù),且必須位于參數(shù)列表的最后
優(yōu)先規(guī)則1:固定參數(shù)的方法比可變參數(shù)優(yōu)先級更高
優(yōu)先規(guī)則2:調(diào)用語句,同時與兩個帶可變參數(shù)的方法匹配,則報錯
import導(dǎo)入程序所需要的類
import static導(dǎo)入一個類的靜態(tài)方法和靜態(tài)常量(JDK5.0引入)
代碼樣例
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.System.out;
public class Test {
public static void main(String[] args) {
int a=3,b=4,c=0;
//靜態(tài)引入
c = (int) sqrt(pow(a,2)+pow(b,2));
//原本用法
c = (int) Math.sqrt(Math.pow(a,2)+Math.pow(b,2));
//靜態(tài)引入
out.println(c);
//原本用法
System.out.println(c);
}
}
輸出樣例
5
5
特性
可以省略類名,直接用
靜態(tài)方法具有明確特征,如有重名,需要補充類名
通配符:*
在java中,基本類型放在棧里面,對象則是在堆里開辟了內(nèi)存空間,把對象的引用存入棧里面,基本類型可以包含在對象里面,所以形象的形容為裝箱
從JDK5.0開始引入,簡化了基本類型和對象轉(zhuǎn)化的寫法
基本類型:boolean/byte/char/int/short/long/float/double
對象:Boolean/Byte/Character/Integer/Short/Long/Float/Double
代碼樣例
public class Test {
public static void main(String[] args) {
//自動裝箱
Integer obj1 = 5;
//原始用法
Integer obj2 = Integer.valueOf(5);
//自動拆箱
int a1 = obj1;
//原始用法
int a2 = obj2.intValue();
System.out.println(obj1);
System.out.println(a1);
System.out.println(obj2);
System.out.println(a2);
}
}
輸出樣例
5
5
5
5
特性
裝箱和拆箱都是編譯器的工作,在class中已經(jīng)添加轉(zhuǎn)化,虛擬機中沒有自動拆箱和裝箱的語句
對于==:基本類型是內(nèi)容相同,對象是指針是否相同(內(nèi)存同一個區(qū)域)
基本類型沒有空值,對象有null,可能引發(fā)NullPointerException
當(dāng)一個基礎(chǔ)數(shù)據(jù)類型與封裝類型進行==,+,-,*,/運算時,會將封裝類進行拆箱,對基本數(shù)據(jù)類型進行運算
謹(jǐn)慎使用多個非同類的數(shù)值類對象進行運算
多個異常并列在一個catch中
從JDK7.0Y引入,簡化寫法
代碼樣例
import java.io.IOException;
import java.sql.SQLException;
public class Test {
public static void main(String[] args) {
//舊版本
try {
test();
}
catch (IOException ex){
//異常處理
}
catch (SQLException ex){
//異常處理
}
//新版本
try {
test();
}
catch (IOException | SQLException ex){
//異常處理
}
}
private static void test() {
}
}
特性
并列的特性不能直接有或間接有繼承關(guān)系,如果有,則報錯
從JDK7.0開始引入
整數(shù)類型可以用二進制進行賦值
代碼樣例
public class Test {
public static void main(String[] args) {
byte a1 = (byte) 0b00100001;
short a2 = (short) 0b10101010101;
int a3 = 0b101;
long a4 = 0b101010101011011011010101011L;
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
}
}
輸出樣例
33
1365
5
89503403
特性
避免二進制計算
0b表示二進制數(shù)
從JDK7.0開始引入
在數(shù)字字面量中使用下劃線
代碼樣例
public class Test {
public static void main(String[] args) {
//二進制,0b開頭
int a1 = 0b0100_1011_0001;
//八進制,0開頭
int a2 = 02_014;
int a3 = 123__45;
//十六進制,0x開頭
int a4 = 0x7_567;
float a5 = 3.56_78f;
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
System.out.println(a4);
System.out.println(a5);
}
}
輸出樣例
1201
1036
12345
30055
3.5678
特性
增加數(shù)字的可讀性和糾錯功能
下劃線只能出現(xiàn)在數(shù)字中間,前后必須有數(shù)字
下劃線不能拆開0x
允許在二/八/十/十六進制中使用
可以使用多個下劃線
java最初的設(shè)計中,接口的方法都是沒有實現(xiàn)的公開的
JDK8.0推出接口的默認方法/靜態(tài)方法(都帶實現(xiàn)的),為Lambda表達式提供支持
代碼樣例
public class Test {
public interface Animal{
public void move();
}
public interface NewAnimal{
public default void move(){
System.out.println("I can move");
};
}
}
特性
用default關(guān)鍵字標(biāo)注,其他的定義和普通函數(shù)一樣
默認方法不能重寫Object中的方法
實現(xiàn)類可以繼承/重新父接口的默認方法
接口可以繼承/重新父接口的默認方法
當(dāng)父類和父接口都有同名同參數(shù)的默認方法的時候,子類繼承父類的默認方法,這樣可以兼容JDK7.0以前的代碼
子類實現(xiàn)了兩個接口(同名同參),那么編譯失敗,必須在子類中重寫這個default方法
JDK8.0推出帶實現(xiàn)的靜態(tài)方法
代碼樣例
public class Test {
public interface StaticAnimal{
public static void move(){
System.out.println("I can move");
}
}
public interface StaticLandAnimal extends StaticAnimal{
//繼承不到StaticAnimal的move方法
}
public static void main(String[] args) {
//正確引用
StaticAnimal.move();
//錯誤引用
StaticLandAnimal.move();
new StaticAnimal().move();
}
}
特性
該靜態(tài)方法屬于本接口,不屬于子類/子接口
子類(子接口)沒有繼承該靜態(tài)方法,只能通過所在的接口名來調(diào)用
JDK9.0推出接口的私有方法
代碼樣例
public class Test {
public interface StaticAnimal{
private void move(){
System.out.println("I can move");
}
}
public interface StaticLandAnimal extends StaticAnimal{
//繼承不到StaticAnimal的move方法
}
public static void main(String[] args) {
//錯誤引用
StaticAnimal.move();
StaticLandAnimal.move();
new StaticAnimal().move();
}
}
特性
解決多個默認方法/靜態(tài)方法的內(nèi)容重復(fù)問題
私有方法屬于本接口,只能在本接口內(nèi)使用,不屬于子類/子接口
子類(子接口)沒有繼承該私有方法,也無法調(diào)用
靜態(tài)私有方法可以被靜態(tài)/默認方法調(diào)用,非靜態(tài)私有方法被默認方法調(diào)用
程序如果打開外部資源,那么使用后必須正確關(guān)閉
考慮異常因素,java提供try-catch-finally進行保證
JDK7.0提供try-with-resour,比try-catch-finally更加方便
代碼樣例
public class Test implements AutoCloseable {
private int age = 18;
@Override
public void close() throws Exception {
System.out.println("關(guān)閉成功");
}
public static void main(String[] args) {
try(Test11 OpenResource = new Test()){
System.out.println(OpenResource.age);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出樣例
18
關(guān)閉成功
特性
資源對象必須實現(xiàn)AutoCloseable接口,即實現(xiàn)close方法
在try-catch塊執(zhí)行后會自動執(zhí)行close方法
JDK7要求定義臨時變量接收
Test OpenResource = new Test();
try(Test TT = OpenResource)…
JDK9不在要求定義臨時變量,可以直接使用
Test OpenResource = new Test();
try(OpenResource)…
JDK8及以前,ResourceBundle默認以ISO-8859-1方式加載文件
JDK9及以后,ResourceBundle默認以UTF-8方式加載文件
java以前一直是一種強類型的語言
每個變量在定義時候就確定了類型
JDK10推出了var:局部變量推斷
代碼樣例
public class Test {
public static void main(String[] args) {
var a1 = 5;
var a2 = 0.025f;
var a3 = "abc";
int b1 = 5;
float b2 = 0.025f;
String b3 = "abc";
System.out.println(a1==b1);
System.out.println(a2==b2);
System.out.println(a3==b3);
}
}
輸出樣例
true
true
true
特性
避免了信息冗余
對齊了變量名
更容易閱讀
var可以用在局部變量上,非類成員變量
var可以用在for/for-each循環(huán)中
聲明時必須初始化
不能用在方法形參和返回類型
大面積濫用會導(dǎo)致代碼整體閱讀性變差
var只在編譯時起作用,沒有在字節(jié)碼中引入新的內(nèi)容,也沒有專門的JVM指令處理war
JDK12推出
代碼樣例
public class Test {
public static void main(String[] args) {
String month = null;
int result;
switch (month){
case "Jan","Mar","July","Aug","Oct","Dec" -> result = 31;
case "Apr","June","Sep","Nov" -> result = 30;
case "Feb" -> result = 28;
default -> result = -1;
}
}
}
感謝各位的閱讀,以上就是“Java語法糖實例分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java語法糖實例分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。