JavaSE 成员变量与局部变量

这里写图片描述


成员变量和实例变量,类变量的区别

A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上

class Person {
    static String name;                      //类变量  
    int num;                                //实例变量

    public void speak(int x) {
        int num = 10;                       //x和num都是局部变量
    }
}

B:在内存中的位置不同
实例变量:在堆内存(实例变量属于对象,对象进堆内存)
类变量:存储于方法区的静态区(类变量属于类,类进方法区)
局部变量:在栈内存(局部变量属于方法,方法进栈内存)

C:生命周期不同
实例变量:随着对象的实例创建而存在,随着实例的消失而消失
类变量:类变量随着类的加载而加载,随着类的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

public class Person{                       
     static String name;                        //类变量
     int num;                                   //实例变量

     public void speak(int x) {
         int num = 10;                      //局部变量
         String name = "bbb";

         //实例变量会被局部变量覆盖
         System.out.println("1 --"+num);
         //采用this来作为num的限定,则会输出实例变量的值
         System.out.println("2 --"+this.num);
         //类变量会被局部变量覆盖
         System.out.println("3 --"+name);
         //采用类名来作为限定,则会输出类变量的值
         System.out.println("4 --"+Person.name);
     }

     public static void main(String[] args){
         Person p = new Person();
         p.num = 9;                       //实例变量必须通过实例来引用
         p.name = "aaa";
         p.speak(3);

         Person p2 = new Person();
         //p2依然应用Person类,依然输出aaa
         System.out.println("5 --"+t2.name);
     }
}

输出:
这里写图片描述

D:初始化值不同
类变量:有默认初始化值
实例变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用

//成员变量无需显式初始化。而局部变量必须显示的初始化
class Person{
    //定义一个实例变量
    public String name;
    //定义一个类变量
    public static int num;
}
public class Test{
    public static void main(String[] args){
        System.out.println(Person.num);
        Person p = new Person();
        System.out.println(p.name+"....."+p.num);
    }
}

输出:


tip:实例变量不能在类体中先声明然后在方法中直接赋值,类变量可以

//可以运行
public class Hello {
    static int a;        //在类体中声明整型静态变量a。
    public static void main(String[] args) {
         a=3;                 //在方法中对静态变量a赋值。
         System.out.println("a="+a);
    }
}
//不能运行
public class Hello {
    int a;        //在类体中声明整型实例变量a。
    public static void main(String[] args) {
        a=3;                 //在方法中对实体变量a赋值。
        System.out.println("a="+a);
    }
}
//将上述代码改成这样可以运行
public class Hello {
    int a;        //在类体中声明整型实例变量a。
    public static void main(String[] args) {
        Hello h = new Hello();
        h.a = 3;
        //因为main方法是static的,它们只能访问static数据,所以要变成h.a。不是静态方法可以直接用a                
        System.out.println("a="+h.a);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值