黑马程序员技术交流社区

标题: 匿名对象求解 [打印本页]

作者: scz63    时间: 2016-7-7 22:07
标题: 匿名对象求解
class Student {
        static {
                System.out.println("Student 静态代码块");
        }
       
        {
                System.out.println("Student 构造代码块");
        }
       
        public Student() {
                System.out.println("Student 构造方法");
        }       
}

class Wg {
        static {
                System.out.println("Demo2_Student静态代码块");
        }
        {
                System.out.println("Demo2_Student 构造代码块");
        }
        public static void main(String[] args) {
                System.out.println("我是main方法"+(new Student()/*会打印出地址值*/));                
        }
}
为什么会打印出地址值?
作者: ImKing    时间: 2016-7-8 01:41
(1)new Student()是一个对象啊,当对象生成后由具体的地址。
(2)你没看老师画相关的内存图吗?
(3)举个例子:Student st = new Student();
通过new创建的对象存在于堆内存中,当生成对象后,就是把地址(例如0x0011)赋值给 st 啊
(4)所以,输出的是地址值。
作者: ylca    时间: 2016-7-8 02:28
重写 Student 的toString方法就不是打印地址咯~!
作者: 花塔塔    时间: 2016-7-8 15:34
new Student().参量名 或者 new Student().构造方法名,才能打印出具体结果吧,直接打印new Student(),只能打出地址值
作者: cat73    时间: 2016-7-8 16:11
本帖最后由 cat73 于 2016-7-8 16:13 编辑

所有类都直接或间接的继承与 Object 类,因此 Student 类实际上是这样的:
  1. class Student extends Object {
  2.     // xxx
  3. }
复制代码

System.out.println("我是main方法"+(new Student()));
这句代码执行的时候,我们可以看到实际上是字符串 + 对象的形式。
而字符串加任何对象,实际上都等于字符串 + 对象.toString()
而 Student 类并没有提供 toString 方法,因此实际上被调用的是 Object 类的 toString 方法。
我们来看看 Object 的 toString 是怎么说的:
  1. Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:

  2. getClass().getName() + '@' + Integer.toHexString(hashCode())
复制代码

因此,你看到的并不是地址值,而是 Student 的 hashCode。

而 Student 类依旧没有没有提供 hashCode 方法,因此实际上被调用的还是 Object 类的 hashCode 方法。
Object 类的 hashCode 只说:返回该对象的哈希码值
但并没有提到这个值是怎么来的,我们继续看 Object 类的源代码:
  1. public native int hashCode();
复制代码

这是一个本地方法,是通过其他语言而非 Java 实现的,上面的文档注释中提到:
  1. This is typically implemented by converting the internal address of the object into an integer
  2. 这通常是将对象的内部地址转换为一个整数来实现的
复制代码

所以,你看到的地址就是这么来的了。

不过默认返回值并不强制是地址,所以这个值在不同 JVM 下的返回结果可能也是不同的,有些 JVM 可能有其他的实现方式。


作者: yabiaodou    时间: 2016-7-8 19:56
默默吸取大神们的知识~~~~~~
作者: scz63    时间: 2016-7-8 21:35
谢谢各位大神的讲解
作者: 牛排    时间: 2016-7-8 21:46
谢谢分享,很好!!!!
作者: 裤头多佛祖    时间: 2016-7-8 22:38
大家好,我是新来的小老鼠........
作者: 花塔塔    时间: 2016-7-9 03:51
[quote]cat73 发表于 2016-7-8 16:11
所有类都直接或间接的继承与 Object 类,因此 Student 类实际上是这样的:

System.out.println(

at@加十六进制数和数组的[a@加十六进制数不一样?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2