Re: [問題] 請問java的"."操作符的涵意?
醜話先說在前面
基本上這篇文章違反了版規 5
然後各種類型的錯字有點多
(我記得很久以前版規有要求錯字不能太多,忘記啥時候取消這條了)
不過我沒有要開罰的意思 [茶]
※ 引述《namahanka (生半可)》之銘言:
: 小弟初學java,爬了文還是弄不清"."的作用
我比較好奇你怎麼爬文的 @___@
這個 search 條件超難下的阿...
難道每篇文章都看過一次嗎? [炸]
: 比方說
: class A{
: public int b;
: public void c(){
: }
: }
: A.b
: A.c()
你的程式碼要寫完整,不是 `A.b` or `A.c()`
在這個 case 中你要寫
A foo = new A();
//foo.b
//foo.c()
當然在這種情況下你可以寫 `A.b` 跟 `A.c()`
class A{
public static int b;
public static void c() {}
}
不過你先不要在意這個部份,因為跟你的問題沒有直接關聯
: 上面"."後面的b及c()是指A類別的成員變數及方法
: 那A.c().toString()的"."也是指A.c()的成員方法嗎?
==.====
這邊又是另一個錯誤
你給的程式碼,`c()` 沒有回傳值,基本上不可能呼叫 `toString()`
請注意你在發問的時候,程式碼最好 follow [SSCCE] 原則
不然我(們)會不知道你到底是亂寫程式碼所以搞不懂
還是真的搞不懂
[SSCCE]: http://sscce.org
: A.c()會為何能調用toString()而b.toString卻不行?
==.====
這邊又是一個需要 SSCCE 的經典例子
`foo.toString()` 跟 `foo.toString` 意義完全不同
在決大多數的程式碼寫 `foo.toString()` 不會出錯
而 `foo.toString` 通常會炸光光
這樣說或許有老王賣瓜之嫌疑
但是請記得...
龜毛為學好程式(基礎)之本
尤其是你在學語法基礎概念的時候
: 搞不懂…
: 甚至看過 xxx.toString().toString().toString()...這是為什麼?
我重新來一次,以下用我的程式碼討論
雖然我不是什麼大師,但是至少用我的方式發問
大抵上到哪裡問什麼問題都不會被酸
(除非你自稱 Java 高手 or 程度可以接案的人 lol)
不過更有可能的... 你就不用問問題了 [無誤]
======== 模擬原 po 問問題開始 ========
我搞不太懂 Java 中關於「.」的問題
比方說這個程式碼
//FooClass.java
public class FooClass {
public int intValue;
public String getString(){ return "fooClass"; }
public int getInt() { return 0; }
public WtfClass wtfValue = new WtfClass();
public FooClass() {} //PS 註:其實可以省略
public static void main(String[] args) {
FooClass foo = new FooClass();
//這幾行沒有出錯
System.out.println(foo.intValue);
System.out.println(foo.getInt());
System.out.println(foo.getString());
System.out.println(foo.getString().toString());
System.out.println(foo.wtfValue);
System.out.println(foo.wtfValue.toString());
//這個就錯了
System.out.println(foo.intValue.toString());
System.out.println(foo.getInt().toString());
System.out.println(foo.wtfValue.toString);
//PS 註:那個 void method 還要求 toString() 我就懶得吐槽了
}
}
class WtfClass {
WtfClass() {} //PS 註:其實可以省略
}
錯誤是發生在用 javac.exe compile 的時候
PS 註:在 Eclipse 這類 IDE 中是會有紅色 error 不讓你執行 FooClass
錯誤訊息是
,...... [略]
//PS 註:我沒有實際測試,所以不知道實際錯誤訊息 [逃]
可是我不懂這錯誤訊息
//PS 註:最好先丟 Google,然後說你不懂某個 link 的哪個段落
可以請各位前輩幫忙突破盲點嗎?
======== 模擬結束分隔線 ========
說真的,這樣子通常問題就自己解決了
不過,沒關係反正閒著也是閒著
我還是來解釋一下... 我的程式碼為甚麼這樣寫
我覺得如何測試自己的疑惑比知道原因還重要
首先,我發現 `foo.intValue` 跟 `foo.getString()` 不會出問題
但是 `foo.intValue.toString()` 就會出問題
嗯... 一個是成員變數、一個是方法(好不習慣這種講法)
所以試試看 `foo.getString().toString()` → 成功
那麼突發奇想(aka 對初學者來講有點難想到 XD)試試看
`foo.getInt().toString()` → 失敗
那麼測試到這邊,基本上已經可以排除「成員變數 vs 方法」的差異問題了
好像只要碰到 int 就會炸錯誤
那麼我就會繼續去 try 看看其他我知道可以拿來宣告變數的東西
`WtfClass` 好像也不會有這個困擾
但是 double、float、long 這些就會炸錯誤
(我上面程式碼沒有寫是因為懶惰... [逃])
然後我就會死馬當活馬醫去 google 看看
嗯... 就用「java int double float long」
結果頭兩個連結的標題就出現很奇怪的東西
Java's Primitive Data Types - Cafe au Lait
Java Primitive Data Types - JavaCamp.org
等等,不是說 Java 當中什麼都是物件嗎?
於是我至少知道一個關鍵字可以繼續 google
(基本上錯誤訊息應該就會告訴你方向了)
就是 Java Primitive Data Type
看完那兩個連結(或是重新 google 中文資料)
大抵上到這邊,問題就會解決了
坦白說,要說我會什麼東西,我大概就是會這些
跟那種從 compiler 理論 or spec 開始讀起的 Java 高手不太一樣
我就是用這種方式學會、了解 Java 的
所以太難的東西我都不會,充其量就是能硬幹解決一些問題
好,如果上面這些你都不想知道
那我只能很怨歎又很可悲的直接告訴你答案:
int 是 primitive data type,他不是物件
所以自然無法呼叫方法 or 存取成員變數
`foo.getString()` 對得到一個 `String` 物件
`foo.wtfValue` 是 `WtfClass` 物件
凡是物件都繼承自 `java.lang.Object`
所以自然也就擁有 `java.lang.Object` 有的 `toString()`
如此一來,`foo.wtfValue.toString().toString()` 為甚麼不會出錯
自然也就很清楚明瞭了
========
最後,請容許我很不要臉地自己 m 自己的文章 [核爆]
--
錢鍾書: 說出來的話
http://www.psmonkey.org
比不上不說出來的話
Java 版 cookcomic 版
只影射著說不出來的話
and more......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.23.165
→
04/27 02:15, , 1F
04/27 02:15, 1F
推
04/27 02:29, , 2F
04/27 02:29, 2F
推
04/27 02:51, , 3F
04/27 02:51, 3F
推
04/27 17:33, , 4F
04/27 17:33, 4F
→
04/27 17:35, , 5F
04/27 17:35, 5F
推
04/27 18:24, , 6F
04/27 18:24, 6F
→
04/29 05:50, , 7F
04/29 05:50, 7F
推
04/29 23:22, , 8F
04/29 23:22, 8F
推
05/05 20:46, , 9F
05/05 20:46, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):