黑马程序员技术交流社区

标题: Java中关于域的理解 [打印本页]

作者: ziyangfgt    时间: 2017-6-16 17:14
标题: Java中关于域的理解
1.java中的域


所谓的域,翻译成英文就是field, 也就是我们常说的字段,或者说是属性。 比如类的字段(属性),局部的,全局的。所谓域,其实是“field”的翻译


然后实例域,就是 实例(“object” )的”field”。包括实例域和静态域,静态域又叫类域。


java中对象中的数据称为实例域(instance field)。


2.静态域





      如果将域定义为static,那么每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,假定需要给每一个雇员赋予唯一的表示码。这里给Employee类添加一个实例域id和一个静态域nextld:


class Employee


{


     private int id;


     private static int nextId=1;


}


现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextid域,换句话说,如果有1000个Employee类的对象,
则有1000个实例域id,但是只有一个静态域nextid,即使没有一个雇员对象,静态域nextil也存在,他属于类,而不属于任何独立的对象。


3.java中域的初始化


初始化域即给域赋值有以下几种方式:

1)、赋予默认赋值

2)、声明变量时同时赋值

3)、块赋值(实例块和静态块)

4)、构造器赋值


如果同时存在以上几种赋值方式,那么域的最终值会是哪个呢?这里就涉及到域的初始化顺序的问题,同时也是下面要讲到的问题。



我们把域的初始化分为两种情况,一种是在建立对象即进行类的实例化时域的初始化;另一种是在不建立对象,只装载类的时候域的初始化。


一、构建对象时域的初始化

构建对象,就是用new class()语句建立一个新的类的对象。在这种情况下,类中的域是按照如下顺序进行初始化的:赋予默认值—>(静态域、静态块)—>(实例域、实例块)—>构造器。

下面我给解释一下,假设一个域即变量int
a,当建立对象时,首先赋予它一个默认值,int类型的默认值为0;如果a为静态域并且在静态块中被赋值,那么就按照静态域和静态块在程序中出现的顺序先
后执行;如果同时还在实例块中被赋值,则再执行实例块中的赋值语句(静态域不可能再是实例域);最后执行构造器中的赋值语句(如果在构造器中有被赋值的




总结:静态域是指静态域在声明时被赋值,静态块是指在静态块中被赋值,实例域和实例块同上。上面列出的四个步骤是先后执行的;括号中的两种方式是同等级的,按照在程序中的顺序执行,排在前面的先执行,排在后面的后执行。



二、装载类时域的初始化

有两种情况是只装载类而不实例化类,一是用java classname执行程序时;二是用classname.statement调用类的静态域或静态方法时。

装载类时这个类并没有被实例化,也就不能形成对象,所以不能对实例域进行初始化。因此只有静态域、静态块才能被初始化执行,执行规则同构建对象时的规则。
作者: ITevil    时间: 2017-6-16 17:19
很好,不过有点太细致了。
作者: hy2014051202    时间: 2017-6-16 19:23
不错,长知识了
作者: hy2014051202    时间: 2017-6-16 19:24
不错长知识
作者: 烽火狼烟    时间: 2017-6-17 12:31
嗯 很不错




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2