子类能调用父类的protect方法
protect类是受到保护的,并且protect类的子女因为继承受到保护的的关系也是受到保护的,所以protected的意义在于允许派生类访问基类的成员,而基类的包中的其他类也是可以访问的

解决方案 »

  1.   

    haha,我是看到你另一个问题,然后去看TIJ的,没想到你又开了个帖子。其实这里的噱头就在于变量的声明:
    5. SuperclassX objX = new SubclassY();
    6. SubclassY objY = new SubclassY();于是在
    9. objY.superclassMethodX();
    这里是调用一个SubclassY对象继承来的protected方法,由于即使不是在一个包里,只要有继承关系,子类就可以调用父类的protected方法,所以这里就没有问题而在
    11. i = objX.superclassVarX;
    这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了。如果把声明改成
    5. SubclassY  objX = new SubclassY();
    6. SuperclassX objY = new SubclassY();
    那么报错就应该在第9行而不是第11行了。关于protected的访问范围,看上面hpy121(孩子)
      

  2.   

    如下改后应该没有问题!
    protect方法只能在同一个包内调用!//父类
    package packageX;public class SuperclassX
    {
            protected void superclassMethodX()
            {
            }
            protected int superclassVarX;
    }//子类  
    1. package packageX;
    2. // import packageX.*;
    3. public class SubclassY extends SuperclassX
    4. {
    5. SuperclassX objX = new SubclassY();
    6. SubclassY objY = new SubclassY();
    7. void subclassMethodY()
    8. {
    9. objY.superclassMethodX();
    10. int i;
    11. i = objX.superclassVarX;
    12. }
    13. }
      

  3.   

    to :mor(安稼) 而在
    11. i = objX.superclassVarX;
    这里objX是一个SuperclassX的句柄,所以调用protected时,就不行了,这是调用另一个包里的protected了==============================================objX是一个SuperclassX的句柄  这话不懂, 怎么讲的??
      

  4.   

    在类A实例化了另一个包里的类B,并且调用了这个类B里的非public成员会编译错
      

  5.   

    to : xyxu1982(云娜) 但类A 是 B类的子类啊.....
    例如: objX  到底是一个什么身份啊????( SuperclassX objX = new SubclassY(); )
      

  6.   

    to 回复人: xyxu1982(云娜) 
    不是吧   , A如果是B的子类 不在同一个包里的话 如果有继承关系的话 ,是可以访问protect的啊??
      

  7.   


    protected 对继承者是开放的,不管在不在一个包里。
    如果同一个包下,protected=firendly.
      

  8.   

    是这样的:类A继承类B,这两个类在不同的包中,那么在类B中自然继承了类A的protected方法,但是使用时,你声明的是类B的对象,既然不在同一包中,你有什么权力使用类B的protected方法,而你又声明了一个类A的对象,该对象与类A在同一包中,当然有权力使用类A的protected方法。不知道说明白没?
      

  9.   

    objX是一个SuperclassX的句柄  这话不懂, 怎么讲的??
    指的是,objX是SuperclassX声明的变量,但是它指向SubclassY。
      

  10.   

    用'引用'这个词更好一点,就像C里的指针概念一样
    父类里被声明为protected的实例方法,子类是可以访问到的
      

  11.   

    sorry,说错了。
    fireflyqt(孤独萤火虫)说的是对的:
    类A继承类B,这两个类在不同的包中,那么在类A中自然继承了类B的protected方法,但是使用时,你声明的是类B的对象,既然不在同一包中,你有什么权力使用类B的protected方法,而你又声明了一个类A的对象,该对象与类A在同一包中,当然有权力使用类A的protected方法。
      

  12.   

    子类使用父类的的protected变量 有两种:
    1.子类继承了父类,就自然会拥有父类的各种方法和变量(private除外)
    2.通过super来访问。楼主通过实例父类来使用父类的方法和变量是绝对不可以的,这样做没有利用它们的父子关系,所以是不行的
      

  13.   

    5. SuperclassX objX = new SubclassY();11. i = objX.superclassVarX;========================
    哦  也就是说 objX 是 SuperclassX 声明的对象, 所以没有权利使用 SuperclassX 的protected方法,, 是不是这个意思啊???谢谢大家........... 我结贴了
      

  14.   

    刚才看这个例子,一头雾水,因为跟我原来的理解相差太大。
    1、protected 的方法和变量,在子类都可以正常访问的,但我认为不等同于
       objY.superclassMethodX(); 而是说在子类里可以用 this.superclassMethodX(); 这样的语句(如果用 private 就不可能的)来访问父类的方法,变量也是一样的。所以我就用了这些代码测试,是无法成功运行的(去掉 11 行可以编译通过,但是不能运行,错误信息: java.lang.StackOverflowError)。
       调用一个对象的方法时,调用程序就是外部的啦,所以肯定调用不到 protected 方法、变量的,除了在自己的类定义体里,所以 9 行可以编译通过。
    2、SuperclassX objX = new SubclassY(); 实际创建出来的还是一个 SubclassY 的实例,只是你用了他的父类变量 objX 去指向而已(所有的实例都可以用 Object 的变量去指向),这时如果你想访问这个实例的 subclassMethodY 方法,只要做类型转换就可以了。
      

  15.   

    第一问:protected的含义就是可以被本包内的类和子类(在不在包内没关系)调用。
    第二问:我同意楼上的意见。
      

  16.   

    1.楼主理解没有错,对于不同包中对于非子类的可见的只有PUBLIC成员,对于不同包中对于子类可见有protected成员和PUBLIC成员,同一个包中无论是否是子类都只有PRIVATE不可见,其他3类成员都可见.
    2. 关于第二问,zhengcg(楚楚) 解释得好,我就不班门弄负了.
      

  17.   

    子类继承了父类的protected变量,
    可以用子类的实例来访问继承的变量,
    也可用父类的实例来访问父类的同一变量