对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类
【0】README
0.1) 本文描述+源代碼均 轉(zhuǎn)自 core java volume 1, 旨在理解 自動拆箱(裝箱)、printf的參數(shù)數(shù)量可變 以及 枚舉類的詳細說明;
0.2) 源代碼: https://github.com/pacosonTang/core-java-volume/blob/master/chapter5/chapter5_pack_unpacking_enum.java;
【1】 對象包裝器與自動裝箱
1.1)包裝器定義:所有的基本類型都對應(yīng)一個類,如int基本類型對應(yīng)Integer類, 這些類就稱為包裝器;
1.2)包裝器類名字: Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean,前6個類派生于公共超類Number;
1.3)對象包裝器類是不可變的, 即一旦構(gòu)造包裝器,就不允許更改包裝在其中的值;
1.4)同時,對象包裝器類還是 final, 因此不能定義它們的子類;
Warning)由于每個值分別包裝在對象中, 所以 ArrayList 的效率遠遠低于int[] 數(shù)組,因此,應(yīng)該用它構(gòu)造小型集合,原因是 此時程序員操作的方便性要比執(zhí)行效率更加重要;
1.5)自動裝箱: list.add(3); 等價于 list.add(Integer.valueOf(3)); 這種變換就稱為自動裝箱;
1.6)自動拆箱:將一個Integer對象 賦給一個 int值時,將會自動拆箱;
int n = list.get(i); 等價于 int n = list.get(i).intValue();
1.7)一種假象: 認為基本類型與他們的對象包裝器是一樣的, 只是他們的相等性不同;包裝器類的 == 運算符檢測的是對象是否指向同一個存儲區(qū)域;
1.8)解決假象的方法: 是在兩個包裝器對象比較時調(diào)用 equals方法;
Annotation)自動裝箱規(guī)范要求 boolean、byte、char<=127,介于 -128~127 間的short和int 被包裝到固定的對象中;
1.9)最后強調(diào): 裝箱和拆箱是被編譯器認可的, 而不是虛擬機;
1.10)使用數(shù)值對象包裝器 還有一個好處: 可以將某些基本方法放置在 包裝器中, 如, 將一個數(shù)字字符串轉(zhuǎn)換成數(shù)值; 如 int x = Integer.parseInt(s);
【2】參數(shù)數(shù)量可變的方法
2.1)printf 方法是這樣定義的:
public class PrintStream {public PrintStream printf(String fmt, Object... args) {return format(fmt, args) ;} }- 2.1.1)這里的省略號… : 是java程序的一部分, 它表明這個方法可以接收任意數(shù)量的對象(除 fmt參數(shù)外);
2.2)實際上, printf 方法接收了兩個參數(shù), 一個是格式字符串,另一個是 Object[] 數(shù)組, 其中存儲著所有的參數(shù);換句話說, 對于printf來說, Object… 與 Object[] 完全一樣;
2.3)編譯器需要對printf的每次調(diào)用進行轉(zhuǎn)換, 以便將從參數(shù)綁定到數(shù)組上,并在必要的時候進行自動裝箱:
2.4)用于自定義可變參數(shù)的方法(計算若干個數(shù)值的方法):
public static double max(double... values) {double largest = Double.MIN_VALUE;for(double v: values) if(v > largest) largest = v;return largest; }可以這樣調(diào)用:
double m = max(1, 2, 3);編譯器將 new double[] { 1, 2, 3} 傳遞給 max方法;Annotation) 可以將 一個數(shù)組傳遞給 可變參數(shù)方法的最后一個參數(shù):
System.out.printf(%d %s", new Object[]{new Integer(1), "widgets"});【3】枚舉類
3.1)看個荔枝:
public enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};實際上, 這個說明定義的類型是一個類, 在此盡量不要構(gòu)造新對象;
- 3.1.1)因此, 在比較兩個枚舉類型時,不需要使用 equals, 而直接使用 == 就可以了;
3.2)構(gòu)造器只是在構(gòu)造枚舉常量的時候被調(diào)用:
public enum Size {SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");private Size(String abbreviation) {this.abbreviation == abbreviation};public String getAbbreviation() { return abbreviation; } }3.3)所有的枚舉類型都是 Enum類的子類: 它們繼承了這個類的許多方法,包括toString方法, 它可以返回枚舉常量名;如, Size.SMALL.toString() 將返回字符串 “SMALL”;
3.4)toString 的逆方法是靜態(tài)方法valueOf: 如,Size s = Enum.valueOf(Size.class, “SMALL”); 將s 設(shè)置為 Size.SMALL;
3.5)每個枚舉類型都有一個靜態(tài)的values方法: 它將返回一個包含全部枚舉值的數(shù)組;
3.6)ordinal : 該方法返回enum聲明中枚舉常量的位置, 從0開始計數(shù);
如, Size.MEDIUM.ordinal() 返回 1;
Annotation) Enum類省略了一個類型參數(shù), 例如,實際上, 應(yīng)該將枚舉類型 Size 擴展為Enum ;
總結(jié)
以上是生活随笔為你收集整理的对象包装器与自动(拆箱)装箱+参数数量可变的方法+枚举类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脑细胞源自海中的扁形动物?科学家发现 8
- 下一篇: 追风者推出新款 140mm D30-14