JAVA中的成员变量,全局变量,局部变量是什么?

本文详细解析了局部变量、成员变量和全局变量的概念、作用范围、存储方式及生命周期,对比了实例变量和类变量的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

局部变量

何为局部变量?

  • 局部变量就是方法里定义的变量。

  • 局部变量仅作用在局部区域中,从定义开始到大括号或者return结束,生命周期短。

  • 局部变量存储:基本数据类型变量放在栈中,引用数据类型放在堆中

  • 局部变量可以先定义再初始化,也可以定义的同时初始化,局部变量没有默认初始值。

class test{
    public static void main (String args[]) {
        int a;
        System.out.println(a);
        //错误: 可能尚未初始化变量a
    }
}

 

 

成员变量

何为成员变量?

  • 成员变量就是定义在类里方法外的变量,也叫全局变量。
  • 成员变量又分为:实例变量和类变量。

类变量也叫静态变量,即在变量前加static 的变量;

实例变量也叫对象变量,即没加static 的变量;

区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;

而实例变量则为对象私有,某一个对象将其值改变,不影响其他对象;示例:

class Person {
    String name;
    static int age;
    
public String toString() {
    return "Name:" + name + ", Age:" + age;
}
    
public static void main(String[] args) {
    Person p1 = new Person();
    p1.name = "zhangsan";
    p1.age = 10;
    Person p2 = new Person();
    p2.name = "lisi";
    p2.age = 12;
    System.out.println(p1);
    System.out.println(p2);
}
    /*
    Name:zhangsan, Age:12
    Name:lisi, Age:12
     */
   //若去掉age前的static,则输出结果为:
   /*
   Name:zhangsan, Age:10
   Name:lisi, Age:12
   */
}
  • ​​​​成员变量的存储:没有实例化的成员变量放在栈中;实例化后的对象放在堆中,栈中放的是指向堆中对象的引用地址。
  • 成员变量在对象被创建时而存在,当对象被GC回收时消失,生存周期适中。
  • 成员变量作用在整个类中(静态方法除外),不能在定义的同时进行初始化,只能通过对象访问。示例:
class Person {
    String name;
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "zhangsan";
        System.out.println(p1);
    }
}

注:如果局部变量和成员变量的名称相同,那么成员变量被隐藏,即方法内失效,方法中如需要访问该类中的成员变量,则需要加上关键字this。

全局变量

何为全局变量?

  • 全局变量就是定义在类里方法外的变量。作用于整个文件中,直接被类调用。
  • 全局变量可以先定义再初始化,也可以定义的同时初始化
  • 全局变量的存储:(static修饰的全局变量)存放于静态区,类加载时创建,在类中只有一份; 会跟着类的消失而消失,生存时间较长。
  • 全局变量分为两种:static修饰的全局变量,只在该源文件中可用
  • extern修饰的全局变量,可以被其他类引用,作用于整个工程中。
### Java成员变量局部变量全局变量的关系 #### 成员变量 成员变量属于类的一部分,在整个对象生命周期内都有效。这些变量存储于堆内存中,随着对象的创建而分配空间,并随对象销毁而释放。成员变量可以由权限修饰符(public, protected, private 或 default) 和数据类型关键字定义[^5]。 #### 局部变量 局部变量仅限于特定的方法、构造器或语句块中使用。它们存在于栈内存上,当方法执行完毕后即被清除。因此,局部变量的作用范围非常有限,只在其声明的地方可见并可用。如果同名的情况下,函数内部会优先考虑局部变量而不是外部相同名称的其他类型的变量[^2]。 #### 所谓“全局变量” 需要注意的是,“全局变量”的概念并不适用于Java标准语法;通常所说的“全局变量”,实际上指的是静态(static) 变量或者是类级别的成员变量。这类变量在整个应用程序范围内都是可访问的,只要通过相应的类名就能获取其值,无需先实例化该类的对象。然而,严格来说这并不是真正的全局变量,因为仍然受限于包保护机制和其他安全措施[^3]。 #### 关键差异总结 - **作用域**: 成员变量可以在整个类及其子类中访问;局部变量则局限于所在的方法体内;所谓的“全局变量”实际上是带有`static`属性的成员变量,可通过类名直接引用。 - **生存周期**: 成员变量伴随对象的存在而存在;局部变量存活期较短,一般不超过一次完整的流程控制结构(如循环体外)。对于标记为 `static` 的成员变量而言,它会在加载类时初始化,并一直持续到JVM终止运行为止[^4]。 ```java class VariableDemo { // 成员变量 (也称为实例变量) int memberVariable; static int classLevelStaticVar; // 类级别静态变量 void methodExample(){ int localVar = 10; // 局部变量 System.out.println(localVar); // 访问局部变量 System.out.println(memberVariable); // 访问成员变量 System.out.println(classLevelStaticVar); // 访问静态变量 } } ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值