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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙浩迪 中级黑马   /  2012-6-16 22:50  /  1767 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



interface Contents
{
        int value();
}



class Parce
{
        public Contents contents()
        {
                return new Contents()
                {
                        private int i = 11;
                        public int value()
                        {
                                return i;
                        }
                };
        }
        public static void main(String[] args)
        {
                Parce p = new Parce();
                Contents c = p.contents();
                        
        }


}

7 个回复

倒序浏览
匿名内部类中的方法为什么一定要声明为public,用默认修饰,和private都会报错。
回复 使用道具 举报
匿名内部类的其实就是内部类的简写形式,那么能简写的前提就是 该内部类必须是继承一个父类或者实现接口。
而类在继承父类或实现接口时,该类要有足够大的权限才能对父类或接口的成员进行访问等操作。
回复 使用道具 举报
本帖最后由 李盼 于 2012-6-16 23:48 编辑

所有接口中定义的方法都是public和abstract的,所有的成员变量都是public sattic final的,即使在书写的时候省略不写,系统也会默认加上。
而子类重写父类的方法有个要求就是不能定义比父类方法更严格的范围修饰符!
回复 使用道具 举报
实际上你的问题不是匿名内部类的问题,而是对于接口,和接口的实现问题,下面用一个简单的范例说明一下
  1. interface ImplDemo
  2. {
  3.         int method(int i , String str);
  4.         int value(); //-->首先这里接口中定义的方法都是用 public abstract 修饰的就算不写,系统都会默认加上去
  5.         //public abstract int value();
  6.         //接口中的变量都用 publi static final 修饰,也就是一个静态的最终值,只能使用不能修改
  7. }

  8. //实现接口
  9. //实现类,必须要实现接口中的所有方法,实现类的方法修饰符,返回值,方法名,以及参数都必须和接口中的方法对应相同

  10. class Impl implements ImplDemo
  11. {
  12.         public int value()
  13.         {
  14.                 return 1;
  15.         }
  16.         public int method(int i , String str)
  17.         {
  18.                 return 1;
  19.         }
  20. }
复制代码
回复 使用道具 举报
首先匿名内部类的方法和成员变量是可以用private修饰的,
你这里用了private会报错是因为value()这个方法是实现接口中的value()方法的,而当一个子类去复写父类中的方法时,要求方法名,返回值,参数,修饰等都是相同的,所以在你这个内部类中,value()只能用public去修饰。
回复 使用道具 举报
王月 中级黑马 2012-6-17 08:54:30
7#

LZ先明白匿名内部类的前提:内部类要继承或实现一个外部类或者接口。
也就是说要建立一个带内容的外部类或者接口的子类匿名对象,而接口中的成员的修饰符是固定的:
    1:修饰成员变量时修饰符为:public static final
     2:修饰成员方法时修饰符为:public abstract
所以受接口中的成员都是用public修饰的,就算没有java虚拟机会默认加上。既然内部类要继承或实现一个外部类或接口,那子类的方法权限一定要大于等于父类的权限。
所以接口inteface Contents中的int value()方法实际上是 public abstract int value(),那么你子类中的方法当然要用public修饰了。

这已经很详细了吧。
回复 使用道具 举报
刘笑 中级黑马 2012-6-17 10:19:27
8#
关于重写,子类方法不能比父类方法限制有更严格的访问级别。由于父类中value()方法是默认public的,那么子类中的value()方法权限不应该比public更严格,所以只能是public。
关于子类重写父类中的方法还有另外几个规则:
1、数列表必须与被重写方法的相同。如果子类方法的参数与父类对应的方法不同,是重载
2、回类型必须与被重写方法相同
3、写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马