黑马程序员技术交流社区
标题:
匿名内部类的问题
[打印本页]
作者:
史卜坤
时间:
2012-7-12 13:39
标题:
匿名内部类的问题
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()方法就可以呢?
我觉得应该都不可以啊。
作者:
万宝东
时间:
2012-7-12 13:54
首先因为abc()这个方法是AbsDemo子类中的方法
情况2
new AbsDemo()
//这里用的是匿名内部类,创建的是AbsDemo的子类对象
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc()
{
System.out.println("hello");
}
}.abc();
//这里调用abc()方法时用的就是AbsDemo的子类对象。
情况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();
//这里调用abc()方法实际是父类对象在调用,但是父类中没有abc()方法,所以报错“没有为类型 AbsDemo 定义方法 abc()”
作者:
耿立刚
时间:
2012-7-12 14:03
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();
}
}
这些在毕老师视频里都有讲到,楼主要好好看看啦
作者:
王达
时间:
2012-7-12 14:11
本帖最后由 王达 于 2012-7-12 14:23 编辑
new AbsDemo()
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc()
{
System.out.println("hello");
}
}.abc();
}
}
作者:
王红霞
时间:
2012-7-12 14:18
本帖最后由 王红霞 于 2012-7-12 14:20 编辑
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x=3;
public void function()
{
//情况1
AbsDemo d=new AbsDemo()
//d是抽象类的对象 而不是抽象类的子类
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc()
{
System.out.println("hello");
}
};
d.show();
d.abc();
//因为abc()不是抽象类Abstract的内部函数,所以编译失败
//情况2
new AbsDemo()
//这是匿名内部类的代码块 创建的是抽象类的子类
{
int num=3;
void show()
{
System.out.println("num="+num);
}
void abc() //
1,在子类中定义了abc()方法 属于内部方法
{
System.out.println("hello");
}
}.abc();
//2,所以在此处可以调用,编译成功
}
}
class InnerClassDemo4
{
public static void main(String[] args)
{
new Outer().function();
}
}
作者:
黑马-王言龙
时间:
2012-7-12 14:31
成员方法在多态调用时,编译看左边,运行看右边。
第一种情况是:自己调用父类
第二种情况是:自己调用自己
不管哪种情况,被调用者本身必须有此方法。
第一种情况下,父类中是没有方法abc()的,所以编译失败。
第二种情况下,匿名内部类本身有abc()方法,所以调用自己的方法是可以的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2