Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java是如何安全的?_Java_Pointers_Object - Fatal编程技术网

Java是如何安全的?

Java是如何安全的?,java,pointers,object,Java,Pointers,Object,我知道Java不支持指针的概念,指针实际上可以为您提供变量或对象的地址。但是在这种情况下你怎么说 A a1 = new A(); System.out.println(a1); 这里a1是一个引用变量,它指向类A的对象。但当我打印a1时,它会打印对象的地址 所以,我想问的是,什么时候我也可以在Java中获得对象的地址(那个太完全限定的地址),它怎么可能是安全的 有人能澄清我关于Java是安全的概念吗。提前感谢。打印的实际上是“身份哈希码”,而不是地址(请参阅)。即使它是地址,也将是只读

我知道Java不支持指针的概念,指针实际上可以为您提供变量或对象的地址。但是在这种情况下你怎么说

A a1 = new A();    
System.out.println(a1);

这里a1是一个引用变量,它指向类A的对象。但当我打印a1时,它会打印对象的地址

所以,我想问的是,什么时候我也可以在Java中获得对象的地址(那个太完全限定的地址),它怎么可能是安全的


有人能澄清我关于Java是安全的概念吗。提前感谢。

打印的实际上是“身份哈希码”,而不是地址(请参阅)。即使它是地址,也将是只读信息,不能用于执行不安全的指针引用。

对象打印的数字。toString()不是地址。这是身份哈希代码。这个数字可能来源于地址,但您根本不知道如何或是否

即使是这个地址,你也不能用它做任何事情,因为你不能访问任意地址

创建类实例是否与安全相关的问题由您决定。如果是这样,您必须采取措施确保只有允许的实体才能创建此类实例


但当我打印a1时,它会打印对象的地址

不,它不打印对象的地址。当您尝试打印一个对象时,会调用其
toString
方法,默认的
toString
方法输出将包含、类名和对象哈希代码的无符号十六进制表示形式,以@`分隔。象征

所以,我想问的是什么时候我可以得到对象的地址(也就是 完全限定地址)在Java中,它如何安全


你永远无法得到物体的记忆地址,你也无法对其进行操作。

对于你的第一个问题,我想请你阅读,让你的大脑承担更多的负担,理解它们的区别

对于第二种情况,考虑到您是一名程序员,您可以通过不创建您正在谈论的对象生成方法(第一种)来限制将类的内容保持为私有

其次,您可以提供一些方法,通过这些方法,用户只能访问他/她应该访问的类的一部分(这也是您以这种方式编码的限制)


在我看来,我们应该担心我们的代码有多安全,而不是平台有多安全:)

Java是安全的,除非您正在使用。未指定打印的内容
println(a1)
prints,它不需要是地址。即使它是一个地址,你也没有合法的方式用它读写

So, I mean to ask is when I can get address of the object (that too fully qualified address) in Java also, how it could be safe?
  • 首先,对对象的引用并不意味着指向对象的指针。它(理论上)可以是双指针,也可以是带偏移量的三指针,或者其他任何东西,只要它按照特定的约定引用对象。当然,最简单的约定是直接指向对象的指针,但Java语言并不费心解释(据我所知),因为这是一种实现

  • <> > java是一种不同于C和C++的语言,因此它定义了自己的语义。简单地说,在Java中,&不是“address of”操作符,因为语言设计者已经这样定义了它。无论引用是否作为简单指针实现,都没有“address of”操作符。当然,这背后的理念是避免指针运算和内存安全

另外,在另一种情况下,如果我的类A是私有的,所以你不能创建它的对象,但是如果我在这个类中创建一个用于创建这个类的对象的方法呢。只要我想创建这个类的对象,我就调用这个方法


我认为这个问题毫无意义。如果类A不是内部类,那么它就不能是私有的。

“但是当我打印a1时,它会打印对象的地址。”我对此表示怀疑。这里到底有什么不安全的地方,你的意思是什么?如果你不想创建类的实例,那么就不要编写(public)方法来创建类的实例@RohitJain:查看Object.hashCode()的Javadoc。您似乎认为保持对象地址机密与“安全性”有关。到底为什么?如果您通过JNI运行本机代码,那么您大概可以访问任意虚拟内存地址。。。