java怎么没有友元类?

youqika 2009-04-13 10:47:14
假设所有的类在同一包当中,有两个public的类A和B(假设B的所用属性及方法都是静态的),假设A中有一个方法setX()只想被B调用,而不能被其他类使用,
如果不用反射的话,应该怎么做?
...全文
1202 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangkaixin1226 2009-04-13
  • 打赏
  • 举报
回复
学习,顶
yang677888 2009-04-13
  • 打赏
  • 举报
回复
VC++有友元类
Java没有友元类,Java只提供包内友好访问--访问无任何访问限定符修饰的元素
Java 引入了包的概念, 包内访问默认为友好访问, 这样可以使程序的逻辑结构
更清晰,如果逻辑上一堆class可以互相友好访问,那么应该将这堆 class 打包这
样只有包内可以友好访问,包外无法访问(包外的继承者也无法访问)
knightzhuwei 2009-04-13
  • 打赏
  • 举报
回复
因为java把多继承 友元之类的特性淘汰了
JarodYv 2009-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 youqika 的回复:]
难道要把B做成A的内部类?
真别扭
[/Quote]
诚然,这样确实有点别扭。

这样做导致了一个严重的后果就是原始类和友元之间变成了一种组合(composition)关系,而不是c++里面的一种相识(acquaintance)关系,即友元的生命周期完全被原始类给负责了!

但是确实没有其他好的方式来实现了。当然内部类也有他自己的优点,能够解决很多友元的局限。
JarodYv 2009-04-13
  • 打赏
  • 举报
回复
首先友元不是一个好的设计,它破坏了封装。并且自身有很多局限:比如友元关系不能被继承;友元关系是单向的,不具有交换性;友元关系不具有传递性。

Java采用内部类实现C++友元的功能。事实上内部类就是一种面向对象的闭包,因为内部类有他的宿主类的一个reference(所谓闭包是指一个对象,它记录了来自于创建它的作用域的所有信息),内部类本身可以利用这个引用访问宿主类的一切变量,包括Private级别。这不就是一个语法上的,一个类的所有成员变量能被另一个类完全访问吗?内部类不正是能当做宿主类的友元吗?

Java中的Memento模式里Memento的变量只有Originator(原发器)能够访问,这在c++中很容易实现,因为c++有友元的概念。只要将Memento的成员变量设置成私有访问权限,再把Originator设置成Memento的友元即可。Java的实现方法是将Originator类作为Memento的内部类使用!而Memento只有一个public的方法getCallbackRefenence,用这个方法得到Originator的refenence。
youqika 2009-04-13
  • 打赏
  • 举报
回复
难道要把B做成A的内部类?
真别扭
yxc0433 2009-04-13
  • 打赏
  • 举报
回复
可以参见:http://topic.csdn.net/t/20031111/11/2448764.html

另,友元破坏了oo的思想。不是一个好的设计。。
x360995630 2009-04-13
  • 打赏
  • 举报
回复
C++中有友元 java中没有

62,614

社区成员

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

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