package z;
public class M {
protected void f() { }
}
package zz;
import z.M;
public class N extends M{
public static void main(String[] args) {
new N().f();//为什么这个地方可以访问 
}
}
package zz;
import z.M;
public class R{
public static void main(String[] args) {
new N().f();//为什么这个地方不可以访问,编译没有通过。  
}
}

解决方案 »

  1.   

    protected:子类可以访问,同一个package中可以访问
      

  2.   


    f()是在z.N类中声明的,所有说法都是相对于z这个包来说的
      

  3.   

    Protected是受保护的   只有它的子类可以访问   所以你那个R类无法访问
    你可以把Protected换在public就可访问。。
      

  4.   

    你说的,我都懂,但还是不能让我彻底理解上面的代码。
    我再加一句你看看:
    package zz;
    import z.M;
    public class N extends M{
    public static void main(String[] args) {
    new N().f();//为什么这个地方可以访问 
    new M().f();//编译不能通过,因为在不同的包里子类可以继承父类的东西但不能访问。
    }
    }
      

  5.   

    to wgg171781314: package zz;
    import z.M;
    public class R extends N{//已经改为继承
    public static void main(String[] args) {
    new N().f();//编译还是没通过。  
    }
    }
      

  6.   

    你那的原因好像是:
       你调用的是父类的方法,当在子类调用父类的方法时   直接用super.f()  就出来了   只限在当前的方法中而不是在main函数中
      再说回去  那不是继承的问题  是仿问修饰符的问题
      

  7.   


    package com.pyh.demo1; //注意这个包的路径,demo1
    public class M {
    protected void foo() { //protected访问权限,同包,子类可以访问
    System.out.println("M:-->foo");
    }
    }package com.pyh.demo2; //此包与父类不同包,demo2
    import com.pyh.demo1.M; //引入父类的包
    public class N extends M { //继承父类
    public static void main(String[] args) {
    new N().foo(); //父类的foo()是protected访问权限,允许同包和子类访问,这里不会报错
    }
    }
    package com.pyh.demo1; //注意此包,与M类是同包
    import com.pyh.demo2.N;
    public class R {
    public static void main(String[] args) {
    new N().foo(); //所以这里也不会报错
    }
    }
    package com.pyh.demo2; //此包与M类不同包
    public class R {
    public static void main(String[] args) {
    new N().foo(); //所以这里会报错,找不到方法
    }
    }
    希望你能看的懂。
      

  8.   

    TO   wgg171781314 :我知道用super.f()就没有问题。
    protected是继承访问权限修饰符,我不懂你说的“那不是继承问题 是访问修饰符的问题”
    我对protected的理解:在不同的包里,子类可以继承父类的东西,但是不能访问父对象的东西。举例:
    package z;
    public class M {
    protected void f() { }
    }package zz;
    import z.M;
    public class N extends M{
    public void nf(){
    f();//这是继承过来的方法,编译通过
    new M().f();//这是访问父类对象的方法,不能访问,编译错误
    }
    }
    ----------------------------------------------------------------------------------
    实际上虚线上面的我都是懂的,但是我开始提出的那个问题,我自己不太懂。我可能我自己说的不太清楚。
      

  9.   

    TO diypyh:
    最后一个代码片段中,如果R继承了N,为什么还是会报错呢? 
      

  10.   

    protected的访问权限是同一个包中的类或者子类。
    真正的含义是:
    1. 同包中的类可以构造该类或者该类的子类,然后用构造出的实例调用protected方法。
    2. 子类可以构造自己的实例,并通过实例调用protected方法。
      

  11.   

    楼主参考一下:
    http://www.cnblogs.com/AllenChen/archive/2010/06/30/1768218.html
      

  12.   

    to nmyangym:
    实际上我提出的这个问题正是由这个clone()这个方法引出来的,在学clone的时候才发现前面的知识点没掌握好,我认真看看。感谢所有回答我问题的朋友们。
      

  13.   

    protected权限只限与同一包中,或有继承关系的类中,子类即使不在同一包中也可以访问。楼主注意与default权限区分,default权限只限于本包中,子类不在同一包中就不能访问。