黑马程序员技术交流社区

标题: 今天复习匿名内部类遇到的问题,很奇怪?有劳给解? [打印本页]

作者: 李成航    时间: 2012-3-13 17:48
标题: 今天复习匿名内部类遇到的问题,很奇怪?有劳给解?
class A {
public void tes(){}
}


class Test{

public static void main(String[] args){

A b=new A(){public void tes2(){}

};

b.tes();//成功编译

b.tes2();//编译失败!!??

为什么匿名内部类对象只能调用它父类定义了的tes()方法,而不能调用自己定义的tes2()方法??

}
}
作者: 段浩亮    时间: 2012-3-13 18:07
你这是多态调用  只能调用父类中也有的方法  如果想用子类特有方法 要进行类型转换
作者: 未济64    时间: 2012-3-13 18:09
匿名内部类实现了某个接口或者继承了某个存在类的子类。如果一个类只使用一次,那么可以定义为匿名内部类。
建立匿名内部类的关键点是重写父类的一个或多个方法。再强调一下,是重写父类的方法,而不是创建新的方法。
因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的!!!

参考了其他同学的答案

作者: 蒙武辉    时间: 2012-3-13 18:54
首先你要理解匿名内部类的定义前提:
内部类必须是继承一个类或者实现接口。
我的理解是应该不允许调用自己自定义的方法。
作者: 贠(yun)靖    时间: 2012-3-13 19:04
这设计到了继承多肽的 向上和向下转型的问题了
  你A 引用是父类的引用  指向之类对象  这时的引用相当于是父类型的
  所以只能调用父类中的方法   而如果要调用之类的方法
就必须向下转型  强制转换了   子类名  xxx=(子类名)父类引用    转型后就可以调用子类中特有的方法了
作者: 房宝彬    时间: 2012-3-13 20:09
补充LS一点:在多态的情况下,如果子类复写了父类的方法,那么在执行时是使用子类的方法
作者: 王杰    时间: 2012-3-13 20:31
多态问题,遇到这样的问题你必须将b向下转型为子类才可以调用!
作者: 泮和顺    时间: 2012-3-13 21:05
你这个不叫匿名内部类哦,匿名内部类是继承父类所以去new一下然后复写里面的方法 毕老师视频有特别讲,
如果你这个也算,也不是不能这么写的,只能复写方法吧
作者: 袁野    时间: 2012-3-13 22:16
哥们 多态啊  编译方法时候看左边 运行看右边   向下转型 才能使用子类方法
作者: djx900    时间: 2012-3-13 22:24
A b=new A(){public void tes2(){}
只要A是父类    匿名内部类 老毕格式 没错  就对了 大括号里是 所谓的 覆盖 于被覆盖的方法。
作者: 乔玉吉    时间: 2012-3-13 22:54
如果内部类只使用一次,在定义内部类的时候为了简化书写,
我们可以定义匿名内部类,匿名就是没有内部类名字
前提:内部类必须继承或实现一个类或接口.被继承的那个类或接口我们称之为父类
格式: new 父类名或接口{定义子类的内容} //当看到new的时候就要想到new一个对象,而且是一个内部类对象,只是没有内部类名字,故而叫匿名内部类

注意:大括号内是子类的内容,可以覆盖或实现父类中的方法,
父类只能访问自己的方法或者被子类覆盖后的方法.不能访问子类中特有的方法.




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