JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:請問修飾子proteceted 和 (default) [Re:Duncan]
metavige

麥塔.米奇

版主

發文: 2133
積分: 10
於 2003-12-09 09:22 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
小弟最近寫了一篇 Effective Java 的 Tip
[Effective Java] 條款12:將 class 和其成員的可存取性(accessibility)最小化
裡頭有提到這部份的資訊


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
作者 Re:請問修飾子proteceted 和 (default) [Re:Yoshi]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2003-12-09 10:22 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Yoshi wrote:
我比較有興趣的是,有人在自己的程式當中使用過protected member嗎?
JDK中我只知道Calendar裡頭有用到protected,但我也不知道為什麼是protected
我自己寫程式從來沒有用到過protected member(不過我從來沒寫過大程式...)
有人有過親身的經驗,明顯的有需要使用protected member的case嗎?


protected method 應該很常見吧?

當你在做 template method 時那些留給 derived class 去實做的 hook method 就可以使用 protected method。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:請問修飾子proteceted 和 (default) [Re:Duncan]
UndeadJ

UX & UI Design



發文: 384
積分: 3
於 2003-12-09 18:01 user profilesend a private message to usersend email to UndeadJreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
protected method 應該很常見吧?

當你在做 template method 時那些留給 derived class 去實做的 hook method 就可以使用 protected method。

我想他的意思是說我們在coding的時候,很少人會去注意到要用protected,也就是大多數的人多會忽略掉,然後用public…

像我在coding的時候也是真的很少去注意到(這可能是為整個程式只有一人在寫,根本不知道 or 不好判斷) 何時要用protected吧

--
一個人可以完成的作品
在coding時真的能夠注意到真正使用protected的時机嗎…
或許是程式太小,又或許是經驗不足吧Black Eye


reply to postreply to post
我們是懷抱各自的夢想,買了車票的乘客,不過就像列車一定會有終點,人生有時會碰到必須換車的時候...

我們站在名為「今天」的車站,在名為「昨天」的列車下車,轉搭為「明天」的列車

不過,若沒及時搭上的話....
作者 Re:請問修飾子proteceted 和 (default) [Re:Duncan]
tomato





發文: 194
積分: 0
於 2004-02-15 19:45 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
說誤導可能是過了頭,但那樣的說法的確是很模糊的。我想有不少的人像你一樣誤解其意思了,或是曾擁有錯誤的想法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package a;
class public A {
   int i = 0;   // (default);  
   protected int j = 0;  //  protected
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
package b;
import a.A;
class D extends A{  
   public static void main(String[] args) {    
      A a = new A();    
      a.i = 2;     // fail  不在同一個package    
      a.j = 2;     // ok  不在同一個package,但是透過繼承後,protected可以被讀取   
                         =>    結果是 fail 但不知為何
   }
   
   public void foo() {
      System.out.println(i); // error
      System.out.println(j); // OK
   }
}


現在你明白 protected 和 default(package) 的差別嗎?


class public A 這是什麼丫?


reply to postreply to post
作者 Re:請問修飾子proteceted 和 (default) [Re:magicfish]
mojo





發文: 297
積分: 3
於 2004-02-16 17:10 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
magicfish wrote:
一般的class只能用public去修飾
但是把protected或private用在inner class上大概算是一種特例吧


其是top-level的class還可以用package屬性

1
2
3
4
5
6
7
8
9
10
class a{
public static void main(String args[]){
System.out.println("class a");
}
}
class b{
public static void main(String args[]){
System.out.println("class b");
}
}

這時你檔案名稱存a.java或b.java都可以通過編譯。

如果存成b.java且執行,會印出class b
但如果存成a.java然後執行它,卻也是印出class b
這點我也覺得很奇怪,我也不會解釋 @___@"


reply to postreply to post
作者 Re:請問修飾子proteceted 和 (default) [Re:item1394]
mojo





發文: 297
積分: 3
於 2004-02-16 17:33 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
引述某人簽名檔:
private , protected , public 就像你家的
老婆 小孩 狗 之於你的關係


reply to postreply to post
作者 Re:請問修飾子proteceted 和 (default) [Re:mojo]
yengceng





發文: 17
積分: 0
於 2004-05-21 20:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
mojo wrote:
其是top-level的class還可以用package屬性

1
2
3
4
5
6
7
8
9
10
class a{
public static void main(String args[]){
System.out.println("class a");
}
}
class b{
public static void main(String args[]){
System.out.println("class b");
}
}

這時你檔案名稱存a.java或b.java都可以通過編譯。

如果存成b.java且執行,會印出class b
但如果存成a.java然後執行它,卻也是印出class b
這點我也覺得很奇怪,我也不會解釋 @___@"


檔名需與class同名,還記得這規則吧~
我想應該是這樣子吧~
所以a.java 理應 class a
那b.java 就應class b囉~
即然同一個程式裡,java自動判斷檔名與class囉...


reply to postreply to post
~真相只有一個,我只相信真相~
作者 Re:請問修飾子proteceted 和 (default) [Re:yengceng]
yingssu





發文: 111
積分: 1
於 2004-05-21 21:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
yengceng wrote:
檔名需與class同名,還記得這規則吧~
我想應該是這樣子吧~
所以a.java 理應 class a
那b.java 就應class b囉~
即然同一個程式裡,java自動判斷檔名與class囉...

我記得只有public class才需要與檔案同名
不知道有沒有記錯


reply to postreply to post
作者 Re:請問修飾子proteceted 和 (default) [Re:mojo]
tree671025

Dragon



發文: 63
積分: 1
於 2004-09-03 15:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
mojo wrote:
~恕刪~
如果存成b.java且執行,會印出class b
但如果存成a.java然後執行它,卻也是印出class b
這點我也覺得很奇怪,我也不會解釋 @___@"


感覺這一篇精華好像沒有討論完
做了以下實驗:
---c.java---
1
2
3
4
5
6
7
8
9
10
class d{
    public static void main(String a[]){
        System.out.println("d");
    }
}
class c{
    public static void main(String a[]){
        System.out.println("c");
    }
}

----------> c
1
2
3
4
5
6
7
8
9
10
class c{
    public static void main(String a[]){
        System.out.println("c");
    }
}
class d{
    public static void main(String a[]){
        System.out.println("d");
    }
}

-----------> d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class d{
    public static void main(String a[]){
        System.out.println("d");
    }
}
public class c{
    public static void main(String a[]){
        System.out.println("c");
    }
}
class e{
    public static void main(String a[]){
        System.out.println("e");
    }
}

------------> c


reply to postreply to post
▂▃▄▅▆▇█TRY TO BE A MAN█▇▆▅▄▃▂
我的JAVA第一歨--->看完所有精華區
我的JAVA第二歨--->看懂所有精華區
我的JAVA第三歨--->暫時還沒想到 =.=
作者 Re:請問修飾子proteceted 和 (default) [Re:tree671025]
Yoshi

塵世中一個迷途小書僮

版主

發文: 874
積分: 22
於 2004-09-04 08:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
tree671025 wrote:
感覺這一篇精華好像沒有討論完
做了以下實驗:
....


你去compile .java檔時,有沒有注意到compiler產生出來的.class檔有幾個?
你到底是使用java c來run,還是使用java d來run?


reply to postreply to post
YOSHI!
作者 Re:請問修飾子proteceted 和 (default) [Re:Yoshi]
tree671025

Dragon



發文: 63
積分: 1
於 2004-09-04 10:54 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Yoshi wrote:
你去compile .java檔時,有沒有注意到compiler產生出來的.class檔有幾個?
你到底是使用java c來run,還是使用java d來run?



sorry我了解了....
因為我是用GEL去測試的
謝謝點醒我
因為我都用看的比較多
很少實做


reply to postreply to post
▂▃▄▅▆▇█TRY TO BE A MAN█▇▆▅▄▃▂
我的JAVA第一歨--->看完所有精華區
我的JAVA第二歨--->看懂所有精華區
我的JAVA第三歨--->暫時還沒想到 =.=
作者 Re:請問修飾子protected 和 (default) [Re:item1394]
kpeter6





發文: 5
積分: 0
於 2004-09-19 19:05 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
下圖是Java教學手冊所整理的,希望對大家有幫助


kpeter6 edited on 2004-09-19 19:08
reply to postreply to post
作者 Re:請問修飾子protected 和 (default) [Re:item1394]
mover





發文: 22
積分: 0
於 2004-11-26 20:32 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
大家争论坛的好激烈啊。等我学好了,我相信我一定可以把这个说明清楚。嘿嘿。

我相信一点,程序来自于生活。生活也是要遵守一定的程序。哈哈。


reply to postreply to post
作者 Re:請問修飾子protected 和 (default) [Re:item1394]
ajyi





發文: 55
積分: 1
於 2004-12-02 16:43 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
看完還是很不了解 Black Eye
之前在繼承別人的Class時試著使用過Super Class的protected method
發現在不同的Package無法使用,而必須在同一個Package中才行
這跟我在Sun的SL 275教材中,所說的不同

所以呢?我寫了簡單的程式來實驗
Super Class - A.java
1
2
3
4
5
6
7
8
9
10
11
package pa;
public class A{
  int i=1;
  protected int j=2;
  void defaultMethod(){
    System.out.println("default method in Class A.");
  }
  protected void protectedMethod(){
    System.out.println("protected method in Class A,");
  }
}


Sub Class in the same package - B.java
1
2
3
4
5
6
7
8
package pa;
public class B extends A{
  public static void main(String[] args){
    A a = new A();
    a.defaultMethod();
    a.protectedMethod();
  }
}


Sub Class in the different package - C.java
1
2
3
4
5
6
7
8
9
package pb;
import pa.A;
public class C extends A{
  public static void main(String[] args){
    A a = new A();
    a.defaultMethod();
    a.protectedMethod();
  }
}


B.java編譯正常,執行結果如下:
1
2
default method in Class A.
protected method in Class A,


C.java編譯錯誤,訊息如下:
1
2
3
4
5
6
7
C.java:6: defaultMethod() is not public in pa.A; cannot be accessed from outside package
                a.defaultMethod();
                 ^
C.java:7: protectedMethod() has protected access in pa.A
                a.protectedMethod();
                 ^
2 errors


這樣的結果就讓人搞不清楚default與protected的差別了


reply to postreply to post
作者 Re:請問修飾子protected 和 (default) [Re:ajyi]
ajyi





發文: 55
積分: 1
於 2004-12-02 17:03 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
又看了其他大大的文章有點搞懂了

將原來的程式改為
Sub Class in the same package - B.java
1
2
3
4
5
6
7
8
package pa;
public class B extends A{
  public static void main(String[] args){
    B b = new B();
    b.defaultMethod();
    b.protectedMethod();
  }
}


Sub Class in the different package - C.java
1
2
3
4
5
6
7
8
9
package pb;
import pa.A;
public class C extends A{
  public static void main(String[] args){
    C c = new C();
    c.defaultMethod();
    c.protectedMethod();
  }
}


B.java同樣執行正常
而這次編譯C.java就如同預期得到錯誤訊息如下:
1
2
3
4
C.java:6: defaultMethod() is not public in pa.A; cannot be accessed from outside package
                c.defaultMethod();
                 ^
1 error

只有default method無法使用,而protected method正常,將該行註解後,也可以得到正常的執行結果
1
protected method in Class A,


用Code來看就滿清楚的!


reply to postreply to post
作者 Re:請問修飾子protected 和 (default) [Re:item1394]
ajyi





發文: 55
積分: 1
於 2004-12-03 15:49 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
去翻了舊程式,看看以前遇到的問題,發現還是無解也不知道為什麼 Black Eye
以簡單的內容表達大致如下:

多了protected inner class的Super Class - A.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package pa;
public class A{
  int i=1;
  protected int j=2;
  void defaultMethod(){
    System.out.println("default method in Class A.");
  }
  protected void protectedMethod(){
    System.out.println("protected method in Class A,");
  }
  protected class InnerClass{
    public InnerClass(){
      System.out.println("public constructor in inner class of class A.");
    }
    public void publicMethod(){
      System.out.println("public method in inner class of class A.");
    }
    void defaultMethod(){
      System.out.println("default method in inner class of class A.");
    }
    protected void protectedMethod(){
      System.out.println("protected method in inner class of class A.");
    }
  }
}


Sub Class in the same package - B.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package pa;
public class B extends A{
  public static void main(String[] args){
    B b = new B();
    b.defaultMethod();
    b.protectedMethod();
    b.test();
  }
  void test(){
    protectedMethod();
    B.InnerClass innerObj = new B.InnerClass();
    innerObj.publicMethod();
    innerObj.defaultMethod();
    innerObj.protectedMethod();
  }
}

編譯執行都正常

Sub Class in the different package - C.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package pb;
import pa.A;
public class C extends A{
  public static void main(String[] args){
    C c = new C();
    //c.defaultMethod();
    c.protectedMethod();
    c.test();
  }
  void test(){
    protectedMethod();
    C.InnerClass innerObj = new C.InnerClass();
    innerObj.publicMethod();
    //innerObj.defaultMethod();   <==預期內的編譯錯誤
    innerObj.protectedMethod();
  }
}

編譯時發生錯誤
1
2
3
C.java:15: protectedMethod() has protected access in pa.A.InnerClass
                innerObj.protectedMethod();
                        ^

請問這是怎麼回事呢?
是不是C繼承A,也同時繼承了A的protected inner class,所以可以使用C.InnerClass,但是因為C不是繼承A的inner class,所以無法使用inner class中的protected method呢?


ajyi edited on 2004-12-03 15:53
reply to postreply to post
作者 Re:請問修飾子proteceted 和 (default) [Re:Kent_tseng]
rivalhw





發文: 4
積分: 0
於 2006-02-17 09:02 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
舉的例子很好,簡洁明了,一看就知~~~

PS:frank 兄太幽默了~~~經典說法耶
Cool

Kent_tseng wrote:
第一:
(default) 可用於 class, method, data
protected 可用於 method, data 不可用於class (inner class除外)

第二:
(default) :
這個class, method 或 data 在同一個package中,可以被直接取用。

protested:
這個method 或 data 在同一個package中,可以被直接取用。
除此之外,如果有繼承關係,則不同的package中,也可以直接取用。

例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package a;
class A {
  int i = 0;                 // (default);
  protected int j = 0;  //  protected
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
package a;
class B {
  public static void main(String[] args) {
    A a = new A();
    a.i = 2;                // ok  在同一個package
    a.j = 2;                // ok  在同一個package
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~
package b;
import a.A;
class C {
  public static void main(String[] args) {
    A a = new A();
    a.i = 2;                // fail  不在同一個package
    a.j = 2;                // fail  不在同一個package
  }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package b;
import a.A;
class D extends A{
  public static void main(String[] args) {
    A a = new A();
    a.i = 2;                // fail  不在同一個package
    a.j = 2;                // ok  不在同一個package,但是透過繼承後,protected可以被讀取
  }
}

ps:
抱歉,懶的測試,不過我想應該沒有打錯才對。
Big Smile


reply to postreply to post
go to first page go to previous page  1   2  go to next page go to last page
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8