黑马程序员技术交流社区
标题:
匿名内部类d.show()调用可以,d.abc()调用就编译失败?
[打印本页]
作者:
靓仔
时间:
2014-2-21 16:43
标题:
匿名内部类d.show()调用可以,d.abc()调用就编译失败?
本帖最后由 靓仔 于 2014-2-23 16:13 编辑
1:匿名内部类其实就是内部类的简写格式。
2:定义匿名内部类的前提:
内部类必须是继承一个类或者实现接口
3:匿名内部类的格式: new 父类或者接口(){定义子类的内容}
4:其实匿名内部类就是一个匿名子类对象。而且这个对象有点胖,可以理解带内容的对象。
5:匿名内部类中定义的方法最好不超过三个。
*/
abstract class AbsDemo
{
abstract void show();
}
class Outer
{
int x = 3;
/*
class Inner extends AbsDemo
{
void show()
{
System.out.println("x =="+x);
}
}
*/
public void function()
{
//new Inner().show();
AbsDemo d=new AbsDemo()//替代绿色部分
{
void show()
{
System.out.println("x=="+x);
}
void abc()
{
System.out.println("hah");
}
};
d.show();
//d.abc();编译失败
}
}
class InnerClassDemo5
{
public static void main(String[] args)
{
new Outer().function();
}
}
作者:
松涛小玮
时间:
2014-2-21 17:25
AbsDemo d=new AbsDemo()//这里相当于建立了AbsDemo的字类对象
{
void show()
{
System.out.println("x=="+x);
}
void abc()
{
System.out.println("hah");
}
};
这里相当于建立了AbsDemo的子类对象,这个子类对象覆盖了父类的方法并且自定义了一个abc方法,abc方法是子类的方法 d是指向父类的引用 不能调用子类的自定义方法 但是可以调用被覆盖的父类方法 这里其实是多态的问题 父类不能转型成子类 所以子类自己的方法 父类不能用
作者:
薆情媬証書
时间:
2014-2-21 19:54
楼上正解,楼主写的 new AbsDemo() {}是内部类,而内部类相当于一个子类对象,然后楼主将父类类型(AbsDemo)指向了子类对象(就是该内部类!)根据面向对象的三大特性之一的多态性这样写没有任何问题,但是其缺点就是访问的局限性,该对象(d)只能访问父类中的成员和方法,无法访问子类特有的属性和方法!总得来说就是体现了多态访问的局限性
作者:
徐芾清
时间:
2014-2-22 10:31
请注意这句话:内部类必须是继承一个类或者实现接口
个人认为能理解这句话就能够也很容易理解这个问题了
在父类引用指向子类对象的时候(既多态),是无法引用子类中的方法的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2