作者tails32100 (Tails)
看板java
标题Re: [问题] Object的clone()问题
时间Fri Mar 7 13:05:23 2014
小弟也想发表一下拙见,跟大家交流一下
前情提要:
小弟是从PHP 5.2 转来写Java (Android) 的
PHP 5.2的OOP并没有package的概念,也没有nested class
但public, protected, private的概念是一样的
有一点比较特别的是
PHP OOP 的 $this 是不能省略的,一定要打
Java 的 this 可以省略,只要在scope里没有宣告该变数,它就会是Member
而呼叫superclass的method时,PHP一样是用$this
Java 是改用 super 关键字
正文开始:
那就小弟的理解,其实很简单
我们把Visibility直译就行了--看得到部分
public 相信没什麽好争的,资讯公开,所有class都能access得到
所以我们可以像这样存取它:
var.member
var.method()
this.member
this.method()
super.method()
protected 简单来说,能看得到它的,就只有继承它的class而已
所以我们需要用this才能access得到它,像这样存取它:
this.member
this.method()
super.method()
private 除了跟project一样要用this之外,还要在同一个class(file)里才能存取的到
this.member
this.method()
所以现在我们知道Object#clone()一开始是宣告protected了
只要没有 override 它的能见度,就不能用 var.clone() 的方式去access
但我们可以用 super.clone() 或 this.clone() (有override的时候) 去access
super.clone() 也只有Object的子类能用
那最後,一样是继承 Object 的 ClassA 和 ClassB ,为什麽在A里面不能用
objB.clone();
原因只有一个,因为 ClassB 没有 override clone()的能见度
ClassB 不想公开clone()错了吗XD
那package(default)的部分,小弟就不大懂了
小弟只知道,如果上面三个都没有宣告,就是package了
但因为clone()在 Object就是被宣告为 protected 了
所以好像也跟package无关了....
以上为小弟的拙见 有错尽量鞭 <(_ _)>
补充
刚仔细看了一下 tkcn 大和 PsMonkey 大的文
所以如果要跟 package 的概念有相关的话
package 就必须要是 java.lang
也就是像这样:
package java.lang;
public class Test {
public static void main(String[] args) {
Object obj = new Object();
obj.clone(); // 这样就可以呼叫了
}
}
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.72.45
※ 编辑: tails32100 来自: 220.134.72.45 (03/07 13:06)
※ 编辑: tails32100 来自: 220.134.72.45 (03/07 13:06)
※ 编辑: tails32100 来自: 220.134.72.45 (03/07 13:20)
1F:推 michael47:这样真的可以吗?我有空测试一下,感谢分享 03/07 17:32
2F:→ swpoker:B!B!不可以这样~ 03/07 17:34
3F:推 PsMonkey:其实有时候这招蛮好用的 [被殴飞] 03/07 17:39
4F:推 michael47:我试了一下,好像不行,会看不到clone() 03/07 17:52
5F:→ tails32100:我是有测试过可以才放上来的 :( 03/07 18:35
6F:→ tails32100:只是Eclipse叫我要打try catch 我懒得打XD 03/07 18:36
7F:→ tkcn:这招可以过 compile,但是大概过不了 code review....XD 03/07 18:54
8F:推 michael47:加上try跟catch有过compile,但run时有错误讯息 03/07 19:32
9F:→ tails32100:等等 这版标不科学啊!! 03/09 00:37
10F:推 PsMonkey:敢说版标不科学,想在水桶里决斗吗? [完全误] 03/09 01:50
11F:→ tails32100:我先覆盖一个class,结束这回合 03/09 22:12
12F:→ swpoker:招唤decompiler,破解对方的class 03/10 12:09