java类中的静态变量是否存在每个生成对象的内存里么?

2017-12-24  本文已影响0人  c0ny1
实验代码
class User{
    private String a ="a";
    private static String b = "b";

    public static void main(String[] args){
        User user1 = new User();
        user1.b = "a1";
        System.out.println(User.b.toString());
        User user2 = new User();
        user2.b = "a2";
        System.out.println(User.b.toString());
        User user3 = new User();
        user3.b = "a3";
        System.out.println(User.b.toString());
        User.b = "a4";
        System.out.println(user1.b.toString());
        System.out.println(user2.b.toString());
        System.out.println(user3.b.toString());
        System.out.println(User.b.toString());
    }
}

调试论证法:

你可以看到user1,user2,user3在调式窗口中可以看到a变量,没有看到b变量。说明a在每个对象中,b不在。

你可以看到user1.a,user2.a,user3.a是不一样的,user1.b,user2.b,user3.b,User.b的id都是一样的。说明每个对象的a变量都是单独的,b变量是所有对象共享的。

输出验证法:

通过输出我们就知道对象名.静态变量名类名.静态变量名都可以直接访问。最后输出的值一样,说明它们指向了同一个对象。

总结

(1) 普通变量都是存在于对象的内存块中。
(2)java当中静态变量单独在一个内存区域,而不是在每个实例化对象当中。每个实例化后的对象都共享这个变量。可以通过对象名.静态变量名类名.静态变量名两种方式进行访问。

注意:

静态变量是private,public,protec其实都是可以直接使用对象名.静态变量名类名.静态变量名直接访问。

我的博客地址: http://gv7.me

上一篇 下一篇

猜你喜欢

热点阅读