笔记-Java基础方法表集合

    方法表和字段表差不多,Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方法,方法表的结构如同字段表一样,依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合(attributes)几项见表6-11。这些数据项目的含义也非常类似,仅在访问标志和属性表集合的可选项中有所区别。

    因为volatile关键字和transient关键字不能修饰方法,所以方法表的访问标志中没有了ACC_VOLATILE标志和ACC_TRANSIENT标志。与之相对的,synchronized、native、strictfp和abstracthiam关键字可以修饰方法、所以方法表的访问标志中增加了ACC_SYNCHRONIZED、ACC_NATIVE、ACC_STRICTTFP和ACC_ABSTRACT标志。对于方法表,所有的标志位以及取值可参见下表。

     

    也许会有读者产生疑问,方法的定义可以通过访问标志,名称索引,描述符索引表达清楚,但方法里面的代码去哪里了?方法里的java代码,经过编译器编译成字节码指令后,存放在方法属性表集合中一个名为“Code”的属性里面,属性表是Class文件格式中最具扩展性的一项数据项目。

   与字段表集合相对应的,如果父类方法在子类中没有被重写(Override),方法表集合中就不会出现来自父类的方法信息。但同样的,有可能会出现 由编译器自动添加的方法,最经典的便是类构造器“<clinit>”方法和实例构造器"<init>"方法。

   在Java语言中,要 重载(Overload)一个方法,除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包含在特征签名中,因此Java语言里面试无法仅仅依靠返回值的不同来对补一个已有方法进行重载的。但是在Class文件格式中,特征签名的范围更大一些,只要描述符不是完全一致的两个方法也可以共存。也就是说如果两个方法有相同的名称和特征签名,但返回值不同,那么也是可以合法共存于一个Class文件中的。

猜你喜欢

转载自blog.csdn.net/helianus/article/details/92077195
今日推荐