00:00
来接着咱往下看,在类索引,负类索引,接口索引集合之后啊,咱们下边呢,有三块这个也是重量级的内容,分别对应的呢,叫做字段表集合,就是我们平时所说的类中的属性啊,咱们平时说的那个属性啊,其实翻译的不是特别好,这里边那个属性啊叫attribute是有专门的指向的,咱们现在呢,诶说的这个字段啊,就是咱们Java里边呢,定义的这个成员变量。啊,英文呢,对应的叫field,咱们以前呢翻译成属性,嗯,或者我这块有时候也也顺口了哈,就是总爱说成属性,但其实呢,我们准确的说呢,哎,应该翻译成叫字段,嗯,这块大家注意一下,咱们这个叫字段,那关于我们这个类当中声明的字段,声明的方法包括呢,我们额外的一些信息,这个我们称为呢叫属性信息,这呢也是我们说比较重的三块内容,这三块内容呢,对应到我们这个,呃,DEMO为例的话呢,最起码文件当中就是我们剩下的这一部分,所以呢,从这个比重上来看的话,其实也不少,对吧。
01:01
好,那下面我们就分别呢来进行一个介绍,首先的话呢,我们来看一下叫字段表集合,把它呢打开。字段呢,就是我们所说的这个field对吧,它呢是用于描述接口或者是类当中声明的变量。那明确一点,就我们这里边说的这个字段啊,它主要指的就是我们所说的叫成员变量,这个成员变量呢,你可以是静态的,那就是类级变量,也可以呢,是非静态的,就我们平时所说的叫实例变量。只有包括这两种,就是只有这个成现变量不包括呢,我们在方法内部呀,代码块内部呀,包括构造器内部呀,咱们声明的那个叫局变量,局变量呢,是不会出现在我们这个fuse这个字段表集合当中的啊,这个大家要注意,或者换句话说呢,我们在方法内啊,代码框内声明了,咱们也不把它称为叫叫field对吧,咱们顶多呢说你就是一个variable,而且呢,我们一般呢,把它们都称为呢,叫什么呀,是不是叫local variable啊。啊,或者叫local variables对吧,那我们只有在这个当前类中生命的这些变量,我们才称为呢,叫做field,对吧。
02:07
下面一个呢,说字段呢,叫什么名字,字段呢被定义成什么数据类型,这些呢都是无法固定的。那只能呢,呃,引用常量池中的常量啊来进行描述,就是说白了就是我们这个字段表中仍然需要用到我们常量池当中的这样的一些结构。指向常量值索引的集合,它描述了每个字段完整信息,比如说呢,标识符,访问的修饰符,这个是类变量还是是类变量,是否是常量等等,这些信息呢,在我们字段表集合当中都有所展示。好,下面我们来看这个注意事项,说字段表集合当中不会列出,这一定要注意,不会列出呢,从负类或者呢叫实现的接口当中继承而来的字段。不会从这个负类或者说这个切口中继承过来,字段在我们这个当前的类的字段表中是不会呈现的,那也就是说呢,比如说咱们打开这个前面讲的这个sun是吧,这个sun里边呢,它在负类中呢,也声明了一个X,在我们当前这个sun这个类中也生明X,如果我们去查看这个sun这个类,它的这个FS的话,里边是不会包含两个的,像咱们当前这里边是不是就只有一个属,呃叫字段对吧。
03:18
比如我们这块呢,再进行一个编译。编译完之后呢,咱们通过这个呢,这个插件呢,简单来看一下,你看此时呢,我们这个F这里边呢,只有一个对吧,只有一个就是我们算自己定义的这个负类中生命的这个变量。是不会呈现在我们这个子类的这个F这个表集合当中的啊,这个大家要注意一下这个问题。但是呢,它有可能列出说我们原本Java代码当中不存在的字段,就是我们当前这个类里边呢,假设就声明了一个,但是有可能会呈现出来更多个,嗯,这个呢,是有可能我们在内部类的时候啊,为了保证呢,对外部类的一个访问性呢,会添加指向外部类实例的一个字段。
04:01
这个大家了解一下这个事儿就可以了。哎,知道有这个问题啊,然后呢,在我们Java语言当中这块呢,大家关注一下啊,挺有意思的,说在咱们Java言当中啊,咱们说这个字段呢,是没办法重载的,毫无疑问对吧,那两个字段呢的数据类型修饰符,不管是不是相同,不管你一样也好,不一样也好,主要呢,我们在一个类当中,咱们是不可以声明相同名字的属性的。我指的是同一个类当中不能声明相同名字的属性,对吧,这个大家应该都很清楚,这个不算,这是父类子类,这个是没关系的,对吧?那如果我们现在再声明一个,即使你这个类型呢,变了,我也叫X这个,哎30呃30.1F这呢也是不允许的,就是在咱我们Java,在咱们这个Java语言当中啊,你在一个类当中,不管你这个类型啊,权限啊,包括负的值啊,是不是一样,关键的就是我们不能定义两个同名的。这个field。是因为呢,这两个我们说变量它的作用率咱们都是目前都是非静态的是吧,它俩的作用率呢,是不是在我们这个类当中完全是一样的呀,那么在它们作用率的有效范围内呢,我们是没有办法区分这两个X的。
05:10
对吧,没办法区分,所以呢,我们是不允许这样子来定义的,这个大家都很清楚对吧,但是从我们叫自解码文件的这个角度来看,只要两个字段的描述符不一样,我们就认为呢,它的这个重名是合法的。这句话大家看能理解吗?就是咱们接下来呢,是不是要看这个字段表,如果这个字段表里边既然提到是表了,就有可能是不是有多个呀,那多个的话呢,说比如我们这是一个字段元素,这呢又是个字段元素,这个名称的话呢,也只是我们这个字段中的一个信息,那除了这个名称之外呢,是不是还包含了你当前这个字段的类型啊,你的这个权限呀,是吧,哎,是不是常量啊等等这样的一些描述,那我们说呢,在这个方法表里边,只要这两个其中有一些描述符是不一样的,咱们就认为算是合法的。
06:04
就是和就是Java虚拟机这个资金码的这个合法性字段的合法性,跟咱们说Java语言这个字段的合法性呢,它是不太一样的是吧,主要说的就是这个问题啊,这个大家呢,也是整体了解一下就可以了。那我们写代码肯定是关注于这个Java语法层面的,你得更严格一些,你不能这样定义两个同名的X,对吧,这个仍然是我们要遵守的啊。了解一下我们这个虚拟机中的一个自解码文件啊,不能叫虚拟拟中码,只能说叫虚拟规范中啊,虚拟机本身是不包括我们自解码这个结构的,它是从内在加载器开始,加载磁解码开始,对吧,只能说规范里边我们这个磁解码自解码呢,是允许这样的一个情况啊。好,那关于这个字段表集合主要呢,提到表了,那只要是表,我们一开始都会有一个计数器,所以呢,首先我们提到了叫FS count叫字段的一个计数器,表示呢,当前我们这个class文件当中,这个字段表的一个成员个数,它是用两个字节来表示。
07:02
凡是大家遇到这个计数器的时候呢,都是两个字节来表示,所以这呢是一个,呃,默认行为,知道这个就可以了,然后的话呢,我们接下来你比如说你得到这个计数器是几之后呢,下边就是一个一个的这个字段了,那就是对应的就我们这个表结构,那回到咱们当前这个DEMO当中,DEMO当中在我们实现的接口计数器之后,这样的一个两个字节,就是表示我们当前这个字段的个数,对吧,所以叫字段计数器。这块我们也给他写一个啊。咱们用一个颜色。就那个颜色吧。我写到这儿称为呢,叫字段计数器。好,那当前我们这个DEMO这个类当中啊,咱们只有一个字段,其实咱这也清楚,这一个字段呢,是不是对应的就是咱们代码当中的。找到我们这个DEMO就声明的这个number呀,行,那接下来的话呢,就我们看一下这个字段表当中,对于这个number呢,看都有哪些信息来进行描述啊,这呢是我们先对这个字段表集合进行整体的一个描述。
我来说两句