黑马程序员技术交流社区

标题: 大家帮我分析哈这到题 [打印本页]

作者: java—family    时间: 2014-7-27 10:48
标题: 大家帮我分析哈这到题
//面试
                //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方法,所以编译失败。


作者: 黎志勇    时间: 2014-7-27 10:52
本帖最后由 黎志勇 于 2014-7-27 10:59 编辑

你上面不是有写“区别”么,不是已经分析了么。
父类引用无法调用子类对象的特有的方法。
作者: java—family    时间: 2014-7-27 10:53
黎志勇 发表于 2014-7-27 10:52
你上面不是有写“区别”么,不是已经分析了么。
父类引用无法调用子类对象的专属方法。 ...

没有明白。。。。。
作者: 黎志勇    时间: 2014-7-27 10:58
java—family 发表于 2014-7-27 10:53
没有明白。。。。。

你还是回去重新看看面向对象的课吧,这点都不清楚,再解释也是徒然。
作者: java—family    时间: 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 11:00
黎志勇 发表于 2014-7-27 10:58
你还是回去重新看看面向对象的课吧,这点都不清楚,再解释也是徒然。

我是想问这两个类的外部 还要一个类吧   是吗?

作者: 黎志勇    时间: 2014-7-27 11:09
java—family 发表于 2014-7-27 11:00
我是想问这两个类的外部 还要一个类吧   是吗?

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

就好像你看爱情动作片的习惯,而你父亲没有,而你和你父亲都会写字,如果你要代替你父亲出席什么正式的场合,签约啥的,这时你要担任父亲的角色去签约,但是你写字的时候还是以自己握笔的方式,但是这种场合,你父亲不会看爱情动作片,你自然也不能看。
作者: fantacyleo    时间: 2014-7-27 12:02
本帖最后由 fantacyleo 于 2014-7-27 12:03 编辑
java—family 发表于 2014-7-27 10:53
没有明白。。。。。

new Object(){}是创建Object的匿名子类对象的语法,而 Object obj = new Object(){}就是父类引用变量去指向子类对象,也就是多态的应用。多态的局限性在于父类引用虽然指向了子类对象,却只能调用父类定义的方法,因为编译器的语法检查没法知道你到底指向了哪个对象,只能根据obj被声明的类型去判定被调用方法是否存在。而Object类显然没有定义show方法,编译当然通不过。记住:多态是运行时特性,编译期你得老老实实
作者: shen7518    时间: 2014-7-27 12:28
学习了。。。
作者: java—family    时间: 2014-7-27 18:16
黎志勇 发表于 2014-7-27 11:09
两个对象的在内存中的实体是一样,但是2里面,你要把那个匿名内部类的对象作为Object的引用,而Object中 ...

我可以这样理解吗?object是你爸。new object(){}是你。object  obj  = new object (){}这是多态。
你要看岛国动作片的习惯,你爸没有,这样写的话,在编译的时候由于你爸没有那习惯,说以编译器说不能通过。
作者: java—family    时间: 2014-7-27 18:18
fantacyleo 发表于 2014-7-27 12:02
new Object(){}是创建Object的匿名子类对象的语法,而 Object obj = new Object(){}就是父类引用变量去指 ...

恩明白了    这样写刚开始看上去有点不习惯 ,明白了多看哈就习惯了  ,谢谢你了!




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