工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2078|回复: 8

从JAVA访问权限饰词的一个问题想起

[复制链接]
发表于 2005-12-31 00:30 | 显示全部楼层 |阅读模式

  对于JAVA的权限修饰的语法,也许我们已经看到很熟悉了。但是有时候如果没有真正地去了解它,像下面的这样的小问题还真的会不时地出现在我们的程序中。
建立一个JAVA的项目,项目里面有两个包:com.kevin.test1和com.kevin.test2。(见图1)
文件结构如下:
    com.kevin.test1
                ――superClass
                ――subClass1
    com.kevin.test2
                ――subClass2

其中subClass1和subClass2都是superClass的子类。


          (图1)
superClass类内容为:

          (图2)
类subClass1内容为:

       (图3)
类subClass2内容为:

          (图4)
  在父类superClass中有一个变量size为protected,而我们两个子类的内容是一样的,都是用父类生成一个对象superClass sp = new superClass(5)。但是当调用以下语句:System.out.println(sp.size);时,这两个类却发生了不同的情况,在subClass1中上面的语句是正确执行的(见图3第19行),但是在另一个类subClass2中上面的语句即是错误的(见图4第22行)。这是为什么呢?为什么在不同的类产生了不同的效果呢?这正是我们今天要解决的问题:
  
  经过仔细的观察,我们可以发现问题的所在:
  在类subClass2(图4的21句)中生成的对象sp虽然仍是由类superClass生成的,但是由于它所在的类不与原来的父类superClass在同一个包里,所以它与父类superClass的关系不能是protected的关系,而且也不能是friendly的关系,所以在类subClass2中是使用superClass是访问不到它的变量的。如果要访问则只能由其子类的对象来访问(图4的17、18句)。
  而在类subClass1中,由于与superClass是处于同一个包里面,所以由superClass生成的变量sp(图3的18句)与原来的类superClass则可以达到friendly的关系。所以可以访问其变量。

  总结:由于我们对于访问权限的关注往往只是停留在概念的理解上,对于测试也可能经常由于把类放在同一个包中而没有发现像这样的问题。但是当像这样的错误发生之后,我们要如何去解决它呢?个人认为重点并不在于解决问题,因为现在的许多错误IDE都可以帮我们指出来,而更重要的是认清楚问题的本质,从根本上理解它的机制,以后再碰到相似的问题才不会出现模糊不清的情况


[ Last edited by kinven0000 on 2005-12-31 at 00:33 ]

[ 本帖最后由 kinven0000 于 2006-1-15 23:45 编辑 ]
发表于 2006-1-1 08:17 | 显示全部楼层
friendly的关系?

java好像没有这个修饰符吧?楼主指的应该是默认(default)吧?

any way,,,支持楼主一个。。。支持原创。。。
回复

使用道具 举报

发表于 2006-1-1 08:17 | 显示全部楼层
参与评分
用户名: wool王 [退出登录]
作者: kinven0000
评分: 积分 15 点
标题: 从JAVA访问权限饰词的一个问题想起
回复

使用道具 举报

发表于 2006-1-1 08:18 | 显示全部楼层
不过楼主写的某些地方我理解得不是很清楚,,,我再去品味下再和楼主讨论
回复

使用道具 举报

发表于 2006-1-1 10:36 | 显示全部楼层
由于我们对于访问权限的关注往往只是停留在概念的理解上

这点不同意.我百度了一下,protected的解释是这样的:

protected介绍:成员只能在定义它的包中被访问,如果在其他包中被访问,则实现这个方法的类必须是该成员所属类的子类。

我觉得对这个概念理解了就可以理解楼主在上面所说的.
回复

使用道具 举报

 楼主| 发表于 2006-1-4 14:45 | 显示全部楼层
感谢各位的支持。由于这是我的第一次发贴,可能很多地方的表达不是很清晰,前几天写贴的时候才真正发现发贴的困难。但是我发这个贴子的主要意思是想表达一种学习的方法,因为JAVA的领域太大太广了,所以我们在学习的过程中更多要注意的是一些细节、深层的东西,碰到难的问题就要想着怎么去解决、原理是什么。但是现在我还是太浮夸,太注重于新技术。努力中!
回复

使用道具 举报

发表于 2006-1-4 17:21 | 显示全部楼层
Originally posted by kinven0000 at 2006/1/4 06:45:
感谢各位的支持。由于这是我的第一次发贴,可能很多地方的表达不是很清晰,前几天写贴的时候才真正发现发贴的困难。但是我发这个贴子的主要意思是想表达一种学习的方法,因为JAVA的领域太大太广了,所以我们在学习 ...



很欢迎新人来这里参与讨论...

我想来这里讨论主要是促进工大coder们之间的交流,,,说对了说错了说得好说得不好不要紧,,,交流到东西,学到东西才是王道.楼主是少有在这边主动发贴分享自己经验的人,希望楼主以后再接再厉,共同营造一个良好的交流氛围...

ps:本版及其支持原创和鼓励原创...希望大家加油...
回复

使用道具 举报

发表于 2006-1-4 17:23 | 显示全部楼层
再ps:看到楼主将类名首字符用了小写...也看到楼主用了eclipse...eclipse应该会建议楼主类名用大写吧...
回复

使用道具 举报

发表于 2006-1-4 22:38 | 显示全部楼层
<thinking in java>第184页是这样说的:
如果你产生新的package,并且继承另一个package中的class,那么你就只能访问原先package中的public成员(当然啦,如果你是在同一个package中施行继承动作,你将仍旧拥有对所有friendly成员的一般性\"package访问权限\").

也就是说,继承自其它包的类,只能访问其公有成员.
protected正是这个作用,当在同一个包里的继承时,可以访问基类的pretected成员,但在包外的继承则不可以访问了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-14 11:16

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表