將一串String轉(zhuǎn)為byte數(shù)組锉试,然后再用String.valueOf()轉(zhuǎn)回字符串。
void testValueOf() {
String s = "hello,bitch";
byte[] bytes = s.getBytes(Charset.forName("UTF-8"));
System.out.println(String.valueOf(bytes));
}
好像是對(duì)的揍移,編譯器也沒(méi)有報(bào)錯(cuò)次和,運(yùn)行一下,輸出:[B@28d93b30
那伐。嗯瑰妄,這分明是個(gè)對(duì)象!而且toString也無(wú)法奈何它娃属。String哪里去了呢株扛?
看下String.valueOf()這個(gè)方法:
public static String valueOf(Object obj)
public static String valueOf(char data[])
public static String valueOf(char data[], int offset, int count)
public static String valueOf(boolean b)
public static String valueOf(char c)
public static String valueOf(int i)
public static String valueOf(long l)
public static String valueOf(float f)
public static String valueOf(double d)
仔細(xì)一看,是沒(méi)有valueOf(byte[] bytes)
的诉探,那么就是向上轉(zhuǎn)型了日熬,byte[]
會(huì)轉(zhuǎn)成什么呢?會(huì)轉(zhuǎn)成Object
肾胯。
測(cè)試:
void f1(Object obj) {
System.out.println("obj");
}
調(diào)用:
byte[] bytes0 = new byte[12];
f1(bytes0);
byte[][] bytes1 = new byte[1][2];
f1(bytes1);
結(jié)果:
obj
obj
這是為何竖席?原因:數(shù)組也是對(duì)象耘纱,而對(duì)象的父類是Object,所以數(shù)組可以向上轉(zhuǎn)型為Object毕荐。
我對(duì)對(duì)象的理解:對(duì)象是保存在堆上的一塊連續(xù)或者不連續(xù)的一塊內(nèi)存區(qū)域束析,擁有方法和屬性,對(duì)象名相當(dāng)于一個(gè)指向該內(nèi)存區(qū)域的指針憎亚,通過(guò)對(duì)象名(該指針)可以訪問(wèn)到對(duì)象的方法和屬性员寇。
數(shù)組也有自己的類型:
byte[] bytes0 = new byte[12];
byte[][] bytes1 = new byte[1][2];
System.out.println(bytes1 instanceof byte[][]);
// System.out.println(bytes1 instanceof byte[]); //錯(cuò)誤
System.out.println(bytes1 instanceof Object);
output:
true
true
二維數(shù)組是不可以轉(zhuǎn)為一維數(shù)組的,但可以向上轉(zhuǎn)型為Object第美。
回到開頭蝶锋,要怎樣把byte[]數(shù)組轉(zhuǎn)為String呢?
String s = "hello,bitch";
byte[] bytes = s.getBytes(Charset.forName("UTF-8"));
System.out.println(new String(bytes, Charset.forName("utf-8")));
要說(shuō)為什么什往?當(dāng)然是因?yàn)镾tring的構(gòu)造函數(shù)有針對(duì)byte[]數(shù)組的重載啦扳缕。
public String(byte bytes[], Charset charset) {
this(bytes, 0, bytes.length, charset);
}
攪局者Object[] obj
添加方法:
void f1(Object obj) {
System.out.println("obj");
}
void f1(byte[] bytes) {
System.out.println("bytes");
}
void f1(Object[] obj){
System.out.println("obj []");
}
問(wèn)題1:一維數(shù)組的重載順序?
byte[] bytes0 = new byte[12];
f1(bytes0);
答案是:f1(byte[] bytes) -> f1(Object obj)恶守,不能轉(zhuǎn)為:f1(Object[] obj)第献。
也就是說(shuō):Object[] objects = bytes0;
這句代碼是錯(cuò)誤的。原因兔港?解釋庸毫?bytes0的父對(duì)象Object,Object[] 不在byte[] 的繼承體系內(nèi)衫樊。
問(wèn)題2:二維數(shù)組的重載順序飒赃?
byte[][] bytes1 = new byte[1][2];
f1(bytes1);
答案:f1(Object[] obj) -> f1(Object obj)
可以看出:Object[]
至少是 byte[][]
的一個(gè)父類型之一。
原因:byte[][]
是由一維數(shù)組byte[]
組合而成的數(shù)組科侈,byte[]
可以向上轉(zhuǎn)型為Object
载佳,那么,再套一層數(shù)組不就是Object[]
了嗎臀栈,而Object[]
又是對(duì)象蔫慧,所以又是Object。
那么权薯,既然如此姑躲,如何寫多維數(shù)組的重載方法?答案是:不寫盟蚣。
只用一個(gè)Object就可以了黍析。
不規(guī)范寫法:
void f1(Object obj) {
if (obj instanceof byte[]) {
System.out.println("byte[]");
} else if (obj instanceof byte[][]) {
System.out.println("byte[][]");
}
}
規(guī)范寫法:
void f1(Object obj) {
if (obj instanceof byte[][]) {
System.out.println("byte[][]");
} else if (obj instanceof byte[]) {
System.out.println("byte[]");
}
}
一維數(shù)組在前的寫法在byte數(shù)組里面也是可以的,但不推薦屎开,為什么呢阐枣?因?yàn)閮H當(dāng)數(shù)組為基本類型數(shù)組時(shí),這種寫法才是正確的,如果是對(duì)象數(shù)組也這么寫蔼两,那么就不會(huì)走到二維的判斷里面甩鳄,因?yàn)閿?shù)組的協(xié)變,或者說(shuō)是向上轉(zhuǎn)型宪哩。
Object[] objects = new Object[1][1];