[英]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位二进制数表示的最高数字
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.