看到书上说:类的protected成员可以被其他包中该类的子类所访问
可是经过试验,发现不能访问,费解啊!
下面是代码
//------包p1中的类apackage p1;
public class a
{
protected int age=20;
public static void main(String []args)
{

}
}//------包p2中的类ason2,是p1.a的子类
package p2;
public class ason2 extends p1.a
{
public static void main(String []args)
{
p1.a a1=new p1.a();
System.out.println(a1.age);//这里编译出错说访问不了 }
}

解决方案 »

  1.   

    其实age已经被ason2继承过来了!
    完全可以用new ason2().age进行调用和赋值!再一点,要注意:编码规范啊!
      

  2.   

    类的protected成员可以被其他包中该类的子类所访问 
    意思是说
     p2继承了p1  在你创建了一个p2的对象时 其实也创建了一个它的父类的对象,也就是p1.
                p2的对象拥有权限访问它的父类的对象里的属性age 
    而你上面这么写   除非你能  让编译器知道   你new 出来的对象是p2的父类    也就是super = new p1();  
    可是这么做好象语法上过不了  也不允许这么做
      

  3.   

    类的protected成员可以被其他包中该类的子类所访问 这是正确的,是你举的这个例子有点问题的
    package liang;
    public class Base { // 父类Base
    protected int i = 1;} package gao;public class Descend extends liang.Base { // 子类Descend

    public void printInt(){
    System.out.println(i);
    }
    public static void main(String[] arg) {
    Descend b = new Descend();
    b.printInt();
    }
    }
    打印结果是1的,说明类的protected成员可以被其他包中该类的子类所访问。p1.a a1=new p1.a(); 
    System.out.println(a1.age);//这里编译出错说访问不了 } 

    至于你那个编译错误是因为a这个类是在别的包中,age这个属性又是protected的,在p2这包中是没法访问的,只有public的才可以在包外访问,你 这一句 p1.a a1=new p1.a(); 与继承没有啥关系的类的protected成员可以被其他包中该类的子类所访问 说的不是生成对象之后还能调用其属性,是在类的代码中可以使用!说的可能不是很明白
      

  4.   

    protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性
      

  5.   

    不同包中的子类虽然继承了protected成员,但只能在该类中访问,不能由它的对象来调用,这里已经超出了protected可以访问的范围了!
      

  6.   

    类的protected成员可以被其他包中该类的子类所访问 这是正确的,是你举的这个例子有点问题的 
    package liang; 
    public class Base { // 父类Base 
    protected int i = 1; } package gao; public class Descend extends liang.Base { // 子类Descend public void printInt(){ 
    System.out.println(i); 

    public static void main(String[] arg) { 
    Descend b = new Descend(); 
    b.printInt(); 


    打印结果是1的,说明类的protected成员可以被其他包中该类的子类所访问。 p1.a a1=new p1.a(); 
    System.out.println(a1.age);//这里编译出错说访问不了 } 因为a这个类是在别的包中,age这个属性又是protected的,在p2这包中是没法访问的,只有public的才可以在包外访问,
    这一句 p1.a a1=new p1.a(); 体现不出继承的关系,只能体现出两个普通的类,一个类中通过new出另一个类的实例来调用该类的属性和方法。
    类的protected成员可以被其他包中该类的子类所访问
    说的是protected的最大访问底线
    意思是:在子类的代码中,可以通过子类的对象直接使用父类中的protected修饰的属性和protected修饰的方法。当然,权限范围高于protected的public修饰的属性和方法亦可以被子类对象直接使用! 
    而不是如LZ理解的:在子类中,通过new出父类的对象,再调用自身的protected属性。这样,由于此属性在父类中被protected修饰,此时跨包由父类自身对象使用,是访问不到的,即不可见的。编译自然也就通不过了。
    继承关系的体现,是子类将父类中的属性和方法都继承过来,只需在本子类中通过对象调用即可。当然如果父类中的属性为static修饰,子类使用是连new对象也省了。
    o(∩_∩)o...
    我的一点理解,但愿说明白了
      

  7.   

    上面的基本说到位了。。我总结一下吧protected 可以供 子类同一个包的类、其本身 访问在p2中 p1.a a1=new p1.a(); 实际是实例化了一个 p1.a 的对象,它不能访问包p1中的protectedp2.ason2 才是 p1.a的子类,可以通过 new p2.ason2().age 来访问
      

  8.   

    protected 可以供 子类、同一个包的类、其本身 访问 
      

  9.   

    //------包p1中的类apackage p1; 
    public class a 

    protected int age=20; 
    public static void main(String []args) 
    { } 
    } //------包p2中的类ason2,是p1.a的子类 
    package p2; 
    public class ason2 extends p1.a 

    public static void main(String []args) 

    p1.a a1=new p1.a(); //这里你可以上转型p1.a a1=new p2.a()
    System.out.println(a1.age);//这里编译出错说访问不了 } 
    }这样就可以直接调用了!
      

  10.   

    在main 是当然是不行的。 作用域在类里, 上面说的都很清楚了。
      

  11.   

    这样也不能访问的.
    只能子类的引用指向子类对象,可以访问该父类中的protected成员
      

  12.   

    protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性
    正解5楼!LZ别混淆概念