一、变量分类 Java语言规定4种类型的变量: (1)实例变量 也就是在类中声明的不用static关键字修饰的变量。类的每一个实例保存在其变量中的值各不相同,与每个对象相关。由于每个实例都有一份该变量,因此称为实例变量。 (2)类变量 如果在类中用static关键字声明一个变量,那么该变量就是一个类变量。static关键字告诉Java系统该变量在内存中只有一份拷贝,无论类的那个实例访问该变量,所得到的都是同一个东西。即各个实例共享该变量,就好像类拥有该变量似的,因此称为类变量。 以上两类变量直接在类中声明,用来保存对象状态,被称之为类的域,或者域变量。可以用修饰符来修改域变量,对其访问权限作出限定。 (3)本地变量 类似于域变量,用来保存类方法中的临时状态。本地变量在类的方法中、或者方法内的语句块中,其作用域限于声明其的方法或者语句块内。声明一个变量不需要特殊的关键字来指定。 (4)参数 传递给方法的参数也使一种变量,通常参数声明放在方法名称后的括号内。需要注意的是,参数是变量,不是域,其只在相应的方法内可见。 二、变量的数据类型 变量的数据类型可以分为两大类:基本类型和对象类型。 Java语言支持8种基本类型: byte:8位 short:16位 int:32位 long:64位 float:32位 double:64位 boolean:true或false,Java规范对其位数没有要求 char:16位,Unicode字符 从Java角度来说,对象类型就是其顶级父类为Object的类所代表的类型,通常就是定义的一个类。一个抽象出来的类。 为了方便对字符串的操作,Java提供了java.lang.String这个类。但是String是一个类,不是基本数据类型。
三、声明与初始化 Java是一种强类型的语言,这意味着在使用变量之前,必须先对其进行声明。声明意味着指定变量的类型,这样编译器就知道如何操作该变量了。 声明的语法比较简单,由变量的数据类型加变量名称组成,如: int n; 表示声明了一个变量,其名称为n,其所代表的类型为int。 String name; 表示声明了一个变量,其名称为name,其所代表的类型对对象类型String。 声明一个变量仅仅代表了一个计划的开始,只是设计好了蓝图而已。在正式使用之前,还需要对变量进行初始化。 就好比你准备创建一所学校,声明表示你给其起了一个名称。这时候,当别人提起该学校的名称时,别人之时明白这是一所学校(数据类型),名称所代表的学校还是什么都没有,空空如也。初始化则意味着按照蓝图创建好了您想要的东西,意味着你的学校建起来了,有了雏形了。 具体到Java中,变量的声明意味着分配了小块内存,该内存将用来保存一个对象所占据内存的地址,该内所保存的是一个所声明类型的变量。变量初始化意味着系统给这个对象占据的内存分配了足够的地址,设置好了相关信息,并且将这个对象占据的内存地址保存在上述小块内存中。 从理论上来说,变量在使用之前分为声明和初始化两个步骤。但是,实际上这两个步骤并不是那么很明显的被区分开来。 例如,语句: int n = 10; 就同时完成了这两个步骤:声明一个int变量n,同时初始化给其赋一个初始值10。 语句: String name = "John"; 则声明了一个String类型的变量name,其被初始化为"John"。 而前面说列举的语句:int n; String name;,则仅仅表示声明了一个int变量n和一个String类型的变量name。 对于域变量(实例变量和类变量),在使用之前并不一定要明确对其进行初始化。在Java的语法中,当声明于变量时,会自动对用一个默认值对其进行初始化。 Java按照以下规则对变量进行默认初始化:
如果是局部变量,那么变量在使用之前必须初始化。
注:以下图示与说明是套用指针的概念作的解释,理解比较偏颇,只为便于理解变量声明和初始化的概念,由于涉及编译的问题,实际的情况差别很大。个人认为,只是由于声明和初始化是一个比较难于理解和解释的概念,因此出此下策进行解释。 以下我根据我的理解画的关于变量内存的示意图: 说明: (1)声明一个变量 Object var; 系统会给该变量分配一个内存位置0x100(应该是编译时分配的),这就是声明,然后当以后用到改变量时, a,如果是基本类型,程序就去该内存位置取值,系统会根据变量的数据类型决定去多少,例如int类型取4个字节,如果是long则取八个字节。说道这里就可以明白为什么要指定变量的数据类型的原因了吧,因为只有这样系统才能知道如何解释内存中的信息。 由于是基本类型,程序直接取值,因此就少了图中0x100指向0x200这些示意。基本数据类型较小,很容易处理,没有必要指来指去。 b。如果是对象类型,程序就去该内存位置取值,将其作为一个地址,然后再去这个地址找对象的值。 (2)初始化变量 var = new String("hello"); 如果是基本类型,初始化的形式如:int var = 10;,那么程序就会在在0x100中方一个10。 如果采用域变量默认初始化,系统会将 0 放在 0x100中。 如果是对象类型,那么程序首先分配一块内存,构建好String对象,然后将这块内存(如0x200)的地址保存到0x100中。 如果采用域变量默认初始化或者执行var = null;,那么就会将 0x0放在 0x100中。 对于局部变量,如果没有初始化,程序不会对0x100内存作处理,因此其值是不确定的。当然如果不显式初始化,编译都通不过。
四、数组
数组可以看成一个容器变量,它一定数量多个相同类型的值。 与普通变量类似,在使用数组之前,需要首先声明,声明数组的基本语法也与声明普通变量类似,再类型后面加[]即可。如 int[] ids; 声明了一个一维数组ids,用来保存int类型的值,在实际应用时,可以保存学生的学号。 int[][] scores; 声明了一个二维数组scores,用来保存int类型的值,二维数组可以看成是一张表格,在实际应用时,可以保存学生各科学习成绩。 与普通变量变量不同的是,在使用数组前还需要创建数组,和初始化数组中的值。 数组是一个变量,因此需要一小块内存保存数组实际数据在内存中的位置,而实际数据又是一个个变量,因此还需要一个个小块内存来保存每个变量实际数据在内存中的位置。创建数组就是完成这个工作,在这个阶段必须告诉系统你需要多少个小块内存,也就是你打算使用几个数据。 创建数组相当于执行了多个单变量声明,如果你想使用数据,还必须对每个数据(即一个个变量)进行初始化。 具体地说, ids = new int[2]; 表示创建了一个数组,将要保存2个数据。 ids[0] = 10; ids[1] = 20; 表示初始化数组中的值。 以下我根据我的理解画的关于数组内存的示意图:
说明: (1)声明一个数组 Object[] var; 系统会给该变量数组一个内存位置0x100(应该是编译时分配的),这就是声明。 (2)创建数组 var = new String[2]; 系统会分配一块连续的内存0x200(如果不连续,那不是数组了),用来保存两个对象的内存地址。然后将这块内存的地址保存到0x100中。 (3)初始化数组中的值 如果是基本类型,有可能在创建数组时,就不是分配内存用来保存地址了,而是直接用来保存数组的值了,因此初始化也就是将值直接写到创建数组时分配的内存空间中了。 如果是对象类型,那么则分别先分配内存创建对象,然后将该内存的地址写到创建数组时分配的对应内存中。
五、其他 1、数组复制 System类提供了一个arrayCopy函数可以很方便的用来复制数组。其原形为: public static void arraycopy(Object src, 举例: public class ArrayCopyDemo { System.arraycopy(copyFrom, 2, copyTo, 0, 7); 2、转换
输出:12 3、字符串赋初值 String str1 = new String("hello"); 输出:false String str1 = "hello"; 输出:true
文章转自 http://hi.baidu.com/linminqin/blog/item/a1dd3dca0bfa4f41f21fe70c.html |