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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 易伟 黑马帝   /  2012-2-2 16:05  /  2038 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 易伟 于 2012-2-3 10:13 编辑

interface pr
{
        void print1();
}

public class noNameClass
{
        public pr dest()
        {
                return new pr(){        //这里使用了匿名内部类,但是为什么要这么用啊?
                        public void print1()
                                {
                                        System.out.println("Hello world!!");
                                }
                       
                };
        }
        public static void main (String args[])
        {
                noNameClass c=new noNameClass();
                pr hw= c.dest();     //c.dest() 获取的值是什么?是"hello world"吗?如果是,为什么下面还要调用print1这个方法,
                                     //直接System.out.println(hw)不就可以么?
                                     //如果不是,c.dest()的值是什么?
                hw.print1();   
                //pr hw = new pr();  //匿名内部类可不可以这样创建对象呀?
        }
}
对匿名内部类不是很了解,不懂的都在注释中,请各位大虾帮帮忙!

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 刘基军 于 2012-2-2 16:55 编辑

若是不使用匿名内部类,其等价代码如下:(你感觉哪个书写格式简洁呢?)
  1. interface pr
  2. {
  3.         void print1();
  4. }
  5. class prSub implements pr
  6. {
  7.         public void print1()
  8.         {
  9.                 System.out.println("Hello world!!");
  10.         }
  11. };
  12. class noNameClass
  13. {
  14.         public pr dest()
  15.         {
  16.                 return new prSub();
  17.         }
  18.         public static void main (String args[])
  19.         {
  20.                 noNameClass c=new noNameClass();
  21.                 pr hw= c.dest();     //c.dest() 获取的值是什么?是"hello world"吗?如果是,为什么下面还要调用print1这个方法,
  22.                                      //直接System.out.println(hw)不就可以么?
  23.                                      //如果不是,c.dest()的值是什么?
  24.                 hw.print1();   
  25.                 //pr hw = new pr();  //匿名内部类可不可以这样创建对象呀?
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
    pr hw= c.dest(); 你可以看下dest()return的是什么?,其实就是返回的是pr这个对象,因为你返回的是匿名内部类创建接口pr的子类对象。
其实这个也是方便书写而已,有一些对象是只创建一次使用一次的,当你学到GUI里面的监听器的时候就会发现
有一些类不需要特地的去继承只在方法内部实现其子类就可以了。


下面是匿名内部类的特点

匿名内部类:
1,匿名内部类其实就是内部类的简写格式。
2,定义匿名内部类的前提:
        内部类必须是继承一个类或者实现接口。
3,匿名内部类的格式:  new 父类或者接口(){定义子类的内容}
4,其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖。        可以理解为带内容的对象。
5,匿名内部类中定义的方法最好不要超过3个。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
刘基军 发表于 2012-2-2 16:55
若是不使用匿名内部类,其等价代码如下:(你感觉哪个书写格式简洁呢?) ...

还有呢,只是因为简洁吗?匿名内部类应该还有很多其他的特点把?
回复 使用道具 举报
非大虾前来帮忙

匿名内部类在经常以下几个情况下使用:
类非常小,大约四五行代码吧
只用到类的一个实例
定义后马上就要用到

在你的程序中 dest()方法可以将返回值的生成与返回值类的定义两个动作放在一起执行,从语法上讲是创建了一个继承自pr的匿名类的对象,通过new表达式返回的引用被自动向上转型为对pr的引用,所以c.dest() 获取的是一个对象类型的引用,当然要调用print1方法彩能输出语句了  
这样用因为在真正的开发中这样用回提高效率啊 可以即时的定义print1方法里实现的功能嘛

最后一句pr hw = new pr(); 是不行的 因为在程序中pr是一个接口 接口是不能实例化对象的 这样用时会报错的

评分

参与人数 1技术分 +1 收起 理由
荣凯旋 + 1

查看全部评分

回复 使用道具 举报
呵呵,其他的我还不知道
回复 使用道具 举报
楼上大牛啊 技术分好夸张啊
回复 使用道具 举报
pr hw= c.dest(); 简单的说,返回的是new 匿名类名
只是创建匿名对象而已。

后面hw.print1();  打印而已

为什么用匿名呢?我也不知道,看楼上的好了。我的理解是节省代码,不用取名字。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

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