2015-10-18 13 views
5

Core Java、Volume I - Fundamentals(第8版)>第5章:継承> 'Protected Access'セクション(195ページ)から次のことを学びました。あなたは、のみ、または、あまり一般的に サブクラスにメソッドを制限するために、サブクラスのメソッドがスーパークラス フィールドへのアクセスを許可したい場合サブクラスのオブジェクトは、別のサブクラスの別のオブジェクトの保護されたフィールドにアクセスできますか?

は、しかし、時間があります。その場合、クラスフィーチャーは として保護されていると宣言します。たとえば、スーパークラスEmployeeがプライベートではなく保護された hireDayフィールドを宣言している場合、マネージャの メソッドはそれを直接アクセスできます。

ただし、Managerクラスのメソッドは、マネージャオブジェクトのhireDayフィールド 内で、他のEmployeeオブジェクトでは参照できません。この は、保護されたフィールドにアクセスするために、保護されたメカニズム とフォームサブクラスを乱用できないように制限されています。

私はそれをテストするために次のコードを書いています。

class Employee 
{ 
    protected String name; 

    public Employee(String name) { 
     this.name = name; 
    } 
} 

class Manager extends Employee 
{ 
    public Manager(String name) { 
     super(name); 
    } 

    public void peekName(Employee e) { 
     System.out.println("name: " + e.name); 
    } 
} 

class Executive extends Employee 
{ 
    public Executive(String name) { 
     super(name); 
    } 
} 

public class TestProtectedAccess 
{ 
    public static void main(String[] args) { 
     Employee e = new Employee("Alice Employee"); 
     Manager m = new Manager("Bob Manager"); 
     Executive ex = new Executive("Charles Executive"); 

     // Manager object accessing protected name of Employee object 
     m.peekName(e); 

     // Manager object accessing protected name of Executive object 
     m.peekName(ex); 
    } 
} 

コードの出力は次のとおり

$ java TestProtectedAccess 
name: Alice Employee 
name: Charles Executive 

マネージャオブジェクトmが他の従業員のnameeexオブジェクト保護フィールドにアクセスすることができます。これは私が本から引用したもの、特に私が太字で強調した部分と矛盾しているようです。

本が間違っているか間違っていると誰かが私に説明することはできますか?私の理解が間違っている場合は、その本の意味を理解するためのより良い例を提案できますか?

答えて

2

あなたのクラスはすべて同じパッケージになっているので、protectedはpublicと同じです。

保護修飾子はメンバーのみ 別のパッケージ内のそのクラスのサブクラスによって、加えて、(パッケージプライベートのように)それ自身のパッケージ内 にアクセスすることができることを指定します。

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

はいあなたは間違いなくそれを行うことができます。 –

関連する問題