黑马程序员技术交流社区
标题:
关于匿名内部类的问题,涉及多态。
[打印本页]
作者:
李哲
时间:
2012-3-27 17:55
标题:
关于匿名内部类的问题,涉及多态。
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x=3;
public void function()
{
//情况1
AbsDemo d=new AbsDemo()
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc()
{
System.out.println("hello");
}
};
d.show();
d.abc();//编译失败
//情况2
new AbsDemo()
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc()
{
System.out.println("hello");
}
}.abc();
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().function();
}
}
为什么情况1中的d.abc();不可以通过编译,情况2中的abc()方法就可以呢?
我觉得应该都不可以啊。
作者:
izwj
时间:
2012-3-27 18:10
编译时,看引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
AbsDemo
中没有方法
abc()
,所以编译失败。
情况2中,不涉及多态(父类引用),所以没有问题。
作者:
许飞翔
时间:
2012-3-27 18:33
为什么情况1中的d.abc();编译不通过?
是因为 AbsDemo d=new AbsDemo()创建一个对象,而你d.abc();调用的abc();方法在AbsDemo中没有此方法,所以编译失败;而情况2使用匿名内部类方式调用的abc();在匿名内部类当中
作者:
和心愿
时间:
2012-3-27 23:48
d是AbsDemo类的对象,在AbsDemo中没有abc()方法
后面那个 匿名内部类 new的对象是AbsDemo类的对象 因此可以
作者:
抓哇
时间:
2012-3-28 10:22
...你这个匿名内部类自己造个方法马上调用是可以的 调用完随着分号结束就结束了 那你第二种情况怎么去调用它呢 这个abc方法已经消亡了呀
作者:
葛尧
时间:
2012-3-28 16:32
本帖最后由 葛尧 于 2012-3-28 16:40 编辑
这不就是匿名内部类的局限性吗。
AbsDemo d=new AbsDemo(){};
d 是父类对象指向子类引用 多态。。
所以d.abc()会编译失败,父类中没这个方法
而new AbsDemo(){}.abc();
这是新建了一个子类对象,子类中有这个特有方法,所以后面可以调用abc()的方法
但是没有任何引用指向这个对象,所以这句执行完毕后就被释放了。。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2