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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© scz63 中级黑马   /  2016-7-7 22:07  /  885 人查看  /  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 个回复

正序浏览
花塔塔 来自手机 中级黑马 2016-7-9 03:51:15
10#
[quote]cat73 发表于 2016-7-8 16:11
所有类都直接或间接的继承与 Object 类,因此 Student 类实际上是这样的:

System.out.println(

at@加十六进制数和数组的[a@加十六进制数不一样?
回复 使用道具 举报
大家好,我是新来的小老鼠........
回复 使用道具 举报
谢谢分享,很好!!!!
回复 使用道具 举报
谢谢各位大神的讲解
回复 使用道具 举报
默默吸取大神们的知识~~~~~~
回复 使用道具 举报
本帖最后由 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 可能有其他的实现方式。

回复 使用道具 举报
new Student().参量名 或者 new Student().构造方法名,才能打印出具体结果吧,直接打印new Student(),只能打出地址值
回复 使用道具 举报
重写 Student 的toString方法就不是打印地址咯~!
回复 使用道具 举报
(1)new Student()是一个对象啊,当对象生成后由具体的地址。
(2)你没看老师画相关的内存图吗?
(3)举个例子:Student st = new Student();
通过new创建的对象存在于堆内存中,当生成对象后,就是把地址(例如0x0011)赋值给 st 啊
(4)所以,输出的是地址值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马