【10每天十分钟,javase基础全搞定-static静态变量】

static静态修饰符

  • static修饰三个内容:成员变量,方法,代码块
  • 被static修饰的成员变量被称为静态成员,也称为类成员,不用static修饰的成员称为实例成员。

下面是一个学生类,我写了一个普通成员变量和一个静态成员变量 :

public class Student {
    String name;//成员变量
    static String sex;//静态成员变量
    public static void main(String[] args) {
    }
}

接着我早测试类中对上面两个变量进行调用,出现一个很有意思的事情

public class Text01 {
    public static void main(String[] args) {
        Student stu1=new Student();
        stu1.name="张三";//调用成员变量,没什么问题。
        stu1.sex="女";//调用静态成员变量,你会发现调不出来,现在是强行写上去

        Student stu2=new Student();
        stu2.name="李四";//调用成员变量,没什么问题
        stu2.sex="男";//调用静态成员变量,你会发现调不出来,现在是强行写上去

//        打印成员变量,你发现没什么问题,打印很正常
        System.out.println(stu1.name);
        System.out.println(stu2.name);
//          打印静态成员变量,你会发现打印出来的值不太对。
        System.out.println(stu1.sex);
        System.out.println(stu2.sex);

    }
}

大家看结果惊叹是这样的:

张三
李四
男  //程序直接忽视我们设置的性别开始胡来了!!

让我们用内存图看看到底发生了什么吧

*任何程序开始前经过加载都会先加载到方法区中,现在方法区其实是有当前两个类的。也就是我们的学生类和测试类。
在这里插入图片描述
接下来我们的程序该运行测试类中的main方法了,就会咋栈中给main方法开辟一块栈内存。
在这里插入图片描述接着 Student stu1=new Student();,当new一个对象的时候,就会在堆内存给这个new的对象开辟一个堆内存。堆内存的地址假设为0x111,然后吧这个地址返回给stu1,Student这个类中有一个普通成员变量,初始化为null.
在这里插入图片描述接着程序走 stu1.name=“张三”;此时就会根据stu1的地址找到堆内存相应的地址,再找到name这个属性,把它赋值为张三。
在这里插入图片描述接下来该执行 stu1.sex=“女”;但是这是个静态的变量,是在学生类中被static修饰的静态成员。

  • 静态成员变量保存在方法区中!!!而且在方法区中只有一份,因为只定义了这一个静态成员变量。

所以当执行这一步的时候。请看:
在这里插入图片描述stu1是指向堆的地址,但是在这个地址中是找不到sex这个成员的,所以系统就会去找这个地址所在的类,就会找到学生类Student类。把对应的sex改成女
在这里插入图片描述同理,我们程序继续往下走

 Student stu2=new Student();
        stu2.name="李四";//调用成员变量,没什么问题
        stu2.sex="男";

如下图:
在这里插入图片描述 stu1.sex=“女”;和stu2.sex=“男”;修改的都是方法区的这一个sex静态成员,执行完后sex这个静态成员的最终的值是“男”。
所以程序执行完打印

//        打印成员变量,你发现没什么问题,打印很正常
        System.out.println(stu1.name);
        System.out.println(stu2.name);
//          打印静态成员变量,你会发现打印出来的值不太对。
        System.out.println(stu1.sex);
        System.out.println(stu2.sex);

结果才会是这样:

张三
李四
男
男
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值