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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 寇龙飞 于 2012-8-1 00:22 编辑

  1. class Demo
  2. {
  3. void show()
  4. {}
  5. }

  6. class TestDemo
  7. {
  8. public static void main(String[] args)
  9. {
  10. Demo test = new Demo();
  11. System.out.println(test);//打印test对象地址

  12. new Demo().show();//Teh first mark
  13. System.out.println("Please help me !");//请问,此处怎么写,才能打印first mark处的无名对象地址
  14. }
  15. }
复制代码
打印结果:
  1. D:\Java\Demo\07>javac TestDemo.java

  2. D:\Java\Demo\07>java TestDemo
  3. Demo@19360e2
  4. Please help me !
复制代码
如题。
ps.顺便问下,怎么上自己的截图。上面的输出结果如果用图,那就有不可争辩的真相了。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

16 个回复

倒序浏览
package cc;
public class Demo {
        void show(){}
}
package cc;
public class TestDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO 自动生成方法存根
                Demo test=new Demo();
                System.out.println(test);
                new Demo(){
                        void show(){
                                System.out.println(new Demo());
                        }
                }.show();
                System.out.println("Please help me !");
        }

}
打印结果是:
cc.Demo@c17164
cc.Demo@61de33
Please help me !
回复 使用道具 举报
本帖最后由 寇龙飞 于 2012-7-28 14:44 编辑
聂峰 发表于 2012-7-28 14:16
new Demo(){
                        void show(){
                                System.out.println(new Demo());
                        }
                }.show();

这个改写了show函数。有其它办法吗?

还有,你让我理解了,表达式:“new Demo()”的值就是我想要的地址,谢谢你!


================================分割线,上面我说错了,修改下,不敢误导别人===================================
  1. new Demo()//Demo1
  2. {
  3. void show(){
  4. System.out.println(new Demo());//Demo2
  5. }
  6. }.show();


  7. 这两个无名对象不一样,自然地址也就不一样,不是我要得。
复制代码
回复 使用道具 举报
class Demo
{
void show()
{}
}

class TestDemo
{
public static void main(String[] args)
{
Demo test = new Demo();
System.out.println(test);//打印test对象地址

new Demo().show();//Teh first mark
System.out.println("Please help me !"+new Demo().toString());//这样不就是打印出地址了?
}
}
回复 使用道具 举报
1.引用变量中存放在栈内存中,仅仅是一个指向实际对象的引用,保存该对象在堆内存中的地址,类似与c语言中的指针。实际对象存储在堆heap内存中。
2.java不允许直接访问堆内存中的实际对象,必须通过引用变量来操作对象。
3.当没有引用指向堆内存中的实际对象时,程序就无法访问该对象,该对象也就变成了垃圾,等待java的垃圾回收机制回收来释放内存空间。
4.综上所述,对象必须获得引用才能获取其地址,也就是说无法打印无名对象的地址。
  1. class Demo
  2. {
  3.         void show(){}
  4. }

  5. class testDemo {
  6.         public static void main(String[] args) throws Exception{
  7.         Demo test = new Demo();
  8.         System.out.println(test);                                               

  9.         new Demo().show();                                                                //对象如需重复使用,则应该创建引用变量指向该对象
  10.         System.out.println("Please help me !");
  11.         }
  12. }
复制代码
回复 使用道具 举报
王亚飞 发表于 2012-7-28 14:25
class Demo
{
void show()

System.out.println("Please help me !"+new Demo().toString());//这样不就是打印出地址了?


System.out.println("Please help me !"+ (new Demo()));
就可以打印地址,但是,这是新的newDemo()的地址,不是我需要的 first mark处的地址
回复 使用道具 举报
聂峰 发表于 2012-7-28 14:16
package cc;
public class Demo {
        void show(){}
  1. class Demo
  2. {
  3.         void show()
  4.         {
  5.                 System.out.println("real show");
  6.         }
  7. }

  8. class  TestDemo
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 new Demo()
  13.                 {
  14.                         void show()
  15.                         {
  16.                                 System.out.println("this的地址:"+this);//此处是我想要的无名类地址
  17.                         }
  18.                 }.show();

  19.                 Demo test = new Demo();
  20.                 System.out.println("test的地址:"+test);
  21.         }
  22. }
复制代码
用您说的重写show函数的办法,打印this,可以得到我要的地址。但是,有什么不用重写show的办法吗?

同时打印出的地址让我费解
  1. D:\Java\Demo\07>javac TestDemo.java

  2. D:\Java\Demo\07>java TestDemo
  3. this的地址:TestDemo$1@119dc16
  4. test的地址:Demo@c05d3b
复制代码
为什么得到地址的类名是TestDemo$1 ???
回复 使用道具 举报
乐峰 中级黑马 2012-7-28 22:38:28
8#
寇龙飞 发表于 2012-7-28 21:43
用您说的重写show函数的办法,打印this,可以得到我要的地址。但是,有什么不用重写show的办法吗?

同时 ...

你想到的this,真是挺好的。。以后要互相帮助啊,别的方法我真是没想到。。
回复 使用道具 举报
15236163846 来自手机 初级黑马 2012-7-29 12:04:15
9#
呵呵,从得到的类名可以看出你使用的是内部类!内部类生成的class文件是外部类$内部类名,有由于你使用可匿名内部类所以没有名字用1表示是第一个匿名内部类。
来自:黑马程序员训练营论坛 Android客户端来自: Android客户端
回复 使用道具 举报
15236163846 来自手机 初级黑马 2012-7-29 12:08:37
10#

回帖奖励 +10

其实在main方法中可以不用重写show方法的,直接new Demo{}.show();应该可以的!自己想的,没有验证,你试一试!
来自:黑马程序员训练营论坛 Android客户端来自: Android客户端
回复 使用道具 举报
15236163846 发表于 2012-7-29 12:08
其实在main方法中可以不用重写show方法的,直接new Demo{}.show();应该可以的!自己想的,没有验证,你试一 ...

直接打印new Demo()是可以的。上文试过。
回复 使用道具 举报
15236163846 发表于 2012-7-29 12:04
呵呵,从得到的类名可以看出你使用的是内部类!内部类生成的class文件是外部类$内部类名,有由于你使用可匿 ...

对。有道理。谢谢。


同时,这是内部类,打印的地址说明了第13行代码,new Dem()是个新类,是重写了Demo类show方法的子类。那么,第17行代码打印this出来的所看到的地址,就不是我所要的。
回复 使用道具 举报
聂峰 发表于 2012-7-28 22:38
你想到的this,真是挺好的。。以后要互相帮助啊,别的方法我真是没想到。。 ...
  1. new Demo()

  2. 14.                {

  3. 15.                        void show()

  4. 16.                        {

  5. 17.                                System.out.println("this的地址:"+this);//此处是我想要的无名类地址

  6. 18.                        }

  7. 19.                }.show();

复制代码
但是,此处重写了show函数(为什么可以以这种方式重写???这个我也不知道,跟我讲讲),那就不是Demo类对象,而是继承了Demo的子类对象,this打印的要就不是我所要的了。
打印结果TestDemo$1@.....内部类,也说明了这是定义的新类。
回复 使用道具 举报
黑马王冬冬 发表于 2012-7-28 15:01
1.引用变量中存放在栈内存中,仅仅是一个指向实际对象的引用,保存该对象在堆内存中的地址,类似与c语言中 ...

仁兄正解。谢谢。无法打印过期无名对象的地址。

感谢各位!

结贴。
回复 使用道具 举报
kankan ...........................
回复 使用道具 举报
古董帖= =
回复 使用道具 举报

回帖奖励 +20

我的神级RP
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马