您的位置:首页 > 编程语言 > Java开发

OCJP(310-065)精选笔记之-变量声明 (Variable Declaration)

2015-01-28 17:23 369 查看

Java里有两种类型的变量

主数据类型变量(Primitive):8种
引用变量(Reference variables):可以指向声明某个类型或者其子类型(compatible type)的的任何对象

Primitive

All six number types are signed.The leftmost bit (the most significant digit) isused to represent the sign, where a 1 means negative and 0 means positive
所有6种数据类型是有符号的。最高位表示符号,1是负数0是正数
正数最大范围比负数的小1,因为0是作为正数存储的
数据类型的范围见下表





对布尔类型(boolean)来说没有范围,只能是true或者false。实际由几位来存储不同的虚拟机各不同
字符类型(char)包含一个16比特的Unicode字符
Unicode字符通常用无符号16比特整数表示,所以有216个值,范围从0到65535

实例变量(Instance Variables)

Can use any of the four access levels能用任何一种访问控制修饰符
可以用final,transient
不能用abstract,synchronized,strictfp,native和static

本地变量(Local Variables)

又可以被称作automatic,stack或者method variables
Local变量是指定义在method内的变量
对象只在堆上创建,而local 对象引用在栈上。当local变量在栈上,且是一个对象引用。对象仍然在堆上被创建。没有栈对象这一说,只有栈变量
Local 变量可以用final
如果在没有赋值前就使用local变量,会编译不通过,因为local变量没有缺省值。
用和instance变量同样的名字命名local变量是允许的。比较常见的是以下这种情况:

class Foo {
int size = 27;
public void setSize(int size) {
this.size = size;
}
}


最后用图来比较下变量和方法在修饰符上的区别





数组(Array)

Arrays可以包含primitives或者Object rreference
但是array本身永远是个堆上的对象(object on the heap),即使它包含primitive成员
声明中包含数组size永远都是非法的。直到你实例化了这个数组对象,虚拟机(JVM)才会去分配空间,这个时候数组size才有用。
声明数组举例:

//声明primitive型数组
int[] key;          //推荐
int key [];         //合法但不推荐,可读性不好

//声明object reference数组
Thread[] threads;   //推荐
Thread threads [];  //合法但不推荐,可读性不好

//声明多维数组(数组的数组)
String[][] occupantName;
String[] managerName [];
}


变量的修饰符

Final

对primitive,表明这个变量的值不能再被改变
对bject reference variable,被指向的对象是可改的,但是该reference variable不可以变,比如指向别的object或者置null。

Transient

当instance variable用transient时,你是在告诉JVM当序列化(serialize)这个对象的时候,忽略这个变量

Volatile

告诉JVM当线程要获取这个变量的时候,总是从内存里拷贝一份给自己
只能用于instance variable
你可能会用同步(synchronization),而不是volatile来确保线程安全

Static

可以用static的地方包括:

方法
变量
内部类(nested class),这个类必须是在另一个类里的,不能在一个方法里
初始化代码块(initialization)

 不可以用static的地方:
构造体
类(除非是内部的)
接口
方法内的本地内部类(Method local inner classes)
内部类的方法和变量
本地变量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java OCJP