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

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 protected的疑問... [精華]
csreen





發文: 142
積分: 2
於 2003-12-23 15:09 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
有2個檔案a.java和b.java
1
2
3
4
5
package p1;
public class a
{   
    protected int ia;
}

------------
1
2
3
4
5
6
7
8
9
10
11
12
13
package p2;
import p1.a;
public class b extends a
{
    void k(a e)
    {
        System.out.println(e.ia);     <=compiler有錯
    }
    void g(b h)
    {
        System.out.println(h.ia);
    }
}


照理來說ia應該可以由class b來使用,因為,class b extends a。那為什麼complier會有錯呢?請各位大大指教


browser edited on 2003-12-23 15:31
reply to postreply to post
作者 Re:protected的疑問... [Re:csreen]
kimsgroup



發文: 0
積分: 0
於 2004-01-08 15:13 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
http://www.javaworld.com.tw/jute/post/view?bid=29&id=27093&sty=3&age=0&tpg=1&ppg=1#27093

我這邊也有跟你一樣的題目
我有把為什麼會不能存取的原因寫出來
只是原因中還有個不懂的就是實作
重點就在於實作

一個object 的protected member 可以被他的subclass存取
但有個條件這個subclass必須參予這個object的implementation(實作)
所以class B不可存取"e.ia"
class B雖然是class A的subclass
但是class B並沒有參予object"e"(an instance of class A)的實作

看看你看不看的懂
若看懂實作之後記得告訴我喔


reply to postreply to post
作者 Re:protected的疑問... [Re:csreen]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-08 17: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
1
2
3
4
5
6
7
8
public class A
{
    protected int testInt;
}
 
public class B extends A
{    
}


如果產生 B 類別的物件
1
B bObj = new B();


可以把這物件想像成裡面包了父類別的物件
1
2
3
4
5
6
7
8
9
10
11
12
 _______________________________________________
|   _________________________________           |
|  |   _______________               |          |
|  |  |               |  class A     | class B  |
|  |  |  class Object |  的物件        |  的物件    |
|  |  |    的物件       |              |          |
|  |  |               |  testInt     |          |
|  |  |               |   在此         |          |
|  |  |               | 受 protected  |          |
|  |  |_______________|  保護          |          |
|  |_________________________________|          |
|______________________________________________ |


所以這個物件要去存取自己的 testInt 是 OK 的
但是同一個類別的另一個物件,妄想去取用別的物件的 testInt 則會被 protected 擋住

大概是這個意思吧∼∼∼
另一篇文章說的『沒有參與實作』我猜應該是指『不屬於實體化出來的那個物件』的意思∼∼


TAHO edited on 2004-01-08 17:11
reply to postreply to post
作者 Re:protected的疑問... [Re:TAHO]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-01-08 17:36 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
TAHO wrote:
所以這個物件要去存取自己的 testInt 是 OK 的
但是同一個類別的另一個物件,妄想去取用別的物件的 testInt 則會被 protected 擋住


紅色部分是說:一個 B instance 去碰另一個 B instance 的 testInt 會被擋住?!

不同的 B instance 彼此都可以互碰私處(private member),為什麼不能碰 protected member(儘管是承襲下來的東西)?


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:protected的疑問... [Re:csreen]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-08 17:59 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
是的,這是 JLS 的規定,請參閱 JLS 第六章第六節
http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285

尤其是 6.6.2 跟 6.6.3 跟 6.6.7

至於為什麼要這樣規定............
我怎麼會知道咧,你寫信問 Sun 看看好了∼∼


reply to postreply to post
作者 Re:protected的疑問... [Re:csreen]
koji

秒速5センチメートル

站長

發文: 8415
積分: 19
於 2004-01-08 18:19 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 san想說的是這個!?
http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285
的6.6.7的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package threePoint;
import points.Point;
public class Point3d extends Point {
  protected int z;
  public void delta(Point p) {
    p.x += this.x;    // compile-time error: cannot access p.x
    p.y += this.y;    // compile-time error: cannot access p.y
  }
  public void delta3d(Point3d q) {
    q.x += this.x;
    q.y += this.y;
    q.z += this.z;
  }
}


的這個部分
1
2
3
4
5
public void delta3d(Point3d q) {
    q.x += this.x;
    q.y += this.y;
    q.z += this.z;
}

畢竟taho您說的
但是同一個類別的另一個物件,妄想去取用別的物件的 testInt 則會被 protected 擋住
可能會把這段code也包含到!?是不是?

koji


reply to postreply to post
作者 Re:protected的疑問... [Re:koji]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-01-08 19:05 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
koji wrote:
我想duncan san想說的是這個!?
http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#104285
的6.6.7的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package threePoint;
import points.Point;
public class Point3d extends Point {
  protected int z;
  public void delta(Point p) {
    p.x += this.x;    // compile-time error: cannot access p.x
    p.y += this.y;    // compile-time error: cannot access p.y
  }
  public void delta3d(Point3d q) {
    q.x += this.x;
    q.y += this.y;
    q.z += this.z;
  }
}



如果沒有 package 的隔閡,delta method 是不是就沒有錯誤了。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:protected的疑問... [Re:csreen]
TAHO

可愛吧∼∼

版主

發文: 271
積分: 7
於 2004-01-08 19:52 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
恩 看來是我說錯了∼∼
是不同 package 之間才會有這種問題

不過話說回來∼∼
光是 default 的 package 權限就可以讓同 package 的 class 存取了
更不用說 protected 了∼∼


reply to postreply to post
作者 Re:protected的疑問... [Re:TAHO]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2004-01-09 10:11 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
TAHO wrote:
恩 看來是我說錯了∼∼
是不同 package 之間才會有這種問題

不過話說回來∼∼
光是 default 的 package 權限就可以讓同 package 的 class 存取了
更不用說 protected 了∼∼


不,你強調的那一點是沒錯的,這是許多人剛接觸 access privilege 時所沒有弄清楚的,會以為一個 derived class instance 總可以碰觸”任”一個 base class instance 的 protected member。

之前討論 protected/package 數次了,光靠文字形容不太容易表達的清楚,即使有 example code 也不見得能很明白點出重點。

我個人認為在分辨 protected/package 二者的差別應該分兩個層面﹔一是就純粹的 access 層面來看,protected 和 package 二者的開放性一致:任一個 class instance 定可以存取任位於同一 package 內的所有 class 之任一 instance 的 protected/package member(不論這個 member 是怎麼來的)﹔另外一點就是從 base class member 在 derived class 中的可見度來看,這一點 protected 的門檻顯的比 package 來的鬆,不管是不是同一個社團(package),derived class object 可以見到(控制)其內承襲 base class 而來的 subobject註一 之 protected member,至於 package(default) member 則只有位於同一 package 內的 derived class object 才能見到 object 內部承襲 base class 而來的 subobject 的 package/default member。

一個 public/protected member 可以變成 derived class 的 public/protected member,當 base class object 成為別人的 subobject 時註一。而 private member 在此情況中則變成 derived class object 的 ghost member,明明就存在 derived class object 之中,但是 derived class object 本身與任一 class 的任一 instance 都無法看見(存取)之(包括 base class 也不能去碰 derived class 的 ghost member,除非前者把後者的 instance 視為同類的 instance),derived class instance 得依靠承襲下來的 method 來 access object 內部中的這一份 ghost member﹔package/default member 對同一 package 的 derived class 而言會被承襲成為 package/default member,但對屬於不同 package 的 derived class 而言,就如同 private member 變成存在卻見不到的 ghost member。

註一:請見 TAHO 在此主題發表文中的圖示說明。


reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:protected的疑問... [Re:csreen]
rfus





發文: 315
積分: 2
於 2004-04-22 18:01 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
csreen wrote:
有2個檔案a.java和b.java
1
2
3
4
5
package p1;
public class a
{   
    protected int ia;
}

------------
1
2
3
4
5
6
7
8
9
10
11
12
13
package p2;
import p1.a;
public class b extends a
{
    void k(a e)
    {
        System.out.println(e.ia);     <=compiler有錯
    }
    void g(b h)
    {
        System.out.println(h.ia);
    }
}


照理來說ia應該可以由class b來使用,因為,class b extends a。那為什麼complier會有錯呢?請各位大大指教

我第一眼看就不覺得它應該可以讀取它...
k(a e)是傳入a
b extends a 並不代表他可以new a 來使用a 的protected值吧
protected不是這樣用滴....


reply to postreply to post
作者 Re:protected的疑問... [Re:csreen]
jocosn





發文: 102
積分: 5
於 2004-05-07 01: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
http://www.absolutejava.com/main-articles/test-your-java-knowledge/
Q2: Member Visibility

對於存取權限有很好的解釋與範例


reply to postreply to post
作者 Re:protected的疑問... [Re:Duncan]
jamestian





發文: 250
積分: 0
於 2008-07-31 11: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
Duncan wrote:
不,你強調的那一點是沒錯的,這是許多人剛接觸 access privilege 時所沒有弄清楚的,會以為一個 derived class instance 總可以碰觸”任”一個 base class instance 的 protected member。

之前討論 protected/package 數次了,光靠文字形容不太容易表達的清楚,即使有 example code 也不見得能很明白點出重點。

我個人認為在分辨 protected/package 二者的差別應該分兩個層面﹔一是就純粹的 access 層面來看,protected 和 package 二者的開放性一致:任一個 class instance 定可以存取任位於同一 package 內的所有 class 之任一 instance 的 protected/package member(不論這個 member 是怎麼來的)﹔另外一點就是從 base class member 在 derived class 中的可見度來看,這一點 protected 的門檻顯的比 package 來的鬆,不管是不是同一個社團(package),derived class object 可以見到(控制)其內承襲 base class 而來的 subobject註一 之 protected member,至於 package(default) member 則只有位於同一 package 內的 derived class object 才能見到 object 內部承襲 base class 而來的 subobject 的 package/default member。

一個 public/protected member 可以變成 derived class 的 public/protected member,當 base class object 成為別人的 subobject 時註一。而 private member 在此情況中則變成 derived class object 的 ghost member,明明就存在 derived class object 之中,但是 derived class object 本身與任一 class 的任一 instance 都無法看見(存取)之(包括 base class 也不能去碰 derived class 的 ghost member,除非前者把後者的 instance 視為同類的 instance),derived class instance 得依靠承襲下來的 method 來 access object 內部中的這一份 ghost member﹔package/default member 對同一 package 的 derived class 而言會被承襲成為 package/default member,但對屬於不同 package 的 derived class 而言,就如同 private member 變成存在卻見不到的 ghost member。

註一:請見 TAHO 在此主題發表文中的圖示說明。

Duncan大請問你說的是這個意思嗎?
1
2
3
4
5
6
7
8
9
10
11
package test1;
 
public class A {
  
  protected int protectedNumber=1;
  private int privateNumber=2;
  public int publicNumber=3;
  int defaultNumber=4;
 
}
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test;
import test1.*;
public class test10 {
 
  public static void main(String[] args) {
         C c = new C();
    //System.out.println(c.protectedNumber); protectedNember這個變數,此時為private的,因此會compile-error
  }
}
class C extends A {
 
  public C() {
    System.out.println(protectedNumber);
  }
 
}
 

SCJP專業認證手冊Chapter1上有提到:
在套件之外的子類別繼承了protected 成員,這個成員對其他在子類別之外的類別而言就是private的,但不包含這個子類別的子類別們.


jamestian edited on 2008-07-31 13:57
reply to postreply to post
作者 Re:protected的疑問... [Re:rfus]
jamestian





發文: 250
積分: 0
於 2008-07-31 14:19 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
rfus wrote:
我第一眼看就不覺得它應該可以讀取它...
k(a e)是傳入a
b extends a 並不代表他可以new a 來使用a 的protected值吧
protected不是這樣用滴....

可是我很好奇,既然已經傳入了參考到一個物件的變數e.為何變數e不能來使用protected值?
是因為怕別的類別利用.點算子來改變protected member的值?因此必須要用a這個類別提供的public method才可存取protected member.


reply to postreply to post
» 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