作者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)
推 michael47:這樣真的可以嗎?我有空測試一下,感謝分享 03/07 17:32
→ swpoker:B!B!不可以這樣~ 03/07 17:34
推 PsMonkey:其實有時候這招蠻好用的 [被毆飛] 03/07 17:39
推 michael47:我試了一下,好像不行,會看不到clone() 03/07 17:52
→ tails32100:我是有測試過可以才放上來的 :( 03/07 18:35
→ tails32100:只是Eclipse叫我要打try catch 我懶得打XD 03/07 18:36
→ tkcn:這招可以過 compile,但是大概過不了 code review....XD 03/07 18:54
推 michael47:加上try跟catch有過compile,但run時有錯誤訊息 03/07 19:32
→ tails32100:等等 這版標不科學啊!! 03/09 00:37
推 PsMonkey:敢說版標不科學,想在水桶裡決鬥嗎? [完全誤] 03/09 01:50
→ tails32100:我先覆蓋一個class,結束這回合 03/09 22:12
→ swpoker:招喚decompiler,破解對方的class 03/10 12:09