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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© orgcheng 中级黑马   /  2015-9-19 15:58  /  3366 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
  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的写法正确吗?有什么区别?说明原因。

最佳答案

查看完整内容

写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。 区别: 第一个可是编译通过,并运行。 第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,父类(Object)引用指向子类(匿名内部类)对象。obj被提升为了Object类型的引用,而编译时检查obj的类型Object类中是否有show方法,而Object没有show方法,所以编译失败。 ...

7 个回复

倒序浏览
本帖最后由 leixing1012 于 2015-9-19 19:47 编辑

写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
区别:
第一个可是编译通过,并运行。
第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,父类(Object)引用指向子类(匿名内部类)对象。obj被提升为了Object类型的引用,而编译时检查obj的类型Object类中是否有show方法,而Object没有show方法,所以编译失败。

点评

感谢。回答的很好。谢谢大神!  发表于 2015-9-21 15:16
回复 使用道具 举报
有区别,第一个写法的对象只能使用一次。第二中写法可以调用多个方法
回复 使用道具 举报
楼上2位朋友 加在一起就是我想说的
回复 使用道具 举报
leixing1012 发表于 2015-9-19 15:58
写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
区别:
第一个可是编译通过,并运行。 ...

厉害,这也就是老师说的多态的弊端
回复 使用道具 举报
确实如答案所说,第二种写法是错误的,因为obj是父类的对象,只能访问object原有的方法,而show在子类,所以无法访问。

除去2中以上错误。1和2的区别是:1.一次性的  2.可以反复使用
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马