受Java保护的访问修饰符

时间:2013-05-26 20:32:26

标签: java inheritance protected

我有这些课程:

package abc;

public class A {

    public int publicInt;
    private int privateInt;
    protected int protectedInt;
    int defaultInt;

    public void test() {
        publicInt = 0;
        privateInt = 0;
        protectedInt = 0;
        defaultInt = 0;
    }

}

“A”包含所有四个访问修饰符的属性。这些其他类扩展“A”或创建实例并尝试访问属性。

package de;

public class D {

    public void test() {
        E e = new E();
        e.publicInt = 0;
        e.privateInt = 0; // error, cannot access
        e.protectedInt = 0; // error, cannot access
        e.defaultInt = 0; // error, cannot access
    }

}

package de;

import abc.A;

public class E extends A {

    public void test() {
        publicInt = 0;
        privateInt = 0; // error, cannot access
        protectedInt = 0; // ok
        defaultInt = 0; // error, cannot access
    }

}

package abc;

import de.E;

public class C {

    public void test() {
        E e = new E();
        e.publicInt = 0;
        e.privateInt = 0; // error, cannot access
        e.protectedInt = 0; // ok, but why?
        e.defaultInt = 0; // error, cannot access
    }

}

一切都很好,除了我不明白,为什么在C级,我可以访问e.protectedInt。

3 个答案:

答案 0 :(得分:1)

由于CA(包abc)位于同一个包中,因此Java中的protected修饰符包含同一包中的访问权限。

答案 1 :(得分:1)

我认为代码插图有助于更好地理解。

在E类中添加受保护的成员

public class E extends A {
    protected int protectedIntE;
    ...

现在,尝试在C类中访问它

e.protectedInt = 0; // ok, but why?
e.protectedIntE = 0; // error, exactly as you expected

所以,这里要注意的是,虽然你通过protectedInt的实例访问E它实际上属于A类,并且只是通过继承由E类继承。 E类的实际(非继承)受保护成员仍然无法像您预期的那样访问。

现在,由于A类和C类在同一个包中,受保护的访问基本上可以作为包的超集(通过包括子类访问),编译器也没有什么可抱怨的。

答案 2 :(得分:0)

Acces Control

按照链接,进入java文档,解释修饰符accessibalities。

对于当前的类,包和子包,

protected类,函数等是可见的。在类的子类中也可见。