难道java就没有更好的安全机制吗(50分)

W

wwwlgy

Unregistered / Unconfirmed
GUEST, unregistred user!
据我所知在java中传递参数(包括return)的方法是这样的,若传递的是一个简单的基本
数据类型那么它将会按值传递,即传递一个数值的副本;若是传递的是一个对象那么
它将会按址传递传递对象的一个引用了;这样就有一个安全的隐患,大家请看:
public class Class1
{

public static void main (String[] args)
{
// TODO: Add initialization code here
int [] temp;
test testclass=new test();
temp=testclass.getval();
temp[0]=20;
testclass.showval();
temp[0]=40;
testclass.showval();
}
}
class test
{
private int[] testarray=new int[2];
int[] getval()
{
return testarray;
}
void showval()
{
System.out.print(testarray[0]);
}
}
结果是2040就是说,test中的成员可以在类test外任意改动,尽管它是一个私有的成员!!!
这一点好像不是很复合软件工程的原则!!!!!
请问大家对此有何看法?????????????????????
 
的确是这样耶。。。sigh
 
你试一下把test类放到另一个源文件中再编译试试。
我现在手上没有jdk,星期一我去试试看。
 
既然是 private, 就不要 return 出来。
要用 setXXX, getXXX 之类的接口。
 
yysun真是高,一下就说到了问题的根部,
我怎么就没有想到呢?
 
呵呵,是啊,这样的问题只能归结到class的设计者头上,不能怪JAVA啊
 
任何类只要它提供实例,都可以取得类中的任何值。
如:
MyClass::Class
{
pviate: int A;
public: int B;
};
MyClass Class1;
int main()
{
MyClass Class1;
unsigned char ptr;
int TT;

ptr = (unsigned char *)&Class1;
TT =(int *)ptr;
//---TT=A;
}
}
 
实在要return,就用一下clone().
 
private int[] testarray=new int[2];
把它改成一个class,然后return这个class的实例就行了。
 
to 呆非4:
在Java中是没有指针的,对类型的强制转换也有极其严格的限制,之所以这么做就是为了防止
非法访问类的私有数据。
至于上面提到的返回数组的问题,可以参考一下Java中的String类型。String类保证了不可能
绕过它的指定的方法来访问数据的内容。如 charAt, substring...
 
又,其实你这么干,c++也不安全哦。。。
你试试用c++传出一个私有成员的应用?一样可以更改哦。。呵呵
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
597
import
I
I
回复
0
查看
608
import
I
I
回复
0
查看
519
import
I
顶部