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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-5 23:40  /  1684 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 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?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
报错:Cannot reduce the visibility of the inherited method from Contents
匿名内部类必须实现某个类或继承某个类。实现这个接口的匿名内部类的方法不能降低其可见性 ,而接口的方法都是public的,所以不定义为public会报错
回复 使用道具 举报
晕死!这个匿名内部类实现的是接口,接口的里面的方法和属性均为public,所以必须是Public~
回复 使用道具 举报
匿名内部类实现的是接口Contents,接口中的方法默认public,要实现接口就必须覆写它里面的抽象方法,子类覆写父类的抽象方法,覆写的方法的权限不能小于父类的方法权限,只能大于等于。public已经是最大权限,所以只能public
回复 使用道具 举报
当要实现一个接口时,在接口中定义的方法都必须被定义为public的,否则,他们将只能得到默认的包访问权限,这样在方法被继承的过程中,其可访问权限就被降低了,这时java编译器所不允许的。
回复 使用道具 举报
interface Contents
{
         void go(){};
}接口不要实现
interface Contents
{
      public void go();//接口就是要实现他的类来实现。
}
回复 使用道具 举报
首先java中的接口的意思是为了扩展java类的功能,即解决了java类的单继承的局限。它是方法成员和成员变量的一种规范。在成员方法提供的规范是:public abstract 返回值类型 方法名(参数列表);前面的public 是为了提高访问权限,因为接口要用了被实现的,所以权限也应该被不同包的类去实现,所以定位public。abstract是应为没有方法体,因为接口不知道要被实现的类是什么功能,所以就抽象出了一种方法体规范,即必须覆盖本方法体实现自己的功能。既然是覆盖,那当然是实现类的相应的方法覆盖权限应大于会等于被实现接口方法的权限啦。匿名内部类也是类的一种表现形式,只是没有类名罢了
回复 使用道具 举报
第一个问题:我想问下此处匿名内部类中的go()方法为什么一定要写明是public的?
      在接口中,接口成员有固定的修饰符,可以不写,但是不可以改变.如果不写,系统会自动添加
成员属性都被public static final修饰,  成员函数都被public abstaract修饰
所以在子类实现接口的时候,方法的权限必须不小于接口的权限,固为public是必须要写的
------------------------------------------------------------------------------------------------------------------------------------
第二个问题:难道匿名内部类内部成员默认是private?
匿名内部类和普通内部类在原理上是一样的.成员可以被public和private修饰符来修饰
如果前面不加修饰符的话,该成员的权限介于public和private之间(低于public,所以会报错)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马