JAVA中的成员变量(静态变量和实例变量的内存分配和赋值)、全局变量public static int ID、Java中非静态方法可以调用静态方法与变量

在Java中,静态变量实例变量可以统称为成员变量

  • 静态变量也叫做类变量,独立于方法之外的变量,有static修饰。
  • 实例变量同样独立也是独立于方法之外 的变量,但没有static修饰。
static int a;   // 静态变量
int b;   // 实例变量

一、深入理解静态变量和实例变量值的分配变化

public class StaticTest {
    private static int staticInt = 1;//静态变量
    private int random = 1;//实例变量

    public StaticTest() {
        staticInt++;
        random++;
        System.out.println("staticInt = " + staticInt + "  random = " + random);
    }

    public static void main(String[] args) {
        StaticTest test = new StaticTest();
        StaticTest test2 = new StaticTest();

    }
}

输出:

在这里插入图片描述

干货详解:

  • 实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。结合上述给出的例子。每创建一个实例对象,就会分配一个random,实例对象之间的random是互不影响的,所以就可以解释为什么输出的两个random值是相同的了。
  • 静态变量不属于某个实例对象,而是属于整个类。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就回被分配空间,静态变量就可以被使用了。结合上述给出的例子,无论创建多少个实例对象,永远都只分配一个staticInt 变量,并且每创建一个实例对象,staticInt就会加一

总之,实例变量必须创建对象后,才可以通过这个对象来使用;静态变量则可以直接使用类名来引用(如果实例对象存在,也可以通过实例对象来引用)。

其实,这也可以解释,为什么static修饰的方法不用在实例对象创建后,可以调用。而没有static修饰的方法必须要与对象关联在一起,必须创建一个对象后,才可以在该对象上进行方法调用。

二、成员变量可以在类体中声明同时进行赋值,如 静态变量:static int a=1; 实例变量:int b=1;

如:不会报错

public class 静态变量的赋值 {
    static int a = 1;   // 静态变量
    int b = 1;   // 实例变量
    public static void main(String[] args) {
        
    }
}

三、成员变量不能在类体中先声明(定义)后赋值。但静态变量可以先在类体中声明,然后在方法中赋值(当然实例变量是不行的)

可以发现在类体中先声明后赋值会报错;
但是静态变量可以在类体中声明,静态方法中赋值;实例变量不行
在这里插入图片描述

都可以先声明,再通过代码块赋值

在这里插入图片描述

代码块要先于构造函数执行

四、java中的全局变量是由public修饰的static成员变量,形如public static int ID;

java中的全局变量是放在静态方法区中的,所有的实例对象会共享同一份全局变量。所以一旦对某个类实例化后对其中的全局变量做出修改,那么其他的实例其中的全局变量值也相应的会被修改。

4.1 Java中非静态方法是可以调用静态方法与变量

public class GlobalVariable {
    public static int id;
    public static int name;

    public static int getId() {
        return id;
    }
//    public static void setId(int id) {   //
    public void setId(int id) {   // 非静态方法也可以给静态变量赋值
        GlobalVariable.id = id;
    }
    public static int getName() {
        return name;
    }
    public static void setName(int name) {
        GlobalVariable.name = name;
    }

    public static void main(String[] args) {
        GlobalVariable test1 = new GlobalVariable();
        GlobalVariable test2 = new GlobalVariable();
        test1.setId(1);
        System.out.println(test1.getId());   // 不赋值,int类型的默认为0
        System.out.println(test2.getId());
    }
}

输出:
在这里插入图片描述

如果不赋值直接打印为默认的0

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值