0

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

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

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

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

有人可以清除我对 Java 的概念是否安全。提前致谢。

4

6 回答 6

4

打印的数字Object.toString()不是地址。这是身份哈希码。这个数字可能来自地址,但你不知道如何或根本不知道。

即使它是地址,您也无法对其进行任何操作,因为您无法访问任意地址。

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

于 2013-10-22T11:03:16.140 回答
3

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

于 2013-10-22T11:03:04.007 回答
1

Java 是安全的,除非您使用sun.misc.Unsafeprintln(a1)没有指定打印的内容,它不需要是地址。即使它是一个地址,你也没有合法的方式来使用它来读取或写入。

于 2013-10-22T11:06:50.657 回答
1

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

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

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

您永远无法获得对象的内存地址,也无法对其进行操作。

于 2013-10-22T11:04:04.740 回答
0

好吧,对于你的第一个问题,我会要求你阅读这篇文章,并给你的大脑更多的负担来理解差异,

对于第二个,考虑到您作为程序员,您可以通过不创建您正在谈论的对象生成方法来限制将类的东西保持为私有(第一)

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

根据我的说法,我们应该担心我们的代码有多安全,而不是平台有多安全 :)

于 2013-10-22T11:06:20.287 回答
0
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 中,& 不是运算符的“地址”,因为语言设计者已经这样定义了它。无论引用是否实现为简单指针,都没有“地址”运算符。当然,这背后的理念是避免指针算术和内存安全。

另外,在其他情况下,如果我的类 A 是私有的,那么你不能创建它的对象,但是如果我在这个类中创建一个用于创建这个类的对象的方法呢?我只是在任何我想创建这个类的对象的地方调用这个方法!!!

我认为这个问题没有任何意义。如果 A 不是内部类,则 A 类不能是 Private。

于 2013-10-22T11:09:39.747 回答