Discussion:
[問題] print char[]問題
(时间太久无法回复)
我要買車啦
2007-03-09 07:42:22 UTC
Permalink
這是我看書 自己測試的
char str1[]={'f','u','c','k',' ','y','o','u'};
char str2[]=new char [20];
System.out.println("str1[]="+str1);

System.arraycopy(str1,0,str2,0,str1.length);
System.out.println("str2[]="+str2);

str1[]=[***@6b97fd
str2[]=[***@1c78e57

跟書上寫的 只差 str1的內容而已
請問為什麼是這樣結果阿?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.169.120.191
愚人
2007-03-09 07:44:11 UTC
Permalink
※ 引述《walm20 (我要買車啦)》之銘言:
: 這是我看書 自己測試的
: char str1[]={'f','u','c','k',' ','y','o','u'};
: char str2[]=new char [20];
: System.out.println("str1[]="+str1);
: System.arraycopy(str1,0,str2,0,str1.length);
: System.out.println("str2[]="+str2);
: str1[]=[***@6b97fd
: str2[]=[***@1c78e57
: 跟書上寫的 只差 str1的內容而已
: 請問為什麼是這樣結果阿?

請問您對這結果有什麼地方不滿意 ?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 211.21.79.162
我要買車啦
2007-03-09 07:51:21 UTC
Permalink
※ 引述《qrtt1 (愚人)》之銘言:
: ※ 引述《walm20 (我要買車啦)》之銘言:
: : 這是我看書 自己測試的
: : char str1[]={'f','u','c','k',' ','y','o','u'};
: : char str2[]=new char [20];
: : System.out.println("str1[]="+str1);
: : System.arraycopy(str1,0,str2,0,str1.length);
: : System.out.println("str2[]="+str2);
: : str1[]=[***@6b97fd
: : str2[]=[***@1c78e57
: : 跟書上寫的 只差 str1的內容而已
: : 請問為什麼是這樣結果阿?
: 請問您對這結果有什麼地方不滿意 ?
課本 str1[]={'M','y',' ','S','t','r','i','n','g'};
執行結果
str1[]=My String
為什麼我這裡是出現奇怪的數字

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.169.120.191
c***@kkcity.com.tw
2007-03-09 10:29:17 UTC
Permalink
Post by 我要買車啦
這是我看書 自己測試的
char str1[]={'f','u','c','k',' ','y','o','u'};
char str2[]=new char [20];
System.out.println("str1[]="+str1);
System.arraycopy(str1,0,str2,0,str1.length);
System.out.println("str2[]="+str2);
跟書上寫的 只差 str1的內容而已
請問為什麼是這樣結果阿?
改成這樣子,陣列的存取是要迴圈跑出來的

char str1[]={'f','u','c','k',' ','y','o','u'};
char str2[]=new char [20];
System.out.print("str1[]=");
for(char num:str1)
System.out.print(num);

System.arraycopy(str1,0,str2,0,str1.length);
System.out.print("\nstr2[]=");
for(char num2:str2)
System.out.print(num2);




--
┌─────◆KKCITY◆─────┐  KKBOX◤歌名╱歌手╱歌詞╱專輯◢搜尋 
│ bbs.kkcity.com.tw │   ★ http://www.kkbox.com.tw ★
└──《From:220.138.49.30 》──┘ 超過100家唱片公司合法授權 音樂盡情下載
--
我要買車啦
2007-03-09 12:23:05 UTC
Permalink
※ 引述《***@kkcity.com.tw ( )》之銘言:
: ※ 引述《***@ptt.cc (我要買車啦)》之銘言:
: > 這是我看書 自己測試的
: > char str1[]={'f','u','c','k',' ','y','o','u'};
: > char str2[]=new char [20];
: > System.out.println("str1[]="+str1);
: > System.arraycopy(str1,0,str2,0,str1.length);
: > System.out.println("str2[]="+str2);
: > str1[]=[***@6b97fd
: > str2[]=[***@1c78e57
: > 跟書上寫的 只差 str1的內容而已
: > 請問為什麼是這樣結果阿?
: 改成這樣子,陣列的存取是要迴圈跑出來的
: char str1[]={'f','u','c','k',' ','y','o','u'};
: char str2[]=new char [20];
: System.out.print("str1[]=");
: for(char num:str1)
: System.out.print(num);
: System.arraycopy(str1,0,str2,0,str1.length);
: System.out.print("\nstr2[]=");
: for(char num2:str2)
: System.out.print(num2);
謝謝您
你的意思我大概了解
所以是我的課本寫錯摟?
那請問原本我寫的System.out.println("str1[]="+str1);
印出來的ㄧ堆看不懂的數字加符號
是不是str1的ref?(像C++ 指向陣列的第一個元素的起始位置)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.169.120.191
等等等等等等等等
2007-03-09 14:19:43 UTC
Permalink
※ 引述《walm20 (我要買車啦)》之銘言:
: ※ 引述《qrtt1 (愚人)》之銘言:
: : 請問您對這結果有什麼地方不滿意 ?
: 課本 str1[]={'M','y',' ','S','t','r','i','n','g'};
: 執行結果
: str1[]=My String
: 為什麼我這裡是出現奇怪的數字


這是有一些型態的問題

如:

String string = "happy";
int num = 3 + 4;

System.out.println(string + num);
System.out.println(string + 3 + 4);

顯示:

happy7
happy34

這樣看出一些東西麼?

就是個別將每項都提升成字串

但int為基本型態並非物件


而你的問題應該是個別提升成了物件,因為String也是一個物件,而char[]也是物件


如果你將你的程式寫成:

String string = "str = ";

char[] charArray = { 'H', 'a', 'p', 'p', 'y'};

System.out.print(string);//用print(String s)
System.out.print(charArray);//用print(char[] c)

顯示:

str = Happy

就和下列程式不同

System.out.print(string + charArray);//用print(Object obj)

顯示:

str = [***@c17164

(顯示charArray的記憶體位址)


如有錯誤請指教.....我還是個嫩新手....謝謝

By Java新手





--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.199.35
※ 編輯: moonforget 來自: 140.118.199.35 (03/09 22:19)
骨頭
2007-03-09 23:14:02 UTC
Permalink
※ 引述《walm20 (我要買車啦)》之銘言:
: 這是我看書 自己測試的
: char str1[]={'f','u','c','k',' ','y','o','u'};
: char str2[]=new char [20];
: System.out.println("str1[]="+str1);
: System.arraycopy(str1,0,str2,0,str1.length);
: System.out.println("str2[]="+str2);
: str1[]=[***@6b97fd
: str2[]=[***@1c78e57
: 跟書上寫的 只差 str1的內容而已
: 請問為什麼是這樣結果阿?

你應該做的是去了解為甚麼書上會寫這個範例,
當然去找找勘誤表也是該做的嘗試啦。(有些書會在網路上提供這項資訊)

you can try
System.out.println("str1[]="+ new String(str1));

And you can read the chapter about "String" 、 "Array"


--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the complier will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
我要買車啦
2007-03-10 03:33:17 UTC
Permalink
※ 引述《moonforget (等等等等等等等等)》之銘言:
: ※ 引述《walm20 (我要買車啦)》之銘言:
: : 課本 str1[]={'M','y',' ','S','t','r','i','n','g'};
: : 執行結果
: : str1[]=My String
: : 為什麼我這裡是出現奇怪的數字
: 這是有一些型態的問題
: 如:
: String string = "happy";
: int num = 3 + 4;
: System.out.println(string + num);
: System.out.println(string + 3 + 4);
: 顯示:
: happy7
: happy34
: 這樣看出一些東西麼?
: 就是個別將每項都提升成字串
: 但int為基本型態並非物件
: 而你的問題應該是個別提升成了物件,因為String也是一個物件,而char[]也是物件
: 如果你將你的程式寫成:
: String string = "str = ";
: char[] charArray = { 'H', 'a', 'p', 'p', 'y'};
: System.out.print(string);//用print(String s)
: System.out.print(charArray);//用print(char[] c)
: 顯示:
: str = Happy
: 就和下列程式不同
: System.out.print(string + charArray);//用print(Object obj)
: 顯示:
: str = [***@c17164
: (顯示charArray的記憶體位址)
: 如有錯誤請指教.....我還是個嫩新手....謝謝
: By Java新手
不知道你的意思是不是這樣
我歸納一下(在筆記本上TRY的)
print會把傳入的參數每個形態都調整成同樣型態
依照原本我的程式碼
如果改成
System.out.print("str1=");
System.out.println(str1);
這樣就是
str1=My String
但是合起來System.out.println("str1="+str1);
兩個type不同
就是上面說的
會調整str1的型態
從 char [] = > String
她就只認得str1的起始位置
所以就輸出str1的起始位置

不知道我想的是否正確
請指教(抱歉 佔用這麼多版面跟文章)


--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.169.123.242
※ 編輯: walm20 來自: 218.169.123.242 (03/10 11:33)
ha(ruhi|yate)ism
2007-03-10 04:00:41 UTC
Permalink
�� �ޭz�mwalm20 (�ڭn�R����)�n���ʨ��G
: �����D�A���N���O���O�o��
: ���k�Ǥ@�U(�b���O���WTRY��)
: print�|���ǤJ���ѼƨC�ӧκA���վ㦨�P�˫��A
��ӻ� ���ݨ쨺��+�O�r�ꪺ+(�s��)

�N�h�I�s str1.toString() ���}�C�ܦ��r��

�M���⨺�Ӧr�괫�W�h���_��

�ҥH "str1="+str1 �����O "str1="+(str1.toString())

: �̷ӭ쥻�ڪ��{���X
: �p�G�令
: System.out.print("str1=");
: System.out.println(str1);
: �o�˴N�O
: str1=My String
�o�u�O���n

System.out �o�� PrintStream ���󦳤@�� println �O���@�� char[] ��

�]�� System.out.println(str1); �N�|�h�I�s��

�����\���O�⨺�Ӧr���}�C�����e���W�����˦L�X��

�o�˦Ӥw

�ҥH�p�G�A���@��byte[]�iprintln ���Ӽ˦L�X�ӹ��O [***@35ce36 �o�˪��r��

(�Y�ϧA�O�ŧi�� byte x[]={49,65,20,90}; �o��)

: ���O�X�_��System.out.println("str1="+str1);
: ����type���P
: �N�O�W������
: �|�վ�str1�����A
: �q char [] = > String
: �o�N�u�{�ostr1���_�l���m
: �ҥH�N���Xstr1���_�l���m
�p�W�һ� ���O�I�s str1.toString() �⥦�ܦ��r��

�ܩ��ܦ����˪��r�� ���O�o�� toString() �b�ު�

�ӥ����n�O���o�}�C�����m�ܦ��r�����^��

: �����D�ڷQ���O�_���T
: �Ы���(���p ���γo���h�������峹)

--
�Ե^�G�u�e���I�A�u���N�o�˳Q���輤�����l�޹L�h�F��?!�v
���G�u�u�n���ۤk���\�X�ˤ���ˤl�A�Ҧ����n���O�N�����K�A���G�@�I�����a�ڡC�v
�Ե^�G�u���D�A�S���k�H���L�Y�F��?!�v
���G(�_�M�D)�u�S���C�b�`���Y���B�ͬ��Y�����ǥ����e�A�S�����تF���C�v
�С�������Ƿǵȸ������Ƿǵ �ĤG��

--
�� �o�H��: ���������~�{(ptt.cc)
�� From: 192.192.197.115
我要買車啦
2007-03-10 14:35:35 UTC
Permalink
※ 引述《***@bbs.sayya.org (foolish)》之銘言:
: ※ 引述《***@ptt.cc (我要買車啦)》之銘言:
:
: [-----------------]
: 字串的「加法」會結合 2 個字串
: 如果運算的東西不是字串時,會呼叫 toString() 方法
: char[] 是一個物件,所以他當然會有 toString()
: 這是來自物件之母/父的 Object 所擁有的 toString()
: > 從 char [] = > String
: 至於第 2 行的
: str1=My String 會成功,並不是您真的印了「字串」
: http://java.sun.com/j2se/1.4.2/docs/api/java/io/PrintStream.html
: #println(char[])
: 你只是呼叫了其中一個 print 可以填入 char[] 的方法罷了
: > 她就只認得str1的起始位置
: > 所以就輸出str1的起始位置
: 依之前的文章看,也許您學習過 c 語言
: 所以要提醒您在 java 中,
: 字串是由 String 所建立,
: 或是以 "" 包起來的才叫字串
: 不再是以一串 char[] 並含有 '\0' 者為字串
: > 不知道我想的是否正確
: > 請指教(抱歉 佔用這麼多版面跟文章)
: 有問題就問,
: 您也沒有使用不禮貌的問法,
: 不用覺得抱歉 :)
真的感謝了 解釋的很清楚^^
讓我受教了
也謝謝熱心的版友的指導

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.201.147
等等等等等等等等
2007-03-10 16:00:28 UTC
Permalink
※ 引述《walm20 (我要買車啦)》之銘言:
: ※ 引述《moonforget (等等等等等等等等)》之銘言:
: : 這是有一些型態的問題
: : 如:
: : String string = "happy";
: : int num = 3 + 4;
: : System.out.println(string + num);
: : System.out.println(string + 3 + 4);
: : 顯示:
: : happy7
: : happy34
: : 這樣看出一些東西麼?
: : 就是個別將每項都提升成字串
: : 但int為基本型態並非物件
: : 而你的問題應該是個別提升成了物件,因為String也是一個物件,而char[]也是物件
: : 如果你將你的程式寫成:
: : String string = "str = ";
: : char[] charArray = { 'H', 'a', 'p', 'p', 'y'};
: : System.out.print(string);//用print(String s)
: : System.out.print(charArray);//用print(char[] c)
: : 顯示:
: : str = Happy
: : 就和下列程式不同
: : System.out.print(string + charArray);//用print(Object obj)
: : 顯示:
: : str = [***@c17164
: : (顯示charArray的記憶體位址)
: : 如有錯誤請指教.....我還是個嫩新手....謝謝
: : By Java新手

嗯嗯...我又非常無聊的全部看完了一次所有的API和原始碼Orz

但我還在硬掰我的講法XD請各位大大幫忙指正一下,至少讓我知道我的大問題


情況一的第三行是用print(String s)執行,第三行是用print(char[] c)執行

所以可以得到你想要的結果


我的講法是情況二會用print(Object obj)來執行

 public void print(Object obj) {
write(String.valueOf(obj));
}

他會呼叫valueOf()

 public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();

他會呼叫toString()

而我的硬掰解釋是前項用String覆寫Object的toString()得到(繼承想法)

後項用Object的toString()得到

所以前面已經回傳原字串而後者繼續往下跑

Object
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());

String
public String toString() {
return this;
}


他又呼叫了一堆東西getClass() getName() toHexString

getClass().getName()得到 [C ([代表一維矩陣,C代表字元)


以下省略


也許是我太無聊了,反正知道結果就好

但請各位觀念清楚的大大來說明一下我硬掰講法是否有錯誤...

都懇請講解一下.....拜託謝謝~~

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.199.35
※ 編輯: moonforget 來自: 140.118.199.35 (03/11 00:00)
Loading...