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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾成龙 中级黑马   /  2012-8-16 00:29  /  5450 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾成龙 于 2012-8-16 01:33 编辑

子类可以直接在父类中创建匿名内部类吗?如果能可以用代码体现一下吗?在讲讲为什么?

8 个回复

倒序浏览
具体的格式还有例子我给你写上你可以看一下
前提:继承一个类或者实现一个接口

                格式:
                        new 父类名或者接口名()
                        {
                                重写父类方法或者实现接口中的方法。
                                也可以自定义其他方法。
                        };
为什么我们使用匿名内部类呢?
因为效率较高。

什么情况下,适合使用匿名内部类。
通常在使用方法是接口类型参数,并该接口中的方法不超过三个时,可以将匿名内部类作为参数传递。
增强阅读性。
interface Inter
{
        public abstract void show();
        public abstract void show2();
}

class Outer
{
        public void method()
        {
                //匿名内部类
                new Inter() //返回的是接口的子类匿名对象
                {
                        public void show()
                        {
                                System.out.println("show");
                        }

                        public void show2()
                        {
                                System.out.println("show2");
                        }
                };

                //如果调用方法呢?
                new Inter() //返回的是接口的子类匿名对象
                {
                        public void show()
                        {
                                System.out.println("show");
                        }

                        public void show2()
                        {
                                System.out.println("show2");
                        }
                }.show();

                new Inter() //返回的是接口的子类匿名对象
                {
                        public void show()
                        {
                                System.out.println("show");
                        }

                        public void show2()
                        {
                                System.out.println("show2");
                        }
                }.show2();

                //上面调用太麻烦 多态
                Inter i = new Inter() //返回的是接口的子类匿名对象
                {
                        public void show()
                        {
                                System.out.println("show");
                        }

                        public void show2()
                        {
                                System.out.println("show2");
                        }
                };

                i.show();
                i.show2();
        }
}

class NiMingInnerClassDemo2
{
        public static void main(String[] args)
        {
                Outer o = new Outer();
                o.method();
        }
}
回复 使用道具 举报
本帖最后由 贾成龙 于 2012-8-16 01:31 编辑

哥们,你答非所问啊!你说的这些我也懂!不就是老师讲的吗!我重复一下:是一个类的实例化对象在这个类的父类中可以写匿名内部类吗?我说的是在枚举中!不是普通类中!希望你在考虑一下!
回复 使用道具 举报
额,这不行吧~~
class A

     run();


class B
{
    class C extends A                                                                                      class A()
                                                                                                                         {
                                                                                                                              run();//这是个匿名内部类,这个类继承了类A。
                                               蓝色是不是等于红色                                            }

         
              run();
          }

}

而你的意思是
class B

       class C extends  B                                                                                               class B()
       {                                                                                                                                     {
                                                                                         
       }                                                                                                                                     }


为了方便我把匿名内部类叫类C,首先匿名内部类必须继承一个类,类C继承了类B,而你类C又是类B的一部分,你见过一个即是儿子,又是爹的一部分的吗???

回复 使用道具 举报
杨彪 发表于 2012-8-16 01:07
具体的格式还有例子我给你写上你可以看一下
前提:继承一个类或者实现一个接口

哥们,你答非所问啊!你说的这些我也懂!不就是老师讲的吗!我重复一下:是一个类的实例化对象在这个类的父类中可以写匿名内部类吗?我说的是在枚举中!不是普通类中!希望你在考虑一下!
回复 使用道具 举报
官文昌 发表于 2012-8-16 01:30
额,这不行吧~~
class A

在枚举中呢?
回复 使用道具 举报
前提:继承一个类或者实现一个接口

                格式:
                        new 父类名或者接口名()
                        {
                                重写父类方法或者实现接口中的方法。
                                也可以自定义其他方法。
                        };
  1. package test;

  2. public class Demo {

  3.        
  4.         public static void main(String[] args) {
  5.                
  6.                 Fu f  = new Fu();
  7.                 f.show2();
  8.         }

  9. }

  10. class Fu
  11. {
  12.         public void show1()
  13.         {
  14.                 System.out.println("Fu");
  15.         }
  16.        
  17.         public void show2()
  18.         {
  19.                 //此处的匿名内部类相当于是Fu的子类,且复写了Fu中的show1()方法
  20.                 new Fu(){
  21.                         public void show1()
  22.                         {
  23.                                 System.out.println("Fu的匿名内部类");
  24.                         }
  25.                 }.show1();
  26.         }
  27.        
  28. }
复制代码
回复 使用道具 举报
public enum TrafficText {
          /*首先呢这里的green和red,yellow是作为该枚举类的惟独的3个实例化对象,由public  static final来修饰的
    //由于是静态成员,所以这3个对象可以直接用类来访问,如TrafficText.RED,除此之外该枚举类还可以拥有自己的属性,例如
     * 下面的private  int  num这个属性,所以在构造函数的时候需要初始化,值得一提的是由于这个类只能有这个3个对象所以必须将
     * 其构造函数私有化,接下来就是你所得枚举内部类的问题,如果在枚举内部有了抽象方法,那么该方法只能由其子类来实现,而我们
     * 知道一旦父类TrafficText里面有了抽象方法,那么这个父类本身是不能new出对象的,也不能创立对象,所以如果想调用这个抽象类
     * TrafficText里面的方法就必须通过此类的子类来实现了,所以这个下面的GREEn,RED,YELLOW实际上是其子类对象来构成这个枚举
     * 的元素;所以后面的大括号就是用来复写这个抽象方法的,:我们知道匿名内部类的的格式是:new 父类或接口(){子类的方法内容}.子类方法();
     * 前面的部分new  父类或者接口名()的部分其实就是此枚举类中的对象yellow,green,red,所以后面直接接口号用来复写父类的方法即可
     * */
        GREEN(10)   
        {  
                public TrafficText turnColour()
                        {
                                return  YELLOW;
                        }
               
        },
        RED(20){
               
                        public TrafficText turnColour()
                        {
                                return  GREEN;
                        }
               
        },
        YELLOW(30)
        {
               
                        public TrafficText turnColour()
                        {
                                return  GREEN;
                        }
               
        };
        public abstract TrafficText turnColour();
        private int num;
        private TrafficText(int num)
        {
                this.num=num;
        }
}
这个也是我自己的总结,希望能给你帮助,也求版主能给分,纯手动党,不容易啊!

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
xiameiqiang + 5
张立江 + 1 赞一个!

查看全部评分

回复 使用道具 举报
求版主给分啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马