2011-05-08 105 views
2

Iam爲SCJP做準備,同時我也知道受保護的成員範圍在包中以及其他包中,只有在繼承時纔有可能。受保護成員的範圍

例如: 我有三個類作爲父類Childclass Friendclass

package x.parent; 

class Parentclass{ 
protected int x=10; 
    ............... 
    } 

package x.child; 

class Childlass extends Parentclass{ 
    super.x=20; 
    ............... 
} 

package x.child; 

import x.parent.Parentclass; 

class Friendclass{ 
Parentclass pc = new Parentclass(); 
pc.x=30; 
    ............... 
} 

請告訴我背後的原因,在Friendclass會員X將不會接受一個值分配給,表現爲私有成員不Childclass的情況。

+0

Childclass中的賦值'x = 20'也應該失敗,因爲它在另一個包中,並且成員'x'不是受保護的,但是具有默認訪問權限。 – 2011-05-08 07:10:15

+0

抱歉,我的身邊也有錯誤。已更正 – developer 2011-05-08 07:15:15

回答

1

因爲x有默認的可見性(不受保護),您甚至不能訪問Parentclass.xChildclass。見http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

編輯:

x.child.Friendclass不是在同一個包x.parent.Parentclassx.child.Friendclass不從x.parent.Parentclass繼承

as TotalFrickinRockstarFromMars的摘要狀態和Java訪問控制文檔也聲明,這意味着Friendclass不允許訪問字段x

+0

我昨天編輯了這個問題,請你可以檢查一次 – developer 2011-05-09 05:42:27

+0

回答也編輯過,以反映你的改變。我希望現在是完全清楚的。 – 2011-05-09 14:14:11

10

有四個訪問修飾符

private - just this class 
no modifier - just this class or this package (NOT subclass) 
protected - just this class, this package, or subclass 
public - everyone and their cousin 

因爲它使用默認的改性劑,它可以訪問,如果下列條件之一爲真:

  1. 是類本身的一部分(沒了!)
  2. 是包裝類本身的一部分(沒了!)

所以它失敗的C riteria,所以你不能訪問。

+0

您錯了,可以通過在另一個包中使用繼承來訪問受保護的成員 – developer 2011-05-08 06:58:28

+0

「protected」和「no modifier」的翻轉定義,不是? – 2011-05-08 06:58:45

+0

@Damodar,zerocrates - 是的,我翻轉了他們。固定。 – corsiKa 2011-05-08 07:01:58