第一个正常版本
//:MyLeaf.java
public class MyLeaf{ int i = 0; MyLeaf increment(){ i++; return this; } void print(){ System.out.println("i = " + i); } public static void main(String[] args){ MyLeaf X = new MyLeaf(); X.increment().increment().increment(); X.increment(); X.print(); } }
|
问题1:X.increment().increment().increment();是对三个X.increment();的省略吗?
不是 请看第二版程序:
//:MyLeaf.java
public class MyLeaf{ int i = 0; //MyLeaf increment(){
increment(){ i++; // return this;
} void print(){ System.out.println("i = " + i); } public static void main(String[] args){ MyLeaf X = new MyLeaf(); //X.increment().increment().increment();
X.increment(); X.increment(); X.print(); } }
E:\android\JAVA\test_code>javac MyLeaf.java MyLeaf.java:5: 方法声明无效;需要返回类型 increment(){ ^ 1 错误
|
为什么无法编译通过 C语言的应该可以吧 好吧 我标准点写。
//:MyLeaf.java
public class MyLeaf{ int i = 0; //MyLeaf increment(){
void increment(){ i++; // return this;
} void print(){ System.out.println("i = " + i); } public static void main(String[] args){ MyLeaf X = new MyLeaf(); //X.increment().increment().increment();
X.increment(); X.increment(); X.print(); } }
|
这样程序可以正常运行 结果是
E:\android\JAVA\test_code>java MyLeaf
i = 2
如果书写 X.increment().increment().increment();
将报错:
E:\android\JAVA\test_code>javac MyLeaf.java
MyLeaf.java:15: 无法取消引用 void
X.increment().increment().increment();
^
1 错误
好吧 回到第一个版本 你MLGB到底啥意思啊。
从基本概念出发 对象是对应类的实体 this 是对调用方法那个对象的引用。
so
X.increment()中 执行的是i++; return 当时的Leaf 这个类的对象x 但是return this 你返回 X 不是会无止尽的运行increment吗?因为你的每个return都有X啊。 妈的 又一个问题。。。
有查阅说
x.increment().increment().increment().print();
这里可以这么看x.increment(),然后返回了this就相当于返回了当前的对象,对象又可以调用方法,
x.increment().increment().increment().print();继续
=this.increment().increment().print();继续=this.increment().print();继续=this.print();
那更不理解返回的对象了,它是返回X 这个整体的哪个部分信息呢 只是变量? 与函数无关?
好吧 这样理解 在return this的时候 这个时候的X 按C语言的理解应该是这样 返回X所指定的类(就像C语言中的结构体 好吧 它带函数(方法)滴说)对应的区域。 如果有执行体 那么不好意思 不动 只有变量之类的有意义。相当于说吧 将这个区域的变量之类的值暂时保管者承接给下一次使用。
好吧 先这样理解 以后再改。
阅读(276) | 评论(0) | 转发(0) |