黑马程序员技术交流社区

标题: 关于匿名内部类问题,求解! [打印本页]

作者: 胡文杰    时间: 2011-11-9 07:49
标题: 关于匿名内部类问题,求解!
匿名内部类可以使用继承(extends)其他类,是否可以实现(implements)其他接口的方法呢?为什么?
作者: 刘福双    时间: 2011-11-9 08:02
举个例子:
class Student extends Person implements Runner
{
   ......
   public void run ()
    {
         System.out.println("the student is running");
    }
   ......
}
extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用
extends 继承就像只能有一个父亲,implements 接口就像妻子可以有多个(想法比较邪恶,但是有助于你的理解)
作者: 杨超    时间: 2011-11-9 08:41
{:soso_e128:}楼上对implements的解释好有才{:soso_e179:}
作者: 刘福双    时间: 2011-11-9 08:43
杨超 发表于 2011-11-9 08:41
楼上对implements的解释好有才

编程源于生活,爱成活,爱编程!
作者: 喻尚健    时间: 2011-11-9 15:24
匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。匿名内部类的继承和实现接口和一般类是有区别的,希望这个列子对你有帮助。
interface Product
{
        public double getPrice();
        public String getName();
}
public class TestAnnoymous {
        /**
         * @param args
         */
        public void test(Product p)
        {
                System.out.println("购买了一个"+p.getName()+"花掉了"+p.getPrice());
        }
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                TestAnnoymous ta=new TestAnnoymous();
                ta.test(new Product(){
                        public double getPrice()
                        {
                                return 3454;
                        }
                        public String getName()
                        {
                                return "电脑";
                        }       
                });               
        }
}

作者: 柴亚飞    时间: 2011-11-9 15:36
二楼和5楼,没有弄清楚楼主提的问题。或许楼主自己都没弄清楚。

你们应该去查查什么叫匿名内部类。5楼举得例子是一个内部类,但不是匿名内部类。你的类是有名字的。

匿名内部类必须跟在new之后,是一个已经存在的类。而继承和实现接口的概念是在定义类的时候完成的。作为一个已经存在的类,它本身已经被定义好了,不需要再次被定义。所以没有继承和实现接口这个概念。
作者: 柴亚飞    时间: 2011-11-9 15:44
刚才的说法有问题啊,
匿名内部类必须跟在new之后,是一个“即将”存在的类。而继承和实现接口的概念是在定义类的时候完成的。作为一个“即将“存在的类,它本身被定义的时候就和平时的类没什么太大的区别。可以继承也可以实现接口。
匿名类是一种特殊的内部类,它是在一个表达式内部包含一个完整的类定义。所谓的匿名就是该类连名字都没有,匿名内部类不可以有构造器,因为匿名内部类是要扩展或实现父类或接口。匿名内部类可以继承其他类,因为是类就是继承自Object类的。


作者: 郭学文    时间: 2011-11-9 15:46
看得我心慌
匿名内部类可以继承可以实现接口?
如何个写法?

emnu {
test{
public void say(){
sop(" 我要继承,可是这个继承要在哪里写?继承和实现不是在类名后写的吗?没有名字我应该在哪写呢,好心慌");
}
}

}
作者: 胡文杰    时间: 2011-11-9 15:53
柴亚飞 发表于 2011-11-9 15:44
刚才的说法有问题啊,
匿名内部类必须跟在new之后,是一个“即将”存在的类。而继承和实现接口的概念是在定 ...

受教了,可是如果在匿名内部类中有一个函数方法,在加载所在的类时,这个匿名内部类就会被实例化,其方法函数在方法区会存储,但是如何去调用它的函数方法呢?!还是在实例化这个匿名内部类就会运行它其中的方法呢?!这个怎么理解啊?它的用法又主要体现在何处呢?!
作者: 柴亚飞    时间: 2011-11-9 16:08
胡文杰 发表于 2011-11-9 15:53
受教了,可是如果在匿名内部类中有一个函数方法,在加载所在的类时,这个匿名内部类就会被实例化,其方法 ...

你能把你使用匿名类的具体程序写出来吗?我不是很理解你的问题。
我印象中,之所以用匿名类的使用场合就是因为只在某个地方用一次,不需要再次引用。如果需要再次在别的地方引用我就不用匿名类了。用使用范围更大的类来代替。
作者: 坚强    时间: 2011-11-9 22:22
柴亚飞 发表于 2011-11-9 15:44
刚才的说法有问题啊,
匿名内部类必须跟在new之后,是一个“即将”存在的类。而继承和实现接口的概念是在定 ...

那么楼主到底在问什么呢?
作者: 坚强    时间: 2011-11-9 22:24
坚强 发表于 2011-11-9 22:22
那么楼主到底在问什么呢?

额 我发错了,不好意思。。。还以为你是楼主
作者: せR3n、何必装纯    时间: 2011-11-10 14:01
1、什么是匿名内部类?

      内部类,存在于另一个类内部的类,而匿名内部类,顾名思义,就是没有名字的内部类。



2、为什么需要匿名内部类?

     每个inner class都能够各自继承某一实现类(implementation)。因此,inner class不受限于outer class是否已继承自某一实现类。



如果少了inner class所提供的“继承自多个具象(concrete)或抽象(abstract)类”的能力,设计上和编程上的某些问题会变得十分棘手。



所以,从某个角度来看inner class,你可以说它是多重继承问题的完整解决方案。interface能够解决其中一部分问题,但inner classes



才能有效而实际地允许“多重实现继承(multiple implementation)”。也就是说,inner classes实际上允许你继承多个non-interface。



从这个层面上使用内部类时一般都是通过其父类或继承的接口来进行实例化和初始化的,如3中所示,这时内部类的名字是多余的,所以



就使用了匿名内部类

3、怎么实现匿名内部类?

     匿名内部类的实现非常简单,如有一接口



Interface A{



    public void method();



}



这时你可以写一个如下的语句得到接口A的实现类的对象



A a=new A(){ public void method(){System.out.println("hehe");} };



而其中的{ public void method(){System.out.println("hehe");} };就是定义了一个匿名内部类







4、问题答案





    以上可以看出匿名内部类在实现时必须借助一个类或一个接口,若从这个层次上讲它是可以继承其他类也可以实现接口的,



但若是通过extends
或implements
关键字那是不可能的




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