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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java—family 中级黑马   /  2014-7-27 10:48  /  935 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//面试
                //1
                new Object(){
                        void show(){
                                System.out.println("show run");                               
                        }
                }.show();
                //2
                Object obj = new Object(){
                        void show(){
                                System.out.println("show run");
                        }
                };
                obj.show();
               
                1和2的写法正确吗?有区别吗?说出原因。
                写法是正确,1和2都是在通过匿名内部类建立一个Object类的子类对象。
                区别:
                第一个可是编译通过,并运行。
                第二个编译失败,因为匿名内部类是一个子类对象,当用Object的obj引用指向时,就被提升为了
                Object类型,而编译时检查Object类中是否有show方法,所以编译失败。

10 个回复

正序浏览
fantacyleo 发表于 2014-7-27 12:02
new Object(){}是创建Object的匿名子类对象的语法,而 Object obj = new Object(){}就是父类引用变量去指 ...

恩明白了    这样写刚开始看上去有点不习惯 ,明白了多看哈就习惯了  ,谢谢你了!
回复 使用道具 举报
黎志勇 发表于 2014-7-27 11:09
两个对象的在内存中的实体是一样,但是2里面,你要把那个匿名内部类的对象作为Object的引用,而Object中 ...

我可以这样理解吗?object是你爸。new object(){}是你。object  obj  = new object (){}这是多态。
你要看岛国动作片的习惯,你爸没有,这样写的话,在编译的时候由于你爸没有那习惯,说以编译器说不能通过。
回复 使用道具 举报
学习了。。。
回复 使用道具 举报
本帖最后由 fantacyleo 于 2014-7-27 12:03 编辑
java—family 发表于 2014-7-27 10:53
没有明白。。。。。

new Object(){}是创建Object的匿名子类对象的语法,而 Object obj = new Object(){}就是父类引用变量去指向子类对象,也就是多态的应用。多态的局限性在于父类引用虽然指向了子类对象,却只能调用父类定义的方法,因为编译器的语法检查没法知道你到底指向了哪个对象,只能根据obj被声明的类型去判定被调用方法是否存在。而Object类显然没有定义show方法,编译当然通不过。记住:多态是运行时特性,编译期你得老老实实
回复 使用道具 举报
java—family 发表于 2014-7-27 11:00
我是想问这两个类的外部 还要一个类吧   是吗?

两个对象的在内存中的实体是一样,但是2里面,你要把那个匿名内部类的对象作为Object的引用,而Object中没定义show()方法,自然不能使用。

就好像你看爱情动作片的习惯,而你父亲没有,而你和你父亲都会写字,如果你要代替你父亲出席什么正式的场合,签约啥的,这时你要担任父亲的角色去签约,但是你写字的时候还是以自己握笔的方式,但是这种场合,你父亲不会看爱情动作片,你自然也不能看。
回复 使用道具 举报
黎志勇 发表于 2014-7-27 10:58
你还是回去重新看看面向对象的课吧,这点都不清楚,再解释也是徒然。

我是想问这两个类的外部 还要一个类吧   是吗?
回复 使用道具 举报
class Outer{
        int num = 4;       
        class  Inner {
                void show(){
                        System.out.println("inner show run "+num);                       
                }
        }
        public void method(){
                Inner in = new Inner();//创建内部类的对象。
                in.show();//调用内部类的方法。
        }
}
也可以这样写:
class Outer{     int num = 4;     public void method(){     new Inner(){            void show(){            System.out.println("inner show run "+num);             }         }.show()  }}不知道这样理解  怎么样。。那个高手  代码加文字说  说明。。

回复 使用道具 举报
java—family 发表于 2014-7-27 10:53
没有明白。。。。。

你还是回去重新看看面向对象的课吧,这点都不清楚,再解释也是徒然。
回复 使用道具 举报
黎志勇 发表于 2014-7-27 10:52
你上面不是有写“区别”么,不是已经分析了么。
父类引用无法调用子类对象的专属方法。 ...

没有明白。。。。。
回复 使用道具 举报
本帖最后由 黎志勇 于 2014-7-27 10:59 编辑

你上面不是有写“区别”么,不是已经分析了么。
父类引用无法调用子类对象的特有的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马