看到书上说:类的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);//这里编译出错说访问不了 }
}
可是经过试验,发现不能访问,费解啊!
下面是代码
//------包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);//这里编译出错说访问不了 }
}
完全可以用new ason2().age进行调用和赋值!再一点,要注意:编码规范啊!
意思是说
p2继承了p1 在你创建了一个p2的对象时 其实也创建了一个它的父类的对象,也就是p1.
p2的对象拥有权限访问它的父类的对象里的属性age
而你上面这么写 除非你能 让编译器知道 你new 出来的对象是p2的父类 也就是super = new p1();
可是这么做好象语法上过不了 也不允许这么做
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成员可以被其他包中该类的子类所访问 说的不是生成对象之后还能调用其属性,是在类的代码中可以使用!说的可能不是很明白
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...
我的一点理解,但愿说明白了
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);//这里编译出错说访问不了 }
}这样就可以直接调用了!
只能子类的引用指向子类对象,可以访问该父类中的protected成员
正解5楼!LZ别混淆概念