免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2706 | 回复: 12
打印 上一主题 下一主题

求助:关于java中方法和变量的访问控制 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-02 16:12 |只看该作者 |倒序浏览
按照本坛的“JAVA初学教程进阶”中所说:

-方法和变量的访问控制

->;       Public:所有类均可以访问。

->;       Private:只能被它所在的类中的成员访问,使该定义的成员对外在的类不可见。

->;       Protected:可以被同一个包的类访问,另外其所有子类也可以访问。

->;       Default:当成员不使用任何访问控制修饰符时,即采用默认的访问控制权限。它和Protected类似,唯一的区别在于子类访问权限,它仅允许同一个包的子类访问,而其他包中的子类则不可以访问。


对于protected的变量和方法,其所有子类都应该可以访问,不论是否在同一个package中。

看朱仲杰的“java2全方位学习”中有如下例子:

package package1;

public class A
{
        protected int p1;
       
        protected static void p2() {}
        protected void p3() { }
}

存为为a.java文件,放在package1文件夹中。

package package2;

import package1.A;

public class D extends A
{
        public D()
        {
                A a = new A();
                a.p1=1;
                a.p2();
                A.p2();
                a.p3();
                p1=1;
                p2();
                p3();
        }
}

存为d.java,放在package2文件夹中。


package1和package2都在同一个文件夹中。

编译a.java,通过。

编译d.java,报错:
package2\d.java:10: p1 可以在 package1.A 中访问 protected
                int i = a.p1;//a.p1=1;
                         ^
package2\d.java:13: p3() 可以在 package1.A 中访问 protected
                a.p3();
                 ^
2 错误

到底protected的访问控制是什么?

[ 本帖最后由 hncdyjh 于 2006-8-2 16:44 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-08-02 16:13 |只看该作者
protected子类和包可以访问
default 限于包 其实 java入门书里边都有解答

论坛徽章:
0
3 [报告]
发表于 2006-08-02 16:15 |只看该作者
回答得好快,谢谢。


d为a的子类, 为什么不能访问标记为protected的a中的变量和方法?

[ 本帖最后由 hncdyjh 于 2006-8-2 20:33 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-08-03 01:05 |只看该作者
a.p1=1;
a.p2();
相当于没有使用继承。继承以后可以在类的内部直接访问,不需要a. 开头。

论坛徽章:
0
5 [报告]
发表于 2006-08-03 08:37 |只看该作者
原帖由 perryhg 于 2006-8-3 01:05 发表
a.p1=1;
a.p2();
相当于没有使用继承。继承以后可以在类的内部直接访问,不需要a. 开头。




不是关于继承的问题,是超类的protected属性和方法为什么不能被子类使用的问题,protected的类方法却可以。

论坛徽章:
0
6 [报告]
发表于 2006-08-04 02:18 |只看该作者
原帖由 hncdyjh 于 2006-8-3 08:37 发表




不是关于继承的问题,是超类的protected属性和方法为什么不能被子类使用的问题,protected的类方法却可以。

既然没有有效继承,何来的超类和子类的问题?只有继承了超类以后在子类的内部方法中把超类定义的属性和方法当作自己类中定义的一样使用。

这几种都不算是子类使用超类方法
A a = new A();
a.p1=1;
a.p2();
A.p2();
a.p3();

下面的方法才算是子类使用超类的方法
p1=1;
p2();
p3();

是你对“使用”这个词的理解有误。

论坛徽章:
0
7 [报告]
发表于 2006-08-04 09:47 |只看该作者
原帖由 perryhg 于 2006-8-4 02:18 发表

既然没有有效继承,何来的超类和子类的问题?只有继承了超类以后在子类的内部方法中把超类定义的属性和方法当作自己类中定义的一样使用。

这几种都不算是子类使用超类方法
A a = new A();
...




我从来都没有认为没有有效继承。

你所说的“使用”实际上应该是指的是子类继承超类的protected方法,但这些方法(没有a.的)还是属于子类对象的吧。

带a.的方法是属于超类对象的。

论坛徽章:
0
8 [报告]
发表于 2006-08-04 10:04 |只看该作者
protected’ means all classes in the same package (like default) and sub-classes in any package can access the features. But a subclass in another package can access the protected members in the super-class via only the references of subclass or its subclasses. A subclass in the same package doesn’t have this restriction. This ensures that classes from other packages are accessing only the members that are part of their inheritance hierarchy.

I found this in a SCJP notes doc, does this hit your problem?

论坛徽章:
0
9 [报告]
发表于 2006-08-04 12:23 |只看该作者
以下是jvm spec 中的内容
A protected member of an object may be accessed only by code responsible for the implementation of that object. To be precise, a protected member may be accessed from anywhere in the package in which it is declared and, in addition, it may be accessed from within any declaration of a subclass of the class type that contains its declaration, provided that certain restrictions are obeyed.


访问控制也就是控制对其访问者的可见性。

由我上面引用的jvm spec 中可以看出protected修饰的方法在包内任何地方可见,或子类可见。
               
而你举的例子里面  检查的是该方法是否在外包中的子类中创建的父类对象的可见性,而不是子类中该方法的可见性.

[ 本帖最后由 白色乌鸦 于 2006-8-4 12:25 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-08-04 15:01 |只看该作者
帮你顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP