有这么一个表,相信大家都看过,但其中有些东西,我没有理解,现请教各位
  这四个修饰符的访问权限如下表:   
  -----------------------------------------------   
                 类内部     package内       子类         其他   
  public          允许         允许          允许         允许   
  protected       允许         允许          允许         不允许   
  default         允许         允许          不允许       不允许   
  private         允许         不允许        不允许       不允许   
  -----------------------------------------------  1)package内是否允许使用,是不是就是说这个类的某个对象,以 “对象名.该属性” 这种形式是否合法?
2)子类允许不允许,我有点搞不清,是说子类的内部方法可以调用该属性,还是说子类的对象可以直接引用该属性?
比如说有一个类class1,其中有一个protected 属性 cp,如果class1有一个子类class2.根据上表,是允许的,我知道class2中的方法可以直接引用cp这个属性,但我不清楚class2的一个对象,是否可以直接引用cp? 

解决方案 »

  1.   

    1) package内是否允许使用的意思是引用与这个类的位置是否和这个类在同一个包内。不明白你说的是什么意思。
    2)protected是专门用作子类的,他也是包访问级别的,就是说如果有一个方法或变量我不想定义为public的,但是又想被overidden,
    而这个子类又不和父类在同一个包下。3)建议楼主把类和对象的区别搞清楚。
      

  2.   

    1) package内是否允许使用,指的是同一个包内的其它类是否能够直接引用该类的属性或者方法。
    2) 子类是否允许访问,指的是子类的方法是否允许访问父类的这个属性或者方法。
      

  3.   

    1.package内是指要在同一个包内才可以像你那样使用,要是在不同的包内是不可以的
    2.可以,子类可见就是该属性相当于子类的一个属性。所以子类的实例使用自己的属性是没有问题的。
      

  4.   

    四楼说的子类可见是不是就是说该属性对于子类来说是可以当做public的属性?所以子类的对象就可以直接来引用该属性了?
      

  5.   

    class2的一个对象,是否可以直接引用cp? 如果他们都在同一个包里面是可以的,否则不可
      

  6.   

    对于protected权限可能很多人都不是十分明白, 这里我来解释一下.主要分同包和不同包两种情况
    [1]同包时: 此时他和public是等效的, 无论继承于否. 只是使用了继承时, 子类可以直接引用, 而不必使用实例
    public class A {
        protected int n;
    }
    public class B extends A {  //同包子类
        public void dis(){
            A a = new A();
    a.n = 10;
    B b = new B();
    b.n = 20;
    //三种调用都可以, 只是a.n是dis()中A对象的n, b.n是dis()中B对象的n, 最后直接调用n是this.n, 也就是调用这个方法的B对象的n
    System.out.println(a.n + b.n + n); //10 + 20 + this.n
        }
    }
    public class C {  //同包其他类
        public void dis(){
            A a = new A();
    B b = new B();
    System.out.println(a.n + b.n);  //必须创建实例才能访问
        }
    }[2]不同包时: (沿用[1]中的类A)
    import xxx.A;  //先导入另一个包中的Apublic class AA extends A {  //不同包子类
        public void dis(){
            A a = new A();
            B b = new B();
    //System.out.println(a.n + b.n); 不可以, 原因就是他们的n都在xxx.A空间中, 而不是子类AA中, 这里也就是直接访问另一空间, 即不是同空间也不是子类.

    AA aa = new AA();
    System.out.println(aa.n + n);  //可以, aa.n的n是在AA类空间中, 而此方法就在AA中, 空间相同, 所以aa.n可以, n就是this.n同理
        }
    }
    //继承B时的原理一样, 就是判断protected对象到底是否在同一个包空间中或子类中.
    imort xxx.*;public class CC {  //不同包其他类
        public void dis(){
            A a = new A();
    B b = new B();
    AA aa = new AA();
    //System.out.println(a.n + b.n + aa.n);  //都不可以
    //a.n, b.n同AA中的解释, 这里的aa.n为什么不行还是空间问题,aa.n中的n是在A空间而不是AA空间,AA能访问n是因为继承
    //protected说的就是同一个包空间和子类中能访问.
        }    
    }
    //时间关系就简单说了一下,希望对大家有帮助
      

  7.   

    合法
    protected你NEW一个子类对象,然后就可以用子类对象调用父类的属性