java中的变量分为成员变量(又叫实例变量)、静态变量和局部变量。
1.成员变量
1.1 成员变量(实例变量)是在类中定义的非static修饰的变量,可以不用赋初始值,不同的数据类型有默认的初始值。
package test; import org.junit.Test; public class VariableTest {
byte bt;
short s;
int age;
long l;
float f;
double d;
char c;
boolean flag;
String name; @Test
public void cvariable(){
VariableTest vt=new VariableTest();
System.out.println("byte类型的默认值为:"+vt.bt);
System.out.println("short类型的默认值为:"+vt.s);
System.out.println("int类型的默认值为:"+vt.age);
System.out.println("long类型的默认值为:"+vt.l);
System.out.println("float类型的默认值为:"+vt.f);
System.out.println("double类型的默认值为:"+vt.d);
//'\u0000'为空
if(c=='\u0000'){
System.out.println("char类型的默认值为'\u0000'");
}
System.out.println("boolean类型的默认值为:"+vt.flag);
System.out.println("String类型的默认值为:"+vt.name);
}
}
运行结果:
byte类型的默认值为:0
short类型的默认值为:0
int类型的默认值为:0
long类型的默认值为:0
float类型的默认值为:0.0
double类型的默认值为:0.0
char类型的默认值为'
1.2 实例变量只有初始化一个副本之后才可以使用,每当实例化一个对象,会在堆中创建一个副本并初始化,各个对象中对实例变量的修改互不影响。
package test;
import org.junit.Test; public class VariableTest {
int age;
@Test
public void cvariable2(){
VariableTest vt1=new VariableTest();
vt1.age++;
System.out.println("vt1.age:"+vt1.age); //vt1.age:1
VariableTest vt2=new VariableTest();
vt2.age++;
System.out.println("vt2.age:"+vt2.age); //vt2.age:1
}
}
2.静态变量
定义在类中被static修饰的变量,类加载时在方法区中分配存储空间,被类所拥有,任意一个对象对其修改都会改变该变量的值。
package test; import org.junit.Test; public class VariableTest { static int num; @Test
public void staticVariableTest(){
VariableTest vt1=new VariableTest();
vt1.num++;
System.out.println(vt1.num); //1
VariableTest vt2=new VariableTest();
vt2.num++;
System.out.println(vt2.num); //2
} }
3.局部变量
局部变量是指定义在方法体中的变量,变量定义后必须赋初始值。若为基本类型,值直接存储在栈中,若为引用类型,其对象存储在堆中,而把对象的引用存储在栈中。
4.成员变量的作用域
成员变量的作用域:
- public:当前类,同一package的其他类,其他package的当前类的子类,其他package的类都可以访问(4);
- private:只有当前类能访问(1);
- protected:当前类,同一package的其他类,其他package的当前类的子类都可以访问(3);
- default:只有当前类和其位于同一包内的类可以访问(2);
这些修饰符只能修饰成员变量,不能修饰局部变量。(只有public,abstract,final能用来修饰类)。