黑马程序员技术交流社区

标题: 匿名内部类能不能不定义在外部类的方法中 [打印本页]

作者: student    时间: 2013-5-27 15:51
标题: 匿名内部类能不能不定义在外部类的方法中
本帖最后由 student 于 2013-5-30 10:16 编辑

前天回答论坛上的一个问题时,发现一个问题:毕老师Java视频中提到的匿名内部类,是定义在外部类的方法中的。

但是非匿名内部类,却可以不用定义在外部类的方法中,想问一下:能否将匿名内部类定义在外部类中,而不需要定义
在外部类的方法中,就像定义非匿名内部类一样。


下面的代码,注释的部分是非匿名内部类的定义格式:
  1. //抽象类
  2. abstract class AbsClass {
  3.         // 抽象方法
  4.         abstract void show();
  5. }

  6. //class Outer {
  7. //
  8. //        // 内部类(非匿名内部类),继承抽象类AbsClass
  9. //        class Inner extends AbsClass {
  10. //                void show() {
  11. //                        System.out.println("Inner Class method");
  12. //                }
  13. //        }
  14. //
  15. //        // 外部类方法
  16. //        public void function() { }
  17. //}

  18. class Outer {
  19.         // 外部类方法
  20.         public void function() {
  21.                 // 匿名内部类
  22.                 new AbsClass() {
  23.                         void show() {
  24.                                 System.out.println("Inner Class method");
  25.                         }
  26.                 }.show();
  27.         }
  28. }

  29. //主函数
  30. public class InnerClass {
  31.         public static void main(String[] args) {

  32.         }
  33. }
复制代码

作者: 无妄无涯    时间: 2013-5-27 16:08
匿名内部类是一种局部内部类,而局部内部类的作用域是被限定在申明这个类的块中的。
作者: 韩明海    时间: 2013-5-27 19:52
  1. class A
  2. {
  3.         void show()
  4.         {
  5.                 System.out.println("aaaa");
  6.         }
  7. }
  8. class B
  9. {
  10.         {
  11.         (new A()).show();
  12.         }
  13.         void show()
  14.         {
  15.                 System.out.println("bbbb");
  16.         }
  17.        
  18.        
  19. }
  20. public class Test9
  21. {
  22.         public static void main(String[] ages)
  23.         {
  24.                 B b=new B();
  25.                 b.show();
  26.         }
  27. }
复制代码
类中不能直接写执行语句,在你的例子中 AbsClass 是抽象类,是不能被实例化的new AbsClass()。
但是可以在代码块中使用匿名内部类

作者: lpflpy    时间: 2013-5-27 20:04
我觉得可以,匿名内部类是匿名的子类对象,是对象就要么传给别人当实参,这种情况就属于在外部类的方法中;要么自己调用方法,这种就可以直接定义在外部类中
public class Test4{
        public static void main(String[] args){
        new HideName(){
                public void show(){
                        System.out.println("haha");
                }
        }.show();
        }
}
abstract class HideName{
        public abstract void show();
}
作者: lpflpy    时间: 2013-5-27 20:59
韩明海 发表于 2013-5-27 19:52
类中不能直接写执行语句,在你的例子中 AbsClass 是抽象类,是不能被实例化的new AbsClass()。
但是可以在 ...

您说的是匿名对象吧?
作者: 韩明海    时间: 2013-5-27 21:05
lpflpy 发表于 2013-5-27 20:04
我觉得可以,匿名内部类是匿名的子类对象,是对象就要么传给别人当实参,这种情况就属于在外部类的方法中; ...

感觉你没明白楼主的意思,你这么写还是定义在方法中,你代码拿到main的外面eclipse马上报错
作者: lpflpy    时间: 2013-5-27 21:13
韩明海 发表于 2013-5-27 21:05
感觉你没明白楼主的意思,你这么写还是定义在方法中,你代码拿到main的外面eclipse马上报错 ...

嗯,明白了,3q~
作者: 陈潜    时间: 2013-5-27 23:10
其实我个人觉得这个问题可以从生命周期的角度来看?
成员的生命周期是和类或者对象一致的
匿名类只是昙花一现,不符合成员的要求吧?
  1. class Ano{
  2.         public void show(){
  3.                 System.out.println("It's Ano");
  4.         }
  5. }

  6. class Demo{
  7.         new Ano().show();        //如果定义在这里 不就是意味着这是成员?匿名内部类执行一次就没了,生命周期不对吧?
  8.        
  9.         public static void main(String[] args) {
  10.                 new Ano().show();               
  11.         };
  12. }
复制代码

作者: 袁梦希    时间: 2013-5-30 10:11
楼主你好,如果帖子没有问题了,那么把帖子对应的类型改为“已解决”,自己帖子下面的编辑就可以了,如果不会改帖看我的个性签名。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2