黑马程序员技术交流社区
标题: 大家帮我分析哈这到题 [打印本页]
作者: 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:58
你还是回去重新看看面向对象的课吧,这点都不清楚,再解释也是徒然。
作者: 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 11:09
两个对象的在内存中的实体是一样,但是2里面,你要把那个匿名内部类的对象作为Object的引用,而Object中没定义show()方法,自然不能使用。
就好像你看爱情动作片的习惯,而你父亲没有,而你和你父亲都会写字,如果你要代替你父亲出席什么正式的场合,签约啥的,这时你要担任父亲的角色去签约,但是你写字的时候还是以自己握笔的方式,但是这种场合,你父亲不会看爱情动作片,你自然也不能看。
作者: fantacyleo 时间: 2014-7-27 12:02
本帖最后由 fantacyleo 于 2014-7-27 12:03 编辑
new Object(){}是创建Object的匿名子类对象的语法,而 Object obj = new Object(){}就是父类引用变量去指向子类对象,也就是多态的应用。多态的局限性在于父类引用虽然指向了子类对象,却只能调用父类定义的方法,因为编译器的语法检查没法知道你到底指向了哪个对象,只能根据obj被声明的类型去判定被调用方法是否存在。而Object类显然没有定义show方法,编译当然通不过。记住:多态是运行时特性,编译期你得老老实实
作者: shen7518 时间: 2014-7-27 12:28
学习了。。。
作者: java—family 时间: 2014-7-27 18:16
我可以这样理解吗?object是你爸。new object(){}是你。object obj = new object (){}这是多态。
你要看岛国动作片的习惯,你爸没有,这样写的话,在编译的时候由于你爸没有那习惯,说以编译器说不能通过。
作者: java—family 时间: 2014-7-27 18:18
恩明白了 这样写刚开始看上去有点不习惯 ,明白了多看哈就习惯了 ,谢谢你了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |