黑马程序员技术交流社区

标题: 关于匿名内部类的问题 [打印本页]

作者: orgcheng    时间: 2015-9-19 15:58
标题: 关于匿名内部类的问题
  1. public class Solution {
  2.         public static void main(String[] args) {
  3.                 // 1
  4.                 new Object(){
  5.                         void show(){
  6.                                 System.out.println("show run 1");
  7.                         }
  8.                 }.show();
  9.                
  10.                 // 2
  11.                 Object obj = new Object(){
  12.                         void show(){
  13.                                 System.out.println("show run 2");
  14.                         }
  15.                 };
  16.                 obj.show();
  17.         }
  18. }
复制代码

1和2的写法正确吗?有什么区别?说明原因。
作者: leixing1012    时间: 2015-9-19 15:58
本帖最后由 leixing1012 于 2015-9-19 19:47 编辑

写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
区别:
第一个可是编译通过,并运行。
第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,父类(Object)引用指向子类(匿名内部类)对象。obj被提升为了Object类型的引用,而编译时检查obj的类型Object类中是否有show方法,而Object没有show方法,所以编译失败。
作者: liudongcan    时间: 2015-9-19 19:03
有区别,第一个写法的对象只能使用一次。第二中写法可以调用多个方法
作者: 菊花爆满山    时间: 2015-9-19 21:11
楼上2位朋友 加在一起就是我想说的
作者: liudongcan    时间: 2015-9-20 13:18
leixing1012 发表于 2015-9-19 15:58
写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
区别:
第一个可是编译通过,并运行。 ...

厉害,这也就是老师说的多态的弊端
作者: heshiwei    时间: 2015-9-21 15:49
确实如答案所说,第二种写法是错误的,因为obj是父类的对象,只能访问object原有的方法,而show在子类,所以无法访问。

除去2中以上错误。1和2的区别是:1.一次性的  2.可以反复使用

作者: 往事如风555    时间: 2015-9-28 22:18
谢谢分享




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