类的成员的访问控制问题,费解啊!

xiaoxixing 2009-03-20 10:45:43
看到书上说:类的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);//这里编译出错说访问不了 }
}
...全文
158 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanchangyong 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ZiSheng 的回复:]
protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性
[/Quote]

正解
yooyoozoo 2009-03-28
  • 打赏
  • 举报
回复
protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性


正解5楼!

LZ别混淆概念
Sunny_kaka 2009-03-28
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 goodmrning 的回复:]
Java code//------包p1中的类apackage p1;publicclassa
{protectedintage=20;publicstaticvoidmain(String []args)
{

}
}//------包p2中的类ason2,是p1.a的子类packagep2;publicclassason2extendsp1.a
{publicstaticvoidmain(String []args)
{
p1.a a1=newp1.a(); //这里你可以上转型p1.a a1=new p2.a()System.out.println(a1.age);//这里编译出错说访问不了 }}


这样就可以直接调用了!
[/Quote]


这样也不能访问的.
只能子类的引用指向子类对象,可以访问该父类中的protected成员
successgl 2009-03-20
  • 打赏
  • 举报
回复
类的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成员可以被其他包中该类的子类所访问 说的不是生成对象之后还能调用其属性,是在类的代码中可以使用!

说的可能不是很明白
wangsuwen 2009-03-20
  • 打赏
  • 举报
回复
类的protected成员可以被其他包中该类的子类所访问
意思是说
p2继承了p1 在你创建了一个p2的对象时 其实也创建了一个它的父类的对象,也就是p1.
p2的对象拥有权限访问它的父类的对象里的属性age
而你上面这么写 除非你能 让编译器知道 你new 出来的对象是p2的父类 也就是super = new p1();
可是这么做好象语法上过不了 也不允许这么做
zhengmj777 2009-03-20
  • 打赏
  • 举报
回复
其实age已经被ason2继承过来了!
完全可以用new ason2().age进行调用和赋值!

再一点,要注意:编码规范啊!
napier 2009-03-20
  • 打赏
  • 举报
回复
你要通过super去访问
KingZChina 2009-03-20
  • 打赏
  • 举报
回复
温故 知新
luojihaidao 2009-03-20
  • 打赏
  • 举报
回复
在main 是当然是不行的。 作用域在类里, 上面说的都很清楚了。
goodmrning 2009-03-20
  • 打赏
  • 举报
回复
//------包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);//这里编译出错说访问不了 }
}




这样就可以直接调用了!
wanhahahahaha 2009-03-20
  • 打赏
  • 举报
回复
protected 可以供 子类、同一个包的类、其本身 访问
liang__ 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 NuisT_NeO 的回复:]
上面的基本说到位了。。我总结一下吧

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

在p2中 p1.a a1=new p1.a(); 实际是实例化了一个 p1.a 的对象,它不能访问包p1中的protected

p2.ason2 才是 p1.a的子类,可以通过 new p2.ason2().age 来访问
[/Quote]

总结的不错,楼主可以多看看书。。
NuisT_NeO 2009-03-20
  • 打赏
  • 举报
回复
上面的基本说到位了。。我总结一下吧

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

在p2中 p1.a a1=new p1.a(); 实际是实例化了一个 p1.a 的对象,它不能访问包p1中的protected

p2.ason2 才是 p1.a的子类,可以通过 new p2.ason2().age 来访问
dirtykiss 2009-03-20
  • 打赏
  • 举报
回复
类的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...
我的一点理解,但愿说明白了。。。
cuixiuqin1954 2009-03-20
  • 打赏
  • 举报
回复
不同包中的子类虽然继承了protected成员,但只能在该类中访问,不能由它的对象来调用,这里已经超出了protected可以访问的范围了!
mysky191_chi 2009-03-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ZiSheng 的回复:]
protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性
[/Quote]
5楼说的很明白,创建对象访问与子类访问是两个不同的概念!
ZiSheng 2009-03-20
  • 打赏
  • 举报
回复
protected说的是子类可以访问该属性或者方法(或者同一包中的类可以访问该属性),而不是在子类中创建个父类对象,访问该属性

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧