Teacher继承Person类,在不同的包中,t可以调用name,但是为什么p不能调用name呢?
有人解释,p所属的类Person和Person类不是继承关系,所以不能访问我觉得解释的很勉强。
然后就有了下面的情况,变量 t 所属的类Teacher是Person的子类,t 应该也可以访问name字段,
这样验证了这个解释貌似是错的。
有没有哪位大神或者基础特别扎实的来解下惑。。

解决方案 »

  1.   

    这个问题在《java程序设计语言》中有专门的一节讨论protected的准确含义。
    protected:除了可被类自身及与其在同一个包中的代码访问外,还可以在一个类中通过对象引用来访问,前提是这些对象引用至少应该具有与该成员所在的类相同的类型,也即是这些引用具有该成员所在类的类型或是其一子类型。这就是说包外的类访问父类的protected成员时,如果是通过创建对象引用来访问(直接用super不算),那么该引用只能是这个包外类的类型或是其子类型才行。所以在第一个程序里因为teacher类在包外,而且p是Person类型不是它所在类Teacher类的类型或其子类型,不能访问。在第二个程序里,在Student类里,有引用p为Person类型,t为Teacher类型,它们都不是Student类型或其子类型,所以不能访问。
      

  2.   

    不知道问什么既然贴源代码还要打什么马赛克。
    你打得马赛克挡住了关键的部分,两个类没在同一个包下,protected修饰的允许同一包下的访问。
      

  3.   

    protected:本包+继承类
    default:本包
      

  4.   

    首先,你不需要用p.name 来获取父类的p 的值,因为子类的p就是父类的p。
    其次,父类声明他的namei属性是protected,只有在同包或者子类不同包的情况下才可以调用到,显然Person 不可以继承自己,又在不同的包里,就没有能力看到name属性了
      

  5.   

    看看第二个程序,Student子类在不同的包吧,为什么它不能用子类Teacher的引用访问呢?
      

  6.   

    看看第二个程序,Student子类在不同的包吧,为什么它不能用子类Teacher的引用访问呢?Teacher 类在继承了Person 类之后,name 都是protected。 所以你在另一个包里创建了Student类,只是创建了Teacher类的实例,当然就看不到Teacher类里面的name属性啦. 在Student类里面看到的name属性是Person的。
      

  7.   

    Private: 只有在同一个类的定义里可见
    默认: 只有在同一个包里可见
    Protected: 在同一个包里可见或者是在不同包里的子类可见
    public: 在任何包里都可见