我正在试图了解这些修饰语的真正含义,因为我认为对于他们做什么或不做什么有很多困惑。 所以,这就是我所知道的:
使用了四个访问修饰符:
public
,protected
,private
,no modifier(package private)
。
1)关于其定义中的成员:无论访问修饰符是什么,类都可以访问它们中的每一个。
2)关于另一个类,它不会继承或共享相同的包:它只能访问标记为public
的成员。
3)相对于同一个包中的另一个类,但它不继承自:它只能访问标记为public
,protected
且拥有no modifier(package private)
的成员。
现在是棘手的部分(至少对我而言......)
4)如果A类继承自另一个B类,但不共享同一个包,则A具有B中声明为public
和protected
的所有成员(字段和方法)。
但就B的实例而言,A只能访问public
个成员(不是protected
或no modifier(package private)
成员,我是否正确?)。
5)如果A类继承自另一个B类,并且它们共享相同的包,则A具有声明为public
,protected
和no modifiers(package private)
的所有成员(字段和方法)在B(我是对的吗?)。
由于A和B位于同一个包中,因此A可以访问任何B实例的protected
,no modifier(package private)
成员(当然也包括public
个。)
此外,由于A是-a B成员将另一个类(例如,C)试图访问A的成员(当然其中一个实例,但让它保持简单)能够到达? ?
我知道C肯定能够访问public
个成员,但是案例4和5中的protected
或no modifier(package private)
成员呢?
(我将private
放在一边,因为这些成员只能在定义类中访问)
拜托,帮助!
这是在访问/继承方面发生的事情:
package one;
//class with all kind of modifiers
public class A {
protected void methodProtected(){}
public void methodPublic(){}
void methodDefault(){}
private void methodPrivate(){}
}
//same package,no inheritance
package one;
public class B {
{
new A().methodDefault();
new A().methodProtected();
new A().methodPublic();
}
}
//same package,inheritance
package one;
public class C extends A {
{
new A().methodDefault();
new A().methodProtected();
new A().methodPublic();
methodDefault();
methodProtected();
methodPublic();
}
}
//different package,inheritance
package two;
import one.A;
public class D extends A{
{
new A().methodPublic();
A a = new A();
//compiler error: can't access protected members
//a.methodProtected();
methodPublic();
methodProtected();
}
}
//different package,no inheritance
package two;
import one.*;
public class E {
{
new A().methodPublic();
}
}
现在,我想知道当E试图访问B,C或D时会发生什么, 如果E继承自A或其中一个类,或者是在同一个包中怎么办?多么糟糕......