作者PsMonkey (痞子军团团长)
看板java
标题Re: [问题] 请问java的"."操作符的涵意?
时间Fri Apr 26 23:03:28 2013
丑话先说在前面
基本上这篇文章违反了版规 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
1F:→ DeathWatch:谢主隆恩 04/27 02:15
2F:推 fr373969:板主真是好人~ 04/27 02:29
3F:推 kurakidream:推推 04/27 02:51
4F:推 namahanka:惊! 肃然起敬 04/27 17:33
5F:→ namahanka:看到版大钜细靡遗的解说,豁然开朗,真是谢谢了!!! 04/27 17:35
6F:推 gmoz:nice 讲的好详细 04/27 18:24
7F:→ andrew43:真是个好人! 发你张卡. 04/29 05:50
8F:推 No:这样的思考推论方式对初学程式很有帮助 04/29 23:22
9F:推 pkmilk:推~ 05/05 20:46