局部变量
- 定义在方法中的变量
public class test1 {
public static void main(String[] args) {
int i=1; //局部变量初始化值
}
}
- 局部变量作用域在局部区域中,代码块中或者return结束,生命周期短
- 局部变量存在于栈内存中
- 使用局部变量时,必须初始化值,且局部变量没有默认初始值
在下例中,输出i的时候会提示i没有被初始化。
public class test1 {
public static void main(String[] args) {
int i;
System.out.println(i);//i没有被初始化
}
}
成员变量(全局变量)
- 成员变量在方法的外面、类的里面的变量,也称为全局变量
- 成员变量分为实例变量和类变量
- 成员变量的存储:没有实例化的成员变量放在栈中;实例化后的对象放在堆中,栈中放的是指向堆中对象的引用地址。
- 成员变量在对象被创建时而存在,当对象被GC回收时消失,生存周期适中。
实例变量
- 实例变量即在方法的外面、类的里面、不加static的变量,且从属于对象,
public class test1 {
String name; //实例变量
int age; //实例变量
}
- 实例变量随着对象的创建而存在,随着对象的回收而释放。
- 实例变量只能被对象调用,通过实例化对象来调用.
public class test1 {
String name;//若没有被初始化,有默认值
int age;
//基本类型默认值:0 0.0
//boolean默认值 false
//除基本类型默认值 null
public static void main(String[] args) {
test1 test1=new test1(); //实例化对象
System.out.println(test1.age); //0
System.out.println(test1.name);//null
}
}
- 实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同
- 实例变量为对象私有,某一个对象将其值改变,不影响其他对象
- 所有对象的同一个实例变量是共享不同的内存空间的
- 不能在定义的同时进行初始化,只能通过对象访问
- 没有实例化的成员变量放在栈中;实例化后的对象放在堆中,栈中放的是指向堆中对象的引用地址。
public class Test1 {
String name;
int age;
@Override
public String toString() {
return "Test1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
Test1 test1=new Test1();
test1.name="张三";
test1.age=20;
Test1 test2=new Test1();
test2.name="李四";
test2.age=21;
System.out.println(test1);
System.out.println(test2);
}
}
//输出结果为:Test1{name='张三', age=20}
Test1{name='李四', age=21}
类变量
- 类变量即在方法的外面、类的里面、加static的变量,且从属于对象,
public class Demo01 {
static int age;//类变量
}
- 静态变量可以被对象调用,还可以被类名调用。
public class Demo01 {
static int age=10;
public static void main(String[] args) {
Demo01 demo01=new Demo01();
System.out.println(demo01.age);
System.out.println(Demo01.age);
}
}
总结
局部变量和成员变量的区别:
局部变量:
- 局部变量定义在方法中,作用在局部区域,生命周期短
- 局部变量存在于栈内存中
- 局部变量没有初始值
成员变量:
- 成员变量定义在方法外、类里面,作用于整个类(静态方法除外)
- 成员变量有默认初始值
实例变量和类变量的区别
- 两者生命周期不同
实例变量随着对象的创建而存在,随着对象的回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
- 调用方式不同
实例变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
- 数据存储位置不同
实例变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据