1

I have these classes:

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" contains attributes of all four access modifiers. These other classes extend "A" or create instances and try to access attributes.

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
    }

}

Everything is ok, except I do not understand, why in class C, I can access e.protectedInt.

4

3 回答 3

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 类在同一个包中,并且受保护的访问基本上可以作为包的超集(也包括子类访问),编译器在这里没有什么可抱怨的。

于 2013-05-26T21:14:51.583 回答
1

因为CA(package abc)在同一个包protected中,Java 中的修饰符包括在同一个包内的访问。

于 2013-05-26T20:34:59.077 回答
0

访问控制

按照链接,您可以访问 java 文档,解释修饰符可访问性。

protected类、函数等对您当前的类、包和子包是可见的。在类的子类中也可见。

于 2013-05-26T21:10:40.447 回答