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为静态域并且在静态块中被赋值,那么就按照静态域和静态块在程序中出现的顺序先后执行;如果同时还在实例块中被赋值,则再执行实例块中的赋值语句(静态域不可能再是实例域);最后执行构造器中的赋值语句(如果在构造器中有被赋值的话)。如果变量a是实例域,则不会有静态域和在静态块中赋值(不能在静态块中给实例域赋值)的情况,其他同前所述。
  
  总结:静态域是指静态域在声明时被赋值,静态块是指在静态块中被赋值,实例域和实例块同上。上面列出的四个步骤是先后执行的;括号中的两种方式是同等级的,按照在程序中的顺序执行,排在前面的先执行,排在后面的后执行。
  
  二、装载类时域的初始化
    有两种情况是只装载类而不实例化类,一是用java classname执行程序时;二是用classname.statement调用类的静态域或静态方法时。

  装载类时这个类并没有被实例化,也就不能形成对象,所以不能对实例域进行初始化。因此只有静态域、静态块才能被初始化执行,执行规则同构建对象时的规则。


多态在域的问题上是特殊的。我理解不了中文版的书直接叫域,看了英文原版,原版写的是fields,直接翻译虽然没错,但是出问题的变量不是域。特地查了what is the meaning of field in java?很多人把它看成是由花括号括起来的一个范围。其实框架里面也有一种东西——domain model,这个也叫域,域模型。


然后找到这篇文章

What is a field in java?


A field is an attribute. A field may be a class's variable, an object's variable, an object's method's variable, or a parameter of a function.

class bike{ 
  static int bikes;
  int gear;
  int cadence;

  void create( int newGear, int newCadence ){
    bikes = bikes + 1;
    gear = newGear;
    cadence = newCadence;}
  int getSpeed(){
    int speed = gear*cadence*5*3.141;
    return speed;
  }
}

'bikes' is a class's variable (class variable) (static field).
'gear' and 'cadence' could be an object's variables (instance variables) (non-static fields).
'speed' is an object's method's variable (local variable).
'newGear' and 'newCadence' are parameters of a function (parameters).


field,域是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。(补充,class‘s variables,类的实例变量和静态变量称为class's variables,类属变量,也称类变量或数据域,其实翻译成属性也可以,类属性,听起来不会怪怪的,来自百度百科)。

class bike{ 
  static int bikes;
  int gear;
  int cadence;

  void create( int newGear, int newCadence ){
    bikes = bikes + 1;
    gear = newGear;
    cadence = newCadence;}
  int getSpeed(){
    int speed = gear*cadence*5*3.141;
    return speed;
  }
}
bikes是一个类变量(静态域)。

gear 和 cadence 是对象变量(实例变量)(非静态域)。

(这里有一点点小矛盾,其实这样照百科这样说,那么bikes、gear和cadence都是类变量,bikes是类变量中的静态变量,而gear和cadence是类变量中的实例变量。)


speed是对象方法的变量(局部变量)。

(看到没有,local variable,java没有出现gobal variable,全局变量,要说的话类变量的作用范围和全局变量一样,只不过不那样叫)。


newGear和newCadence是函数(方法)的参数(参数)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值