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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陆鹏 于 2012-6-19 16:06 编辑

class InnerTest
{

        public static void main(String[] args)
        {
                new Object()
                {
                        public void function()
                        {
                                
                        }
                        
                }.function();


        }
}
代码中利用父类object建立了一个匿名子类对象,然后对function进行复写。可是复写要父类中有同名的函数才行呀?怎么知道object中有没有function呢?
而这种
class InnerTest
{

        public static void main(String[] args)
        {
                Object x = new Object()
                {
                        public void function()
                        {
                                
                        }
                        
                }
                                   x.function();
}
又不行了呢?

5 个回复

正序浏览
李盼 发表于 2012-6-16 15:28
上面那种写法是创建一个Object的匿名子类,并且在子类里写了一个方法function,同时调用这个方法。这个func ...

的确是这样,function()算是匿名子类对象的特有方法,而Object中没有该方法,是不能被父类引用指向子类对象调用的。
回复 使用道具 举报
第一种情况只是创建一个匿名类并让该类继承Object类,子类中当然可以定义和父类当中不一样的方法和属性,你这里是定义了子类特有的方法function,然后直接调用。
第二种情况是一种多态,Object x标明x是Obje类型的一个引用变量,右边是其子类对象,在多态形式中,对象调用的方法只能是父类中声明的,而Objec类中没有声明function方法,所以错误。
回复 使用道具 举报
复写父类的方法的话一般都是要加上@Override注解以防止子类把要复写的方法写错,不加表明这是子类新增加的方法!这是effective java里面的一天编程实践。匿名内部类中的方法不一定要是父类中有的方法,匿名内部类也跟普通的类一样,可以有自己的方法和属性等等!
所以你上面写的 function()方法不一定要是Object类有的方法,当然,如果你希望是父类有的并且希望在子类中重写父类的法,那么就加上@Override注解吧,这样如果父类没有相应的方法的话编译时期就会报错了,就不会有出现意想不到的情况!!!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 龙秋地 于 2012-6-16 15:42 编辑
  1. Object x = new Object()
  2.                 {
  3.                         public void function()
  4.                         {
  5.                                 
  6.                         }
  7.                         
  8.                 };楼主差了个分号.
复制代码
还有一点我查了一下API发现java.lang.Object类中没有function()方法,这是楼主自己定义的,
毕老师说写匿名类的目的就是简化书写,覆盖方法,既然Object类中没有function()方法,那么你就没有复写,
那x.function()就没有意义了,所以说是错误的.
毕老师第九天-04(匿名内部类)中的视频你可以看一下有例子.

回复 使用道具 举报
本帖最后由 李盼 于 2012-6-16 15:38 编辑

上面那种写法是创建一个Object的匿名子类,并且在子类里写了一个方法function,同时调用这个方法。这个function方法如果Object类里面有,你就是复写了此方法,如果没有,你就是自己定义的一个方法,所以不需要知道父类中到底有没有该方法,继承父类的要求是要复写父类中所有的抽象方法,否则该类也为抽象类。而非抽象方法可复写,可不复写。

而下面这种你是父类引用x指向子类匿名对象,你都书写正确了,可是为啥报错呢,因为你疏忽了一点
Object x = new Object()
        {
                public void function()
                {
                        
                }
               
        };
看,最后加一个分号,这句话才算写完了!
但是你的 x.function();这句话就不能写了,因为父类引用指向子类对象的时候,是不能使用子类特有的方法,而Object里面没有function方法,所以会报错!

点评

说的太完美了!无需多言精辟简洁  发表于 2012-6-16 17:01

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马