根本没有什么有趣的,protected的用处就是子类可以访问,但是其它package的类是不可以访问的!你的ChildClass处于的packate和ParentClass 不同,所以是不能进行访问的这个是Java的规范!!!!!

解决方案 »

  1.   

    to 楼上的楼上:凶归凶, 不过你好像说的不准确哦!"protected的用处就是子类可以访问,但是其它package的类是不可以访问的!" 
    "你的ChildClass处于的packate和ParentClass 不同,所以是不能进行访问的"子类如果位于其它包里也是可以访问protected成员的, 所以上面ChildClass是可以访问aMethod()方法的, 倒是创建这个方法的ParentClass本身不能访问.
      

  2.   

    这个例子对加深protected的理解还是很有意义的。
      

  3.   

    回复人: liuchunjp() :
    对,只要是子类,跟在不在同一个包里无关
    ------------------------------------------------------------这点是显而易见的, 我主要不是说明这一点.我说的是, 在另一个包里, 继承自父类的子类可以访问protected成员, 而父类本身(它最初创建了这个protected成员)都不能再访问protected成员了.
      

  4.   

    为什么你会说“父类本身(它最初创建了这个protected成员)都不能再访问protected成员了.”当然不对
    你在ChildClass 不能使用
    new ParentClass().aMethod();  是因为你已经在包的外面了,所以ChildClass已经不能访问这个方法了(就是指你不可以在ChildClass的代码中调用到这个方法),父类当然还是可以调用aMethod
      

  5.   

    回复人: ChDw(米) ( ) 信誉:155 说的很对,protected ,主要目的就是给子类继承用的
      

  6.   

    ParentClass p = new Childclass();
    p.aMethod();
    --------------------
    这样也不行啊, 为什么
      

  7.   

    to ChDw(米):不太明白你的意思。protected权限大于default权限,子类在包外是可以访问父类的protected成员的。注意main()方法中,ChildClass的实例可以访问aMethod(),而ParentClass的实例不可以。
      

  8.   

    protected的意思应该是子类可以继承,但是除了可以继承以外其他应该和private一样。
    所以new ChildClass().aMethod();访问的不是父类ParentClass的aMethod()方法,而是访问的他自己继承过来的aMethod()方法。至于为什么ParentClass()自己为什么不能访问就应该很明白了吧,因为aMethod()方法是private的啊 ^_^
      

  9.   

    1:protected可以继承,但是除了可以继承以外其他应该和private一样,因为调用new ChildClass().aMethod()的main方法在ChildClass类内,所以可以调用,如果main在ChildClass类外应该是不可以使用的。2:new ParentClass().aMethod(); 不能调用的原因是不在同一个包里面,如果能够调用那么和public就差不多了。
      

  10.   

    protected是在子类方法中可以调用,但是并不是说在一个静态方法中也可以调用在子类当中,如果存在一个方法c,它是可以调用父类的方法a的!
    public void c() {
    a();
    super.a();
    }但是在子类的静态方法当中,由于这个方法根本不在继承关系当中,所以它是无法按照继承关系来判断方法是否可以调用,所以在你的例子当中是无法编译通过的!
      

  11.   

    我赞同楼上的观点,原因不在于子类方法,而在于main方法的静态属性。
      

  12.   

    To 回复人: angues1980(石头心)  
       回复人: esunboy(天使联盟)protected权限大于default权限, 怎么会和private一样? To 回复人: ChDw(米) 
    我敢肯定与是否静态方法无关, 而是与是否创建ParentClass的实例有关, 在方法c中:public void c() {
    a();
    super.a();
    }这样是可以的, 但是如果换成:public void c() {
    a();
    new ParentClass().a();
    }
    就不行了!
      

  13.   

    没测试过代码,我的想法:
    protected 在所属类的定义中是可以访问,代码中main方法在子类的类定义内部,所以是可以访问该Protected方法的,但是这行代码:
    new ParentClass().aMethod(),首先他会建立一个ParentClass类的对象实例,对象实例是不可以访问Protected方法的。但你会反问new ChildClass().aMethod()也是用实例访问该方法啊?原因是它调用的是ChildClass的Protected方法,而这行调用代码又在ChildClass类定义的内部。前一行代码new ParentClass().aMethod()不行是因为他调用的是ParentClass类的方法,而这行调用代码并不在ParentClass类定义的内部。
      

  14.   

    可能我说得不清楚只有子类才能访问到父类的方法,这个父类并不是指所有的父类对象,
    这个父类仅仅指这个子类目前所继承的父类中的对象方法和属性!所以你再初始化一个Parent就已经不可以了
      

  15.   

    晕,越来越说不清了
    简单点,protected只对继承的子类和包内的类是可见的
    明显的,
    package p2;
    import p1.ParentClass;
    public class ChildClass extends ParentClass {
        public static void main(String[] args) {
            new ChildClass().aMethod();
            //new ParentClass().aMethod();  //!不能调用
        }
    }
    这里的new ParentClass()已经是p1的外部了,当然不能使用aMethod(),难道不是这样?
      

  16.   

    大家再思考一下下面的代码:// p1\ParentClass.java
    package p1;
    public class ParentClass {
        protected void aMethod() { }
    }// p2\ChildClass.java
    package p2;
    import p1.ParentClass;
    public class ChildClass extends ParentClass {
        void anotherMethod() { aMethod(); }
    }// p2\TestClass.java
    package p2;
    import p1.ParentClass;
    public class TestClass {
        public static void main(String[] args) {
            //new ChildClass().aMethod();  //!不能调用
            //new ParentClass().aMethod();  //!不能调用
            new ChildClass().anotherMethod(); //只有这样才可以
        }
    }有一个结论是非常明显的: aMethod()在ChildClass类内部直接调用是可以的, 因为它继承自ParentClass, 这点很容易理解.令人不解的是: 在ChildClass类的内部, new ChildClass().aMethod()这种方式可以调用, 但是new ParentClass().aMethod()却不可以.
      

  17.   

    是啊,正是不能调用!
    因为new ParentClass()这个对象已经在包p1的外部了,而protected只对包内和子类可见,难道不是这样吗??
    package p2;
    import p1.ParentClass;
    public class TestClass {
        public static void main(String[] args) {
            //new ChildClass().aMethod();  /**不能调用,在继承过程中降低了访问权限,private当 然不能访问*/
            //new ParentClass().aMethod();  //!不能调用,已经在包外了
            new ChildClass().anotherMethod(); //只有这样才可以
        }
    }
      

  18.   

    To 回复人: killme2008(Java-Dog)我的疑问不在上面这个例子中, 上面的例子是用来和第一个例子做对比的.咳! 其实我根本就没有疑问, 我只是想说这是一个有趣的现象. 我的结论是:在与父类所在包不同的包中的子类中, 可以直接访问父类中的protected成员, 也可以通过创建父类的任何一个子类(包括它自已)的实例来访问protected成员, 但是不能通过创建父类本身的实例来访问protected成员. 这是符合的我最初的题意的.也就是说, 在包的外部, 父类把protected成员的访问权限给了它的子类们, 连通过自己来访问protected成员的权利都没有了. 仔细想一想, 难道不是一个有趣的现象么?
      

  19.   

    我觉得怎么老是强调"通过自己来访问protected成员的权利都没有"其实并不是通过自己没有,而根本是因为那个代码不在同一个包中,所以不在继承关系下的访问方式是不被允许的,这个是JVM的规范!
      

  20.   

    “也就是说, 在包的外部, 父类把protected成员的访问权限给了它的子类们, 连通过自己来访问protected成员的权利都没有了. 仔细想一想, 难道不是一个有趣的现象么?”
    ---------------------------------
    我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):
    类  《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。
      

  21.   

    小方说得对!!!!
    ///////////////////////quote:
    我想楼主对这两个概念有点混淆(或者楼主没有描述清楚):
    类  《=》 对象类的对象只能访问类的public成员,而只有类定义中才可以访问private,子类的定义中或同一包中的非子类代码可以访问protected,public成员。而 new ParentClass().aMethod()是用对象访问protected方法,所以是不行的。这个不是“权限”的问题,而是“可见性”问题,这是jvm的规范。