我们可以在java / android中的类中声明多少接口

时间:2016-07-28 05:33:48

标签: java android interface

我们可以在一个类中声明多少接口。

这个数字 65535 ?如果是,那么为什么?如果不是,限制是什么?为什么?

类似的东西:

public class GenericModelLinker {
   public interface Link {
      Object getProperty(IAdaptable n);
      void setProperty(IAdaptable n, Object value);
   }
 // .........so on
}

先谢谢

1 个答案:

答案 0 :(得分:0)

是的!根据Java虚拟机的官方Specifications。看起来字段,方法和嵌套类型信息都存储在某种有限大小的结构中。

如果您问为什么65535?仅仅因为:

  

它是可以用无符号表示的最高数字   16位二进制数

4.11。 Java虚拟机的局限性

  

隐含了Java虚拟机的以下限制   类文件格式:

     

每类或每接口常量池限制为65535   ClassFile的16位constant_pool_count字段的条目   结构(§4.1)。这是对总数的内部限制   单个类或接口的复杂性。

     

类或接口可以声明的字段数   ClassFile的fields_count项的大小限制为65535   结构(§4.1)。

     

请注意ClassFile的fields_count项的值   结构不包括从超类继承的字段   或超级接口。

     

类或接口可以声明的方法数   由methods_count项的大小限制为65535   ClassFile结构(§4.1)。

     

请注意ClassFile的methods_count项的值   结构不包括从中继承的方法   超类或超级接口。

     

类或接口的直接超接口的数量是   由interfaces_count项的大小限制为65535   ClassFile结构(§4.1)。

     

局部变量数组中最大数量的局部变量   在调用方法(第2.6节)时创建的帧限制为65535   通过Code属性的max_locals项的大小(§4.7.3)   给出方法的代码,以及16位局部变量   索引Java虚拟机指令集。

     

请注意,long和double类型的值都被认为是   保留两个局部变量,并为此提供两个单位   max_locals值,因此进一步使用这些类型的局部变量   减少这个限制。

     

帧中操作数堆栈的大小(第2.6节)限制为65535   代码属性的max_stack字段的值(第4.7.3节)。

     

请注意,long和double类型的值都被认为是   向max_stack值贡献两个单位,因此使用值   操作数堆栈上的这些类型进一步降低了这个限制。

     

通过定义,方法参数的数量限制为255   方法描述符(§4.3.3),其中限制包括一个单位   在实例或接口方法调用的情况下。

     

请注意,方法描述符是根据概念定义的   方法参数length,其中long或double类型的参数   有两个单位的长度,所以这些类型的参数   进一步减少限制。

     

字段和方法名称,字段和方法描述符的长度,   和其他常量字符串值(包括那些引用的值)   ConstantValue(§4.7.2)属性限制为65535个字符   CONSTANT_Utf8_info结构的16位无符号长度项   (§4.4.7)。

     

请注意,限制是在编码中的字节数而不是   关于编码字符的数量。 UTF-8编码一些字符   使用两个或三个字节。因此,字符串包含多字节   角色受到进一步限制。

     

数组中的维数限制为255   multianewarray指令的维度操作码和   对多重战争,新阵型和新阵列的限制   说明(§4.9.1,§4.9.2)。