这个问题很少有人遇到,但是java中定义的属性或者方法是有上限的,可以粗略的计算为65535,也就是两字节无符号数的最大值;我在这里说的上限不是运行中内存不够之类发生的上限,而是无法通过编译为class字节码文件的上限。

测试结果

首先放出测试结果

我在测试类中什么都没有干,只是不停的在创建int类型的属性,最终在65501处触发了编译错误,而注释掉一个属性编译错误就不会发生。那么65535这个数是怎么来的呢?

字节码文件结构

首先解释下java的编译过程:首先java会把后缀为java的文件通过javac命令把其中的每个类编译为一个后缀为class的文件,其中的内容是以二进制存储的字节码信息,字节码信息包括的内容如下所示:

简单来说包括:魔数、class文件版本、常量池、访问标志、类(接口)索引、字段表、方法表和属性表的集合。其中u1、u2、u4、u8是这些部分的类型,分别代表无符号一字节、二字节、四字节、八字节的类型;看到这里可能你已经猜出来了,这些都是有上限的数字,u2最大就是65535,是不是和这个有关呢?

class文件中常量池的结构存储的是字面量和各种符号引用,字面量很好解释,类型的值可以在代码中写出来的都是字面量,比如String str = “abc”; 这里abc就是一个字面量,而符号引用就是由类的名称、修饰符和字段、方法的修饰符和名称组成的内容,在运行阶段会被替换成直接引用来指向运行时常量池(这里就不多介绍了);

分析

你定义一个属性,属性的名称就被处理为一个字符串存储在常量池中;而规定 常量池 的长度的数字使用的就是u2类型。也就是说最多定义65535个属性就是上限,而实际上会有其他的内容占用常量池的几十个的位置,所以属性的数量无法达到65535的极限罢了。

不仅是属性,方法的定义也是有上限的,因为方法的名称也会存储在常量池中。

再进一步,属性的名称的长度也是有上限的,常量池中规定字符串长度的数使用的也是u2类型,方法名、类名称、属性名等等需要使用到字符串的,长度都无法超过65535.

总结

class文件最长的类型就是u8,最大能表示的就是2^64-1,理论上java不存在没有上限的部分,只不过因为太大难以触及而已。长度上限不仅仅局限这些,方法数量、代码长度等等其他你能想到的,只要你写的够多够长都可以触发上限而无法通过编译。

JAVA中定义属性或方法的数量上限相关推荐

  1. Java中的属性和方法

    题目 实体类 测试类 转载于:https://www.cnblogs.com/maoxiuying/p/9130361.html

  2. java 数组定义方法_java中定义数组的方法有哪些

    java中定义数组的方法有哪些 发布时间:2020-06-25 18:10:36 来源:亿速云 阅读:130 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java中定义数组的方法,代码非常详细 ...

  3. python中定义数组的方法

    数组:数组(Array)是一种线性表数据结构.它用一组连续的内存空间,存储一组具有相同类型的数据. 注:Python中没有数组的数据结构,所以采用列表来表示数组这种数据结构 举个例子: a = [1, ...

  4. java中不允许一个方法在自身定义的内部调用自己_Java面向对象三大特性(基础篇)...

    面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA). 面向对象设计(OOD).面向对象程序设计(OOP)等新的系统开发方式模型的研究. 对语言 ...

  5. java 接口 属性_浅谈java接口中定义属性

    package com.supan.reflact; public interface PersonObject { /** * 在接口中定义属性的知识点: * 1,属性默认的修饰词是:public ...

  6. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  7. Java中定义抽象类Shape,其中包含抽象方法double getPeremeter( )求周长和double getArea( )求面积。 定义一个矩形类,继承此抽象类,并自行扩充成员变量和方法。

    Java中定义抽象类Shape,其中包含抽象方法double getPeremeter( )求周长和double getArea( )求面积. 定义一个矩形类,继承此抽象类,并自行扩充成员变量和方法, ...

  8. 在java中下列描述错误的是_在 JAVA 中 , 关于类的方法 , 下列描述错误的是 ()._学小易找答案...

    [多选题]价值的特性是 [简答题]输入任一字符串,统计其中数字,字母及其它字符个数 .(25分) [填空题]1.产品整体包括哪五个基本层次 2核心层次产品最基本的层次,是产品的_____ [单选题]纸 ...

  9. 遍历Java中的列表的方法

    本文翻译自:Ways to iterate over a list in Java Being somewhat new to the Java language I'm trying to fami ...

最新文章

  1. spring 两次进入拦截器_Spring Boot+Redis 扛住,瞬间千次重复提交(实例)
  2. c语言 整形数组如果输入回车,数字数组 输入字符'q'推出程序 输入enter,停止输入...
  3. 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
  4. RocketMQ的Consumer详解之重复消息的解决方案
  5. vue 生成发布包_年轻人如何从0到1封装发布一个vue组件__Vue.js
  6. mysql中函数大全_MySql 函数大全(一)
  7. Python怎么学?一定要掌握学习方法
  8. Linux环境SOCKET编程5:定时器接口timerfd
  9. linux 读写大文件内容,linux读写大文件
  10. CentOS+Subversion 配置Linux 下 SVN服务器
  11. gcc -l:手动添加链接库
  12. 超全!0基础程序员从入门到工作(持续更新...)
  13. Inno Setup 详解中文资料
  14. 计算机蓝屏代码0x0000007b,蓝屏代码0X0000007B各机型解决方法及原因
  15. PHP获取MP3时长类
  16. 蓝桥杯 T32大臣的旅费
  17. 苹果手机软件闪退怎么解决_LOL手游卡顿闪退怎么办-卡顿闪退解决方法解析
  18. 在Windows下使用Python编程
  19. mac修改默认python版本为python3
  20. C++ 实现两线段是否相交、相交情况、若相交求出交点坐标

热门文章

  1. java自定义注解实现校验对象属性是否为空
  2. (打通台式机与笔记本的连接通道)设置一个共享盘
  3. SolidCAM2017汉化版
  4. 谷歌广告账号注册很难?请收下这篇谷歌账号注册指南
  5. css水平居中:使用absolute+transform
  6. SAP中如何快速理解预留
  7. Consul中文文档—Consul打通k8s内外服务发现
  8. configuration和component的区别
  9. 遂冀机器人_河北省实施“机器人+”行动计划 到2020年全省机器人产业产值将超70亿元...
  10. javascript问题汇总