A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© scz63 中级黑马   /  2016-7-7 22:07  /  884 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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()/*会打印出地址值*/));                
        }
}
为什么会打印出地址值?

9 个回复

倒序浏览
(1)new Student()是一个对象啊,当对象生成后由具体的地址。
(2)你没看老师画相关的内存图吗?
(3)举个例子:Student st = new Student();
通过new创建的对象存在于堆内存中,当生成对象后,就是把地址(例如0x0011)赋值给 st 啊
(4)所以,输出的是地址值。
回复 使用道具 举报
重写 Student 的toString方法就不是打印地址咯~!
回复 使用道具 举报
new Student().参量名 或者 new Student().构造方法名,才能打印出具体结果吧,直接打印new Student(),只能打出地址值
回复 使用道具 举报
本帖最后由 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 可能有其他的实现方式。

回复 使用道具 举报
默默吸取大神们的知识~~~~~~
回复 使用道具 举报
谢谢各位大神的讲解
回复 使用道具 举报
谢谢分享,很好!!!!
回复 使用道具 举报
大家好,我是新来的小老鼠........
回复 使用道具 举报
花塔塔 来自手机 中级黑马 2016-7-9 03:51:15
10#
[quote]cat73 发表于 2016-7-8 16:11
所有类都直接或间接的继承与 Object 类,因此 Student 类实际上是这样的:

System.out.println(

at@加十六进制数和数组的[a@加十六进制数不一样?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马