黑马程序员技术交流社区

标题: 匿名内部类内部解析? [打印本页]

作者: 来男.    时间: 2014-5-14 23:11
标题: 匿名内部类内部解析?
本帖最后由 来男. 于 2014-5-18 21:30 编辑

匿名内部类:  

代码1:
        new Object(){
            void show(){
                System.out.println("黑黑");            
            }
        }.show();

代码2:
        Object obj = newObject(){
            void show(){
                System.out.println("马马");
            }
        };
        obj.show();
        
想问下:代码1、2都通过匿名内部类建立了个Object子类对象,但1编译过且运行;2则报错,请分析原因并讲解步骤。


作者: 张盼    时间: 2014-5-14 23:35
本帖最后由 张盼 于 2014-5-14 23:46 编辑

show()方法是子类中特有的方法,不是继承父类的方法,在1程序中,先建立子类对象然后在调用子类的特有方法。而在2程序中通过父类给子类命名,就产生了多态形式,就只能使用父类的方法,而不能使用子类的方法。

QQ图片20140514234553.jpg (36.73 KB, 下载次数: 34)

QQ图片20140514234553.jpg

作者: pandapan    时间: 2014-5-14 23:43
本帖最后由 pandapan 于 2014-5-14 23:52 编辑

这位同学,从这个题目可以看出你对普通类的继承以及类的多态的规则还没有完全理解。咱们一步一步说说吧
先来说一下第二个为什么不可以吧。
先来看代码2的左侧
  1.   Object obj = newObject(){
  2.             void show(){
  3.                 System.out.println("马马");
  4.             }
  5.         };
复制代码

左侧是Object obj;定义的是Object 对象的一个引用obj,也就是说不管右侧是怎么样的代码,我们只能使用Object类的方法,是吧?就相当于这样的一段普通代码

  1. public class ClassRelationTest {

  2.         public static void main(String[] args) {
  3.                 // TODO Auto-generated method stub
  4.                 Parent p = new Child();
  5.                 p.childMethod();
  6.         }
  7. }
  8. class Parent{
  9.         void parentMethod(){
  10.         }
  11. }

  12. class Child extends Parent{
  13.         void childMethod(){
  14.         }
  15. }
复制代码

在主函数中,我们想通过父类的引用指向新创建的子类对象,然后用这个p来调用子类的方法,这个肯定是不行的(父类根本不存在这样的方法),如果想调用的话,必须转为子类的引用再调用即
  1. ((Child)p).childMethod();
复制代码

这里的匿名内部类的道道其实是一样的,obj为Object类型的引用,指向子类可以,但是调用子类的方法,因为自身没有,所以是不成功的。
2. 而对于代码1呢,这个其实是个简写的过程,
还是用我写的那个普通的类表示,我的主函数中的代码变为
  1. (new Child()).childMethod();
复制代码
这个你肯定是理解的吧,就是新建了一个匿名的子类对象,然后调用这个子类的方法,理解了这个,那么便可以直接解释你的代码1了,你的代码1是一个超级简写的过程,连子类的名字都给省了,就是不需要写子类的名字为Child,直接写匿名的子类,然后匿名的对象的方法.
希望能够帮到你,





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