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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 很给力!

查看全部评分

8 个回复

倒序浏览
匿名内部类是一种局部内部类,而局部内部类的作用域是被限定在申明这个类的块中的。
回复 使用道具 举报
  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()。
但是可以在代码块中使用匿名内部类

评分

参与人数 1技术分 +2 收起 理由
袁梦希 + 2 赞一个!

查看全部评分

回复 使用道具 举报
我觉得可以,匿名内部类是匿名的子类对象,是对象就要么传给别人当实参,这种情况就属于在外部类的方法中;要么自己调用方法,这种就可以直接定义在外部类中
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();
}

评分

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

查看全部评分

回复 使用道具 举报
韩明海 发表于 2013-5-27 19:52
类中不能直接写执行语句,在你的例子中 AbsClass 是抽象类,是不能被实例化的new AbsClass()。
但是可以在 ...

您说的是匿名对象吧?
回复 使用道具 举报
lpflpy 发表于 2013-5-27 20:04
我觉得可以,匿名内部类是匿名的子类对象,是对象就要么传给别人当实参,这种情况就属于在外部类的方法中; ...

感觉你没明白楼主的意思,你这么写还是定义在方法中,你代码拿到main的外面eclipse马上报错
回复 使用道具 举报
lpflpy 中级黑马 2013-5-27 21:13:34
7#
韩明海 发表于 2013-5-27 21:05
感觉你没明白楼主的意思,你这么写还是定义在方法中,你代码拿到main的外面eclipse马上报错 ...

嗯,明白了,3q~
回复 使用道具 举报
陈潜 中级黑马 2013-5-27 23:10:19
8#
其实我个人觉得这个问题可以从生命周期的角度来看?
成员的生命周期是和类或者对象一致的
匿名类只是昙花一现,不符合成员的要求吧?
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
楼主你好,如果帖子没有问题了,那么把帖子对应的类型改为“已解决”,自己帖子下面的编辑就可以了,如果不会改帖看我的个性签名。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马