CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

java的一个类A要怎么写,可以让另外一个类B访问A的私有方法(俺从C++过来的)

楼主lhj(努力加油)2006-10-08 18:28:15 在 Java / J2SE / 基础类 提问

其实就是C++中的friend   class的概念。不知道java怎么实现,再CSDN的帖子里面没有收索到,可能大家这种用法不多。  
   
  我主要是想自己写几个类,互相之间可以访问深入一些,然后提供给其他人用的时候,只提供public的方法给其它人用。  
   
  让高手们见笑了。好像Interface是另外一种变通的办法,能说说吗?  
   
  欢迎讨论! 问题点数:200、回复次数:52Top

1 楼leehq(没有读过高中的人)回复于 2006-10-08 18:42:55 得分 30

在java里没有与friend   class完全等同的东西。  
   
  如果两个类都在一个包里,就把方法定义为包可见的就行了,就是不再前面加任何访问标识符。  
  例如:  
  int   method()  
  {  
  }  
   
  否则我就不知道怎么办了···Top

2 楼zxhcloth(hima)回复于 2006-10-08 18:47:18 得分 30

是的,可以用interface来实现你要的,不过观念得变一变  
  我们可以在一个interface里定义所有相关通用的方法如  
  public   interface   A   {  
          void   draw();  
          String   getValue();  
  }  
  后面申明相关的类从它这里实现如  
  public   class   B   implement   A   {  
          public   void   draw()   {  
                  System.out.println("draw");  
          }  
          public   String   getValue()   {  
                  return   "value";  
          }  
  }  
  申明一个实例的时候用如下方法就可以了(C++也有这个概念)  
  A   a   =   new   B();  
   
   
  thanks  
  himaTop

3 楼ykzhujiang(朱朱)回复于 2006-10-08 18:53:22 得分 10

外面用facade模式  
  里面用proxy之类的Top

4 楼lhj(努力加油)回复于 2006-10-08 18:54:33 得分 0

楼上的说法都不错,采用了Interface后,我还想把类控制一下,只能让使用者通过Interface来创建对象,而不能直接New一个类出来。不知道大家有什么样的招数。  
  Top

5 楼lhj(努力加油)回复于 2006-10-08 18:56:50 得分 0

模式?应该有点意思了。Top

6 楼shine333(enihs)回复于 2006-10-08 19:39:19 得分 30

When   in   Rome,   do   as   the   Romans   do.  
   
  1   某几个class不存在继承关系,而互相调用对方不公开的方法,这种设计本身就有问题,如非必须,应避免  
  2   如果必须,则这几个class必然需要共同工作,互相依赖,且为同一目标而共同努力,这种情况下,这几个class应该放在同一个package下,此时,修饰符protected即可Top

7 楼ykzhujiang(朱朱)回复于 2006-10-08 19:41:56 得分 0

恩,入乡随俗,有道理Top

8 楼sonyejin(Neverwinter Nights 2)回复于 2006-10-08 20:02:29 得分 0

友元破坏了面向对象的封装性,最好不用Top

9 楼tallen2005(天乐)回复于 2006-10-08 22:21:08 得分 0

帮LZ顶一下吧  
  JAVA群,欢迎大家加入讨论!QQ群8595489Top

10 楼lhj(努力加油)回复于 2006-10-08 23:32:30 得分 0

to:   shine333(enihs)  
  确实是这几个Class互相依赖,为同一目标而共同努力,也放在一个package下。我试试protected。先谢了!Top

11 楼strawbingo(避世稻草)回复于 2006-10-09 08:57:54 得分 20

名称     说明     备注      
  public     可以从所有类访问            
  protected     可以被同一包中的所有类访问    
  可以被所有子类访问     子类没有在同一包中也可以访问      
  private     只能够被当前类的方法访问            
  缺省    
  无访问修饰符     可以被同一包中的所有类访问     如果子类没有在同一个包中,也不能访问      
  Top

12 楼lhj(努力加油)回复于 2006-10-09 09:48:47 得分 0

受教育了,看来java和C++是有些东西名字一样,但是含义区别比较大。Top

13 楼rohuddu(我不帅没人爱)回复于 2006-10-09 10:20:35 得分 20

让B成为A的内部类Top

14 楼williamwhy()回复于 2006-10-09 10:41:19 得分 10

 
  楼上的说法都不错,采用了Interface后,我还想把类控制一下,只能让使用者通过Interface来创建对象,而不能直接New一个类出来。不知道大家有什么样的招数。  
  -----  
  inferface是不可能创建对象的,他隐式的是STATIC和FINAL的,只提供了形式,没有实现哪来对象  
   
  Top

15 楼zgysc(翠湖寒)回复于 2006-10-09 11:00:44 得分 5

内部类Top

16 楼guileen(松风抚琴)回复于 2006-10-09 11:30:33 得分 5

内部类是一种  
  还有就是protected,protected可以被同一包下的其他类访问,还可以被继承类访问  
   
  Interface...怎么说?和函数指针和虚函数都有类似之处。Top

17 楼guileen(松风抚琴)回复于 2006-10-09 11:32:01 得分 10

我主要是想自己写几个类,互相之间可以访问深入一些,然后提供给其他人用的时候,只提供public的方法给其它人用。  
   
  对这个问题,你只要把你要写的类都放在同一包下,并把不想被他人访问的置为protected就可以了  
  Top

18 楼jiao38(拼命拉)回复于 2006-10-09 11:40:31 得分 0

分好多.Top

19 楼whfasrp2005()回复于 2006-10-09 11:41:03 得分 0

学习了Top

20 楼buyaowen(失业中,请勿打扰)回复于 2006-10-09 11:57:44 得分 0

markTop

21 楼yulongcn(run)回复于 2006-10-09 12:18:12 得分 0

把B作为A的inner   classTop

22 楼mircoteam(我是臻臻)回复于 2006-10-09 12:23:33 得分 10

我看到时,感觉可以用内部类解决问题不知道楼主是不是这个意思:  
   
  以下是我的代码.(新来的,请大家多观照...)  
   
  public   class   Inter   {  
  private   int   a   =   0;  
  public   void   showMessage()   {  
  System.out.println("This   Inter.showMessage()");  
  }  
  class   B{  
  private   int   b   =   0;  
  private   void   show()   {  
  showMessage();  
  }  
  }  
  public   static   void   main(String[]   args)   {  
  Inter   in   =   new   Inter();  
  B   b   =   in.new   B();  
  b.show();  
  }  
  }Top

23 楼xueminhong()回复于 2006-10-09 14:31:13 得分 0

个人觉得还是用内部类比较的好,内部类可以访问外部类的数据成员!Top

24 楼nightdress()回复于 2006-10-09 14:51:08 得分 0

受教了!!!!Top

25 楼wmzsl(王明哲)回复于 2006-10-09 14:55:24 得分 0

反射!Top

26 楼tywinning()回复于 2006-10-09 15:05:00 得分 0

又学到不少东西啊,谢了Top

27 楼yybjroam05(月蒙影)回复于 2006-10-09 15:23:19 得分 0

关注Top

28 楼jk88811(你的就是我的,我的还是我的~!)回复于 2006-10-09 15:27:59 得分 0

嗯,问得好。。  
   
  大家答得更好!受教了。  
   
  觉得还是设计重要,这样的设计是不是有点儿问题?Top

29 楼sjjf(水晶剑锋)回复于 2006-10-09 15:49:38 得分 0

反射机制Top

30 楼willishz(光与影的奇迹)回复于 2006-10-09 15:50:27 得分 15

我觉得最神的还是java的反射reflection,我原来测试时用过!  
  虽然比较繁琐,但好像不用反射的话,结合测试(白盒)是测不到私有方法的.  
  JUnit只能测非私有方法.  
  下面举个例子测类A中的privateTest(String,   Object)方法.  
   
  -------------------类A-----------------------------  
  package   willishz;  
   
  public   class   PrivateClassTest   {  
           
          private   void   privateTest(String   arg1,   Object   arg2)   {  
                  System.out.println("This   method("   +   arg1   +   ",   "   +   arg2+   ")   is   private.");  
          }  
  }  
  -------------------类B-----------------------------  
  package   willishz;  
   
  import   java.lang.reflect.InvocationTargetException;  
  import   java.lang.reflect.Method;  
   
  public   class   ReflectionTest   {  
   
          public   static   void   main(String[]   args)   {  
                  Class   c   =   null;  
                  try   {  
                          c   =   Class.forName("willishz.PrivateClassTest");  
                  }   catch   (ClassNotFoundException   e)   {  
                          e.printStackTrace();  
                  }  
                  Method   m   =   null;  
                  try   {  
                          m   =   c.getDeclaredMethod("privateTest",   new   Class[]{String.class,   Object.class});  
                  }   catch   (SecurityException   e)   {  
                          e.printStackTrace();  
                  }   catch   (NoSuchMethodException   e)   {  
                          e.printStackTrace();  
                  }  
                  m.setAccessible(true);  
                  try   {  
                          m.invoke(new   PrivateClassTest(),   new   Object[]{"String",   "Object"});  
                  }   catch   (IllegalArgumentException   e)   {  
                          e.printStackTrace();  
                  }   catch   (IllegalAccessException   e)   {  
                          e.printStackTrace();  
                  }   catch   (InvocationTargetException   e)   {  
                          e.printStackTrace();  
                  }  
          }  
  }  
   
   
  Top

31 楼seakingwy(JAVAing~重新开始)回复于 2006-10-09 15:54:56 得分 0

楼主所说应该是可直接用内部类来完成.  
   
  楼上的比较有意思!学习Top

32 楼xiaoyan0413(小妍)回复于 2006-10-09 17:29:20 得分 0

我觉得还是在同一个包下比较好,把有关联的封装的方法用protected和interface,然后留个public方法给别人调用就好了,用内部类程序的可读性会很差。而且用内部类的话是不是失去了friend   的意思啊。  
  个人意见!!  
  Top

33 楼shuai59215921()回复于 2006-10-09 17:34:58 得分 0

典型的工厂模式  
  !!  
  Top

34 楼wgy5219()回复于 2006-10-09 19:07:28 得分 0

路过也能学到点东东  
  走路也值得Top

35 楼cpl3113(小龙)回复于 2006-10-09 23:29:48 得分 0

只要把B类做为A类的一个成员变量就行了Top

36 楼cpl3113(小龙)回复于 2006-10-09 23:40:29 得分 0

继承也行,内部类也可以。Top

37 楼artanis0251(堕落天使--LIPSTICK)回复于 2006-10-10 00:30:44 得分 0

放在一个包里,方法的访问控制符用protected就可以吧Top

38 楼artanis0251(堕落天使--LIPSTICK)回复于 2006-10-10 00:31:23 得分 0

或者在类B里创建一个类A的对象Top

39 楼chg2008(岂能尽如人意,但求无愧我心!)回复于 2006-10-10 08:12:58 得分 0

内部类是一种不错的方法Top

40 楼qiuqiupeng(打老婆真爽)回复于 2006-10-10 10:35:27 得分 0

没看懂,你看这样可以不  
  ---------------------------------------A--------------------------  
  public   class   A   {  
  private   void   showA(){  
  System.out.println("A");  
  }  
   
  void   visitshowA(){  
  this.showA();  
  }  
   
  }  
   
  ------------------------------B----------------------  
  public   class   B   {  
  public   static   void   main(String[]   args)   {  
  A   a   =   new   A();  
  a.visitshowA();  
  }  
   
  }Top

41 楼liuzhiyuan()回复于 2006-10-10 16:12:08 得分 0

有想法了Top

42 楼superslash(开始用功学习)回复于 2006-10-10 16:26:27 得分 0

2   如果必须,则这几个class必然需要共同工作,互相依赖,且为同一目标而共同努力,这种情况下,这几个class应该放在同一个package下,此时,修饰符protected即可  
  ===================================================================  
  也没有必要为protected吧,protected主要还是为了继承,依我看默认修饰符就够了Top

43 楼learner_007(世人笑我太疯癫,我笑世人看不穿。)回复于 2006-10-11 10:40:20 得分 0

---------------------------------------A--------------------------  
  public   class   A   {  
  private   void   showA(){  
  System.out.println("A");  
  }  
   
  void   visitshowA(){  
  this.showA();  
  }  
   
  }  
   
  ------------------------------B----------------------  
  public   class   B   {  
  public   static   void   main(String[]   args)   {  
  A   a   =   new   A();  
  a.visitshowA();  
  }  
   
  }  
   
  这个是可以的,我想楼主说的就应试是这意思Top

44 楼xiaoxiaoyuxie()回复于 2006-10-11 10:53:29 得分 5

应该可以使用内部类,如果类B是类A的内部类的话,那么类A可以提供给类B一个宽接口,而给A,B以外的类一个窄接口。相当于实现了友元。Top

45 楼zsy_gemini()回复于 2006-10-11 11:09:29 得分 0

用组合好点Top

46 楼arbiter(同济流氓)回复于 2006-10-11 11:39:44 得分 0

内部类就OK了Top

47 楼honeyego(像BUG一样钻进代码最深处)回复于 2006-10-11 15:30:42 得分 0

从java到c++简单还是从c++到java简单Top

48 楼siyue_qi()回复于 2006-10-11 16:26:33 得分 0

太好了,学习中,谢谢  
  Top

49 楼huaen()回复于 2006-10-11 17:47:01 得分 0

要用到私有方法,就把私有方法变成公有的吧.我觉得  
  要是用内部类的话,把B放进A里,那B就不太好用了...Top

50 楼FreeSeagull(蓝天,白云,松花江)回复于 2006-10-11 21:14:08 得分 0

reflectTop

51 楼FreeSeagull(蓝天,白云,松花江)回复于 2006-10-12 09:11:44 得分 0

Field[]   fields   =   this.getDeclaredFields();  
  for   (   ...)   {  
        fields[i].setAccessible(true);  
        if   ((fields[i].getModifiers()   &   Modifier.STATIC)   !=   0)  
                                          continue;  
        Class   fieldCls   =   fields[i].getType();  
        String   fieldType   =   fieldCls.toString();  
        Object   fieldObj   =   fields[i].get(obj);       //   this   is   what   you   want  
  }Top

52 楼lhj(努力加油)回复于 2006-10-12 12:35:13 得分 0

感谢大家的帮助。问题有很多解决办法,基本上都可以  
  1,同一个包中  
  2,prectected  
  3,内部类  
  4,接口  
  本人的问题得到了解决,我是用这个封装了一个与C++通讯的API。因为要实现java和C++的程序直接交换数据,又不想用庞大的xml,所以封装了API,内部实现繁杂的字节打包和SOCK通讯管理。使用API的时候只要象普通的类一样使用即可。在web服务器这样的多线程情况下直接使用。  
  为了感谢大家,本人计划整理一下源代码,到时搞一个半成品的源代码框架,供有类似需求的兄弟姐妹们继续开放应用。  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:lhj
  • leehq
  • zxhcloth
  • ykzhujiang
  • shine333
  • strawbingo
  • rohuddu
  • williamwhy
  • zgysc
  • guileen
  • guileen
  • mircoteam
  • willishz
  • xiaoxiaoyuxie

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo