一、Java变量的分类
学习java的小伙伴都知道,在Java中,一个类可以分为三种变量:
1.局部变量:顾名思义,就是在某个方法,或者某段语句块中定义的变量。变量声明和初始化都是在方法中,方法结束后,此变量销毁。最典型的例子for(int i=0;i<num;i++)
中的i
就是局部变量
2.成员变量:成员变量就是定义在类中,方法体之外的。成员变量是在创建对象的时候实例化。成员变量可以被类中的方法,构造方法等访问。
3.静态变量(类变量):静态变量也称作类变量,他也是在方法体之外,但是与成员变量不同的是,它必须声明为static
类型.
二、成员变量和局部变量
如果局部变量的名字和成员变量的名字相同,要想在该方法中访问成员变量,必须使用关键字this
Class Person {
String name = "类成员变量";
Person(){
};
public void speak(){
String name = "方法中的局部变量";
System.out.println(name) //方法中的局部变量
System.out.println(this.name) //类成员变量
}
}
成员变量和局部变量的区别
成员变量
1.成员变量定义在类中,整个类包括方法都可以访问;
2.成员变量的生命周期跟随对象的建立至销毁,是存在于对象所在的堆内存中的;
3.成员变量都有默认的初始化值.
局部变量
1.局部变量只定义在局部方法或者语句块中,只在所属区域有效;
2.局部变量存在于栈内存,作用的范围结束,变量空间会自动释放;
3.局部变量没有默认的初始化值.
三、成员变量和静态变量
由static
修饰的变量成为静态变量。静态变量可以理解为是一个全局变量,他是所有对象所共享的一个变量,举个例子:在一个小区中,每家每户都是一个实例对象,物业管理他是所有业主共享的,那么管理处就是一个全局变量即静态变量。
==不同对象的成员变量将分配到不同的内存空间,如果存在类变量,则所有的对象的这个变量都是分配给相同的一处内存,改变其中一个对象的类变量就会影响其他对象的类变量==
举个栗子:
class MyAdd {
int count = 0; //成员变量计数器
static int sum = 0; //静态变量计数器
String name;
MyAdd(String name){
this.name = name;
}
public void myAddMethod() {
count++;
System.out.println(name+"调用成员变量后的值:"+count);
}
public void staticAddMethod() {
sum++;
System.out.println(name+"调用类后变量的值:"+sum);
}
}
public class TestThis {
public static void main(String[] args) {
MyAdd add1 = new MyAdd("add1");
MyAdd add2 = new MyAdd("add2");
add1.myAddMethod(); //add1调用成员变量后的值 1
add2.myAddMethod(); //add2调用成员变量后的值 1
add1.myAddMethod(); //add1调用成员变量后的值 2
add1.staticAddMethod(); //add1调用成员变量后的值 1
add2.staticAddMethod(); //add2调用成员变量后的值 2
add1.staticAddMethod(); //add1调用成员变量后的值 3
}
}
内存结构图如下:
内存结构图.png
成员变量和静态变量的区别
- 生命周期不同
- 成员变量是随着对象的创建而创建,随着对象的回收而回收
- 静态变量是随着类的加载而存在,类的消失而消失
- 调用方式不同
- 成员变量只能被对象调用
- 静态变量不仅可以被对象调用,还可以被类名调用
- 别名不同
- 成员变量又称实例变量
- 静态变量又称类变量
- 数据存储位置不同
- 成员变量存储在堆内存的对象中,也叫对象的特有数据
- 静态变量存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据
四、静态变量的弊端
静态变量的弊端
- 有些数据是某个对象特有的,不能成为共享数据。所以在定义静态变量时,一定要明确此数据是否被对象所共享,否则数据将被篡改
- 静态方法只能访问静态成员,不可以访问非静态成员。因为静态方法加载时,优先于对象存在,所以无法访问对象中的成员。
-
静态方法中不能使用
this
,super
关键字。因为this
代表对象,而静态在时,可能没有对象,所以this
无法使用。
网友评论