A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()方法??

}
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

10 个回复

倒序浏览
你这是多态调用  只能调用父类中也有的方法  如果想用子类特有方法 要进行类型转换
回复 使用道具 举报
匿名内部类实现了某个接口或者继承了某个存在类的子类。如果一个类只使用一次,那么可以定义为匿名内部类。
建立匿名内部类的关键点是重写父类的一个或多个方法。再强调一下,是重写父类的方法,而不是创建新的方法。
因为用父类的引用不可能调用父类本身没有的方法!创建新的方法是多余的!!!

参考了其他同学的答案
回复 使用道具 举报
首先你要理解匿名内部类的定义前提:
内部类必须是继承一个类或者实现接口。
我的理解是应该不允许调用自己自定义的方法。
回复 使用道具 举报
这设计到了继承多肽的 向上和向下转型的问题了
  你A 引用是父类的引用  指向之类对象  这时的引用相当于是父类型的
  所以只能调用父类中的方法   而如果要调用之类的方法
就必须向下转型  强制转换了   子类名  xxx=(子类名)父类引用    转型后就可以调用子类中特有的方法了

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
补充LS一点:在多态的情况下,如果子类复写了父类的方法,那么在执行时是使用子类的方法
回复 使用道具 举报
王杰 黑马帝 2012-3-13 20:31:00
7#
多态问题,遇到这样的问题你必须将b向下转型为子类才可以调用!
回复 使用道具 举报
你这个不叫匿名内部类哦,匿名内部类是继承父类所以去new一下然后复写里面的方法 毕老师视频有特别讲,
如果你这个也算,也不是不能这么写的,只能复写方法吧
回复 使用道具 举报
袁野 黑马帝 2012-3-13 22:16:52
9#
哥们 多态啊  编译方法时候看左边 运行看右边   向下转型 才能使用子类方法
回复 使用道具 举报
djx900 黑马帝 2012-3-13 22:24:14
10#
A b=new A(){public void tes2(){}
只要A是父类    匿名内部类 老毕格式 没错  就对了 大括号里是 所谓的 覆盖 于被覆盖的方法。
回复 使用道具 举报
如果内部类只使用一次,在定义内部类的时候为了简化书写,
我们可以定义匿名内部类,匿名就是没有内部类名字
前提:内部类必须继承或实现一个类或接口.被继承的那个类或接口我们称之为父类
格式: new 父类名或接口{定义子类的内容} //当看到new的时候就要想到new一个对象,而且是一个内部类对象,只是没有内部类名字,故而叫匿名内部类

注意:大括号内是子类的内容,可以覆盖或实现父类中的方法,
父类只能访问自己的方法或者被子类覆盖后的方法.不能访问子类中特有的方法.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马