关于protected我在一本书上看见说:“允许子类通过对象引用访问受保护的成员,但是此对象引用的类型必须与这个类或其子类相同。”
对象引用的类型和类或子类相同,这句怎么理解~?
另一本书上说:“只有在同一个package下的类才能访问这些成员,如果在不用package中可以产生对象或是继承后访问类成员和直接使用父类的成员。”
例子:package package1;public class A
{
protected int p1;

protected static void p2() {}
protected void p3() { }
}
package package1;public class B extends A
{
public B()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package1;public class C
{
public C()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}package package2;import package1.A;public class D extends A
{
public D()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
p1=1;
p2();
p3();
}
}
package package2;import package1.A;public class E
{
public E()
{
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();
}
}
变译B、C通过,D、E出错,D的"a.p1""a.p3"出错,但是D类的a不就是继承A类产生的吗~?

解决方案 »

  1. 还有P1和P3不是static的,为什么在子类B和D中还能直接调用呢~?
      

  2. 非静态的可以调用静态的,但是静态的方法不可以调用非静态的,
    变量及方法的访问权限:类型   同一个类中 同一个包中 不同包中的子类 不同包的中的非子类 private     Y          N            N                Nprotected   Y          Y            N                Npublic      Y          Y            Y                Nfriendly    Y          Y            Y                Y 
      

  3. public      Y          Y            Y                Nfriendly    Y          Y            Y                Y 
    这个好像不对吧!
      

  4. 包外子类引用可以访问父类的protected函数.但此时包外子类的父类实例引用只能访问父类的public方法,其他的
    protected,默认,都不能通过父类的实例引用访问的---这是为什么呢?解释如下:在子类和父类在不同的包时:子类实例引用可以访问父类的public和protected方法(这不正是Java中protected关键字的作用吗?);而此时如果包外生成父类的实例引用,那么这个父类的实例引用只能访问父类的public方法的.
      

  5. 同一个pacakge中和pacakge权限是一样的,
    不在同一个pacakge中区别就是子类是否可以访问这个从父类中继承的成员,注意是他继承的,换句话说,如果声明成protected的那么子类中就有这个成员,子类当然可以访问,因为这个成员就是他自己的,别管是声明的也好是从父类继承的也好。但你给的例子不是这个样子,D继承了A那么D的实例中就有p1这个成员但它没去访问这个成员。他试图访问A的实例中的d1,这样当然不行了。举个例子,老张有头发,这个属性是protected的,生了个儿子小张继承了他爹的属性也有头发,小张可以对自己的头发做任何事情,剃秃子也好,染黄毛也好,但是它没权利动他老爹的头发。
      

  6. wjs2338(Yesterday Once More)总结的很好,可是有点问题,估计是笔误。我做了一下修改,应该是这样:
    类型   同一个类中 同一个包中 不同包中的子类 不同包的中的非子类 private     Y          N            N                N
    friendly    Y          Y            N                N
    protected   Y          Y            Y                N
    public      Y          Y            Y                Y 从上到下权限逐渐增大。另外,说明一点:friendly在Java中也叫Default修饰符,具体写代码的时候就是在成员前不加任何权限修饰符。
      

  7. 晕,是我弄错了,楼上的对的,protected只有不同包中的非子类不能访问,public的权限最大
      

  8. 谢谢各位~~~copine() 的讲解非常生动~~~~
      

类似问题 »