java的一个类A要怎么写,可以让另外一个类B访问A的私有方法(俺从C++过来的)
其实就是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




