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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© て淡莣了陌生 中级黑马   /  2013-4-27 08:10  /  1694 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 て淡莣了陌生 于 2013-4-27 11:02 编辑

class Demo1
{
        public static void main(String[] args)
        {

                Object obj=new Object(){
                        
                        public void show(){
                                System.out.println("show");
                        }
                };

                obj.show();
        }
}




class Demo2
{
        public static void main(String[] args)
        {
                new Object(){
                        
                        public void show(){
                                System.out.println("show");
                        }
                }.show();


        }
}

以上两段代码,Demo1是利用引用调show方法,Demo2是直接用对象调show方法,不都是一样的吗,为什么运行Demo1的时候会报错,而Demo2能够正常运行呢?求解释!!

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

5 个回复

正序浏览
楼主你好   如果问题已经解决了,请把帖子的类型改为“已解决”{:soso_e181:}
回复 使用道具 举报
陈雪琪 来自手机 中级黑马 2013-4-27 09:40:47
报纸
手机党码字挺痛苦的。。
不过这个我懂就来说说咯
你的Demo1中,注意你创建的那个对象其实是Object子类对象,而Object父类引用指向子类对象就是多态了。

在多态那一章可以知道,非静态成员函数编译看左边运行是看右边的 ,所以编译是会出错的,因为父类并没有show方法。


而demo2中,是建立一个object子类对象并直接调用,与多态是无关的,所以编译可以通过。

不知道有木有说清楚呀。。。来自: Android客户端
回复 使用道具 举报
本帖最后由 刘海东 于 2013-4-27 09:36 编辑

匿名内部类就是内部类的简写,用于简化代码
既然是简写的话就会有一些局限性:
1、因为没有名字,所以只能使用一次
2、必须继承一个父类或实现一个接口

你这个Object里面没有show方法啊
必须写成这样
  1. class Object
  2. {
  3.         public void show(){}
  4. }

  5. class Demo1 extends Object
  6. {
  7.          public static void main(String[] args)
  8.          {
  9.                  Object obj = new Object()
  10.                                  {                        
  11.                      public void show()
  12.                                          {
  13.                                                 System.out.println("show");
  14.                      }
  15.                  };
  16.                                  obj.show();
  17.          }
  18. }
复制代码
回复 使用道具 举报
第一个会报错是因为
匿名内部类只能使用一次...
也就是说当遇到“;”结束时;
你的Object的对象就没有了show方法。
所以在编译期报错...
回复 使用道具 举报
首先Demo1是父类引用指向子类对象。(多态)
而父类里面是没有show这个方法时,是会编译错误的。

而下面的是子类对象直接调用自己的函数,这样显然是可以的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马