繁体   English   中英

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

[英]How many interface we can declare within a class in java/android

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

这是65535吗? 如果是,那为什么呢? 如果没有,限制是什么,为什么?

就像是:

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

提前致谢

是! 根据Java虚拟机的官方规范 似乎字段,方法和嵌套类型信息均存储在某种大小有限的结构中。

如果您要问为什么选择65535 仅仅是因为 :

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

4.11。 Java虚拟机的局限性

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

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

通过ClassFile结构(第4.1节)的fields_count项的大小,可以由类或接口声明的字段数限制为65535。

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

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

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

通过ClassFile结构(第4.1节)的interfaces_count项的大小,类或接口的直接超级接口的数量限制为65535。

调用方法(第2.6节)时创建的框架的局部变量数组中的局部变量的最大数目受Code属性(第4.7.3节)的max_locals项的大小限制为65535,从而给出了代码的代码。方法,并通过Java虚拟机指令集的16位局部变量索引来实现。

请注意,long和double类型的值均被视为保留两个局部变量,并向max_locals值贡献两个单位,因此使用这些类型的局部变量会进一步减小此限制。

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

请注意,long和double类型的值各自被认为对max_stack值贡献了两个单位,因此在操作数堆栈上使用这些类型的值会进一步减小此限制。

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

请注意,方法描述符是根据方法参数长度的概念定义的,其中long或double类型的参数为该长度贡献两个单位,因此这些类型的参数进一步减小了限制。

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

请注意,限制是编码中的字节数,而不是编码的字符数。 UTF-8使用两个或三个字节对某些字符进行编码。 因此,进一步限制了包含多字节字符的字符串。

数组中的维数受multianewarray指令的维操作码大小以及对multianewarray,anewarray和newarray指令施加的约束(第4.9.1节,第4.9.2节)限制为255。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM