在java中,数据是以常量和变量两种方法形式进行存储和表示的(实际上,所有程序的数据都是这两种形式)。
四类八种
第一类:逻辑型boolean 默认初始值是false 1Byte
第二类:文本型char 2Byte unicode编码,一个汉字两个字节
第三类:整数型(byte、short、int、long)
byte 1 Byte -128-127
short 2Byte
int 4Byte java默认是INT
long 8Byte L
不受操作系统的影响保证了java的移植性。
第四类:浮点型(float、double)
double 是默认的
float F
在数学中0到1有无数个浮点数;而计算机是离散的,所以表示的时候有误差,计算机用精度(小数点后几位来表示正确),比较浮点数时a==0.1是不合适的,应该a-0.1==0;如果a是0.1,则即使有误差 a-0.1==0因为a和0.1都被表示为一个有误差的计算机二进制。比较按照精度来算。
变量
type variableName [=value][, variableName[=value]...];
type可以是java的基本类型之一。
type可以是Java的引用类型(即类及接口类型)的名字,外部类或接口必须有访
问权限,使用非lang包下的类必须先导入。
变量名(variableName),java约定变量名以能描述该变量意义的单词表示(单词小写),以增加程序的可读性。驼峰法则。
“=”,表示赋值,不是数学意义上的“等于”,java环境下的“等于”通常用于逻辑表达式,用符号“==”(双等号)表示。赋值同样不等于就相等哟,比如:
Integer a =129,b =129;
System.out.println(a==b);
//结果:false
其中a、b为Integer型引用变量,赋的值都是129,但是两者并不相等。
声明格式
变量的访问权限修饰符,访问权限标识符比照类的访问权限
static,静态成员变量修饰符,与它相对应的是实例变量
final,最终变量修饰符,即常量
类变量与实例变量的相同点:
1)都可以用任意权限修饰符对访问权限加以限制;2)都可以被类自身的方法直接调用。
类变量与实例变量的区别是:
1)存储位置不同。静态变量存储于方法区 method area,而实例变量存储于堆区heap area。
2)生命周期不同。静态变量在加载类过程中优先加载,其生命周期取决于类的生命周期;实例变量在创建实例时才创建,它的生命周期取决于实例的生命周期。
3)引用对象不同。静态变量属于类,被类的所有实例共享
,可以直接使用类名来引用也可以通过类的实例引用;而实例变量则属于某个对象,它必须在创建对象后才可以
通过这个对象来使用。
4)使用方法不同。一个类只能有一个同名静态变量,无论是通过类或者任何一个实例对静态变量重新赋值,结果都是一样;而一个类创建多少个实例就会有多少个同名实
例变量,各实例变量存储空间不同,对其中一个实例变量重新赋值不影响其它实例的同名变量
JVM
method area,又叫静态区,跟堆一样,被所有的线程共享,它包含所有的class和static变量;方法区中包含的都是在整个程序中永远唯一的元素。
Stack area 栈(stack)区(VM栈和本地栈),分为3部分:基本类型变量区、执行环境上下文、操作指令区。每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。每个线程包含一个栈区,栈中只保存基础数据类型的对象的引用和自定义对象的引用
,对象都存放在堆区中。栈区另外存放方法参数和局部变量
,用于计算;
堆(heap)区存放对象
,即类的实例。每个对象都包含一个与之对应的类的信息。jvm只含一个堆,被所有线程共享。堆中不存放基本类型的对象引用,只存放对象本身。
Java变量的分类
package codetest;
public class Variable {
public Variable(){}
public Variable(int constructorVar){
//No Initialization but only declare,and final only is permitted.
System.out.println("constructorVar: "+ constructorVar);
}
static{
int staticBlockVar ;//only final is permitted
staticBlockVar=2;//Modify the value of the static variable
classVar=1;
System.out.println("staticBlockVar's value: "+staticBlockVar);//The variable is define in a static block, and Can't use out the block
}
{
System.out.println("non-quasi-static");
}
int instanceVar=1;
//The default value of 0 is automatically assigned to classVar
int samenameVar;//instance variable
static int classVar;
void changVar(int newValOfMemberVar){//No Initialization but only declare,and final only is permitted.
int samenameVar=1;//local variable,only final is permitted
try{
this.samenameVar=3;//The use of a instance variable of the same name with local variable.
System.out.println("The samenameVar local variable: "+ samenameVar);
System.out.println("The samenameVar instance variable: "+this.samenameVar);
instanceVar=newValOfMemberVar;
classVar=2;
int[] a;//do not initialize
int[] array=new int[2];//Initialized to the default values
array[1]=2;//To the second element to the assignment
System.out.println("array[0]:"+ array[0]+ " array[1]:"+ array[1]);
//System.out.println(a[0]);//error
}catch(Exception ex){
ex.toString();
}
//System.out.println(staticBlockVar);
}
public static void main(String[] args) {
//静态变量可以直接使用类名引用
System.out.println("classVar: "+Variable.classVar);
//实例变量必须通过对象来使用
//System.out.println(Variable.member);//error:instanceVar is not a field
Variable varObject =new Variable();
System.out.println("varObject's instanceVar: "+varObject.instanceVar);
//同一类的不同实例,分别为实例变量分配存储空间
Variable varOb =new Variable();
varOb.changVar(2);
System.out.println("varOb's instanceVar: "+varOb.instanceVar);
System.out.println("varObject's instanceVar: "+varObject.instanceVar);
//同一类的静态变量,只分配一个存储空间
System.out.println("classVar: "+Variable.classVar);
System.out.println("varOb classVar: "+varOb.classVar);
System.out.println("varObject classVar:" + varObject.classVar);
}
}
1.1 class variable(类变量):声明在class内,method之外,且使用static修饰的变量,如上例中的classVar
1.2 instance variable(实例变量):声明在class内,method之外,且未使用static修饰的变量。如上例中的instanceVar
类变量与实例变量的相同点:
1)两者都可以用任意权限修饰符对访问权限加以限制;2)两者都可以被类自身的方法直接调用。3)两者都可以不显式初始化直接使用。java虚拟机会自动以默认值对它
们进行初始化,因此它没有违反java所有的变量必须初始化以后才能使用的约定。
类变量与实例变量的区别是:
1)存储位置不同。静态变量存储于方法区,而实例变量存储于堆区。
2)生命周期不同。静态变量在加载类过程中优先加载,其生命周期取决于类的生命周期;实例变量在创建实例时才创建,它的生命周期取决于实例的生命周期。
3)引用对象不同。静态变量属于类,被类的所有实例共享,可以直接使用类名来引用也可以通过类的实例引用;而实例变量则属于某个对象,它必须在创建对象后才可以
通过这个对象来使用。
4)使用方法不同。一个类只能有一个同名静态变量,无论是通过类或者任何一个实例对静态变量重新赋值,结果都是一样;而一个类创建多少个实例就会有多少个同名实
例变量,各实例变量存储空间不同,对其中一个实例变量重新赋值不影响其它实例的同名变量。
1.3 formal parameter variable(形参变量),包括一般方法参数变量(method parameter,声明在method小括号内的变量,如上例中的newValOfMemberVar)和构造器参数
变量(constructor parameter,声明在constructor小括号内的变量,如上例中的constructorVar)。java要求形参变量,只能使用默认访问权限和final声明,并且声明
时不能同时初始化。
1.4 local variable(狭义的局部变量):声明在method内的变量,只能以final修饰。
当方法内的局部变量与成员变量(指类变量或实例变量)同名时,以”this”关键字加以区别。如上例中实例变量sameanmeVar与方法changVar()中定义的局部变量
sameanmeVar同名,实例变量在使用时加前缀“this.”与局部变量加以区别。
1.5 exception-handler parameter(异常标识变量):声明在catch小括号内的变量,如上例中ex。
异常标识变更即catch方法的形参必须声明为Exception对象及其子对象类型,它只用于紧跟着的执行语句块内。
1.6 array element(数组):数组的元素值没有识别名称,必须透过数组和索引值(index)来识别,索引值从0开始。如上例中array数组第2个元素的使用。
新建一个数组,如果没有直接赋值,jVM会自动为它所有的元素初始为默认值。注意:是新建一个数组,不是声明一个数组。如上例中数组a[]只声明没有初始,使用会提
示错误。
1.7-1.8 static block variable(静态块变量主)和非静态块(non-quasi-static):声明在静态块内(static{…})或非静态块内({})的变量。如上例中的变量
staticBlockvar。它只能由final修饰,并且仅用于在声明的静态块内。
在使用这两种变量时要注意它们所在块的不同。一是执行时间不同。非静态变量是执行构造方法之前;静态块在类文件加载后的初始化阶段执行 。二是执行次数不同。静
态块只在类加载初始过程中执行一次;每一次初始化对象,都会导致一次非静态块的执行。这部分详细信息请参阅欣’s博客-《Java中自由块的执行顺序》。
2、根据变量内存来分类,Java变量有两种:
2.1 heap variable:占用的内存在heap中,这类变量包括了class variable,instance variable,array component,这类变量会自动被JVM初始化默认值。
2.2 stack variable:通常广义的局部变量(pan-local variable),其占的内存在stack中,这类变量包括了狭义的局部变量,method parameter,exception-handler
parameter,constructor parameter。狭义的局部变量不会被JVM初始化成默认值,使用者必须自行初始化该变量,但是parameter类(包括method parameter,exception-
handler parameter,constructor parameter)会被JVM初始化成传入值(即实参)。
3、根据使用方式来为变量分类,主要有三种:
3.1 class variable,与根据声明分类对应。
3.2 instance variable,与根据声明分类对应。
3.3 广义的局部变量,除了上面两种以及数组元素以外,都可视为广义的局部变量,数组通常被视为对象,array component视为对象的instance variable.
1、在Java中,所有的变量必须先声明再使用。
2、在static 方法中引用任何实例变量都是非法的。
一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。