黑马程序员技术交流社区

标题: 匿名内部类的问题 [打印本页]

作者: 邱成    时间: 2012-9-5 23:40
标题: 匿名内部类的问题
本帖最后由 邱成 于 2012-9-6 07:19 编辑

interface Contents
{
        void go(){};
}



public class Test1 {
        public Contents con()
        {
                return new Contents()
                {
                        public void go()
                        {
                                System.out.println("I got it");
                        }
                };
        }
        
        public static void main(String [] args)
        {
                Test1 t = new Test1();
                Contents c = t.con();
                c.go();
        }


我想问下此处匿名内部类中的go()方法为什么一定要写明是public的(不然不能运行),难道匿名内部类内部成员默认是private?
作者: 杨鹏鹏    时间: 2012-9-6 00:02
报错:Cannot reduce the visibility of the inherited method from Contents
匿名内部类必须实现某个类或继承某个类。实现这个接口的匿名内部类的方法不能降低其可见性 ,而接口的方法都是public的,所以不定义为public会报错
作者: 武庆东    时间: 2012-9-6 00:06
晕死!这个匿名内部类实现的是接口,接口的里面的方法和属性均为public,所以必须是Public~

作者: 王陶成    时间: 2012-9-6 00:13
匿名内部类实现的是接口Contents,接口中的方法默认public,要实现接口就必须覆写它里面的抽象方法,子类覆写父类的抽象方法,覆写的方法的权限不能小于父类的方法权限,只能大于等于。public已经是最大权限,所以只能public
作者: 杨卓儒    时间: 2012-9-6 01:40
当要实现一个接口时,在接口中定义的方法都必须被定义为public的,否则,他们将只能得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这时java编译器所不允许的。
作者: 彭润生    时间: 2012-9-6 07:21
interface Contents
{
         void go(){};
}接口不要实现
interface Contents
{
      public void go();//接口就是要实现他的类来实现。
}
作者: 何明辉    时间: 2012-9-6 07:57
首先java中的接口的意思是为了扩展java类的功能,即解决了java类的单继承的局限。它是方法成员和成员变量的一种规范。在成员方法提供的规范是:public abstract 返回值类型 方法名(参数列表);前面的public 是为了提高访问权限,因为接口要用了被实现的,所以权限也应该被不同包的类去实现,所以定位public。abstract是应为没有方法体,因为接口不知道要被实现的类是什么功能,所以就抽象出了一种方法体规范,即必须覆盖本方法体实现自己的功能。既然是覆盖,那当然是实现类的相应的方法覆盖权限应大于会等于被实现接口方法的权限啦。匿名内部类也是类的一种表现形式,只是没有类名罢了
作者: 郭阳    时间: 2012-9-6 10:22
第一个问题:我想问下此处匿名内部类中的go()方法为什么一定要写明是public的?
      在接口中,接口成员有固定的修饰符,可以不写,但是不可以改变.如果不写,系统会自动添加
成员属性都被public static final修饰,  成员函数都被public abstaract修饰
所以在子类实现接口的时候,方法的权限必须不小于接口的权限,固为public是必须要写的
------------------------------------------------------------------------------------------------------------------------------------
第二个问题:难道匿名内部类内部成员默认是private?
匿名内部类和普通内部类在原理上是一样的.成员可以被public和private修饰符来修饰
如果前面不加修饰符的话,该成员的权限介于public和private之间(低于public,所以会报错)




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