从内存中的对象访问静态变量

时间:2016-02-11 01:47:21

标签: java object memory static

最近,我了解到除了类名之外,还可以从对象访问静态变量。

我认为静态变量驻留在堆中的永久生成区域中,而不是堆中的对象相关区域中。

另外,我认为m1.count引用了m1的内存位置,并添加了一些偏移来访问count实例变量。

在我的逻辑中,m1.count应该吐出错误,因为内存中没有名为count m1对象附近的实例变量。

怎么可能?我想知道它在内存中是如何工作的。 这是代码:

class Member{
    public static int count;
}

public static void main(){    
    Member m1 = new Member();
    System.out.println(m1.count); // ???
}

2 个答案:

答案 0 :(得分:3)

  

我相信静态变量位于堆中的永久生成区域,

这样的静态字段可以在堆上的任何位置。

  

我认为m1.count是指m1的记忆位置,

Fetching: puma-2.13.4.gem (100%) Building native extensions. This could take a while... ERROR: Error installing puma: ERROR: Failed to build gem native extension. /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/bin/ruby -r ./siteconf20160211-95547-1pdaoaq.rb extconf.rb checking for BIO_read() in -lcrypto... yes checking for SSL_CTX_new() in -lssl... yes creating Makefile make "DESTDIR=" clean make "DESTDIR=" compiling http11_parser.c compiling io_buffer.c io_buffer.c:119:10: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter of type 'const char *' converts between pointers to integer types with different sign [-Wpointer-sign] return rb_str_new(b->top, b->cur - b->top); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/include/ruby-2.2.0/ruby/intern.h:796:20: note: expanded from macro 'rb_str_new' rb_str_new_static((str), (len)) : \ ^~~~~ /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/include/ruby-2.2.0/ruby/intern.h:727:37: note: passing argument to parameter here VALUE rb_str_new_static(const char *, long); ^ io_buffer.c:119:10: warning: passing 'uint8_t *' (aka 'unsigned char *') to parameter of type 'const char *' converts between pointers to integer types with different sign [-Wpointer-sign] return rb_str_new(b->top, b->cur - b->top); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/include/ruby-2.2.0/ruby/intern.h:797:13: note: expanded from macro 'rb_str_new' rb_str_new((str), (len)); \ ^~~~~ /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/include/ruby-2.2.0/ruby/intern.h:706:29: note: passing argument to parameter here VALUE rb_str_new(const char*, long); ^ 2 warnings generated. compiling mini_ssl.c In file included from mini_ssl.c:3: /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/include/ruby-2.2.0/ruby/backward/rubyio.h:2:2: warning: use "ruby/io.h" instead of "rubyio.h" [-W#warnings] #warning use "ruby/io.h" instead of "rubyio.h" ^ mini_ssl.c:4:10: fatal error: 'openssl/bio.h' file not found #include <openssl/bio.h> ^ 1 warning and 1 error generated. make: *** [mini_ssl.o] Error 1 make failed, exit code 2 Gem files will remain installed in /Users/zulhilmi/.rvm/rubies/ruby-2.2.0/lib/ruby/gems/2.2.0/gems/puma-2.13.4 for inspection. 个字段会忽略该引用。引用可以是static,代码运行正常。

  

我想知道它在内存中是如何工作的

该类的null字段有一个特殊对象。您可以使用堆转储获取此信息。引用是偶然的。

static

相同
Member m1 = new Member();
System.out.println(m1.count); 

相同
Member m1 = null;
System.out.println(m1.count); 

答案 1 :(得分:1)

  

我认为静态变量驻留在堆中的永久生成区域中,而不是堆中的对象相关区域。

嗯,更简单地说,它们存在于类中,而不是在对象中。

  

另外,我认为m1.count引用了m1的内存位置,并添加了一些偏移来访问count实例变量。

没有。它本质上是m1.class.count,,但m1.class部分发生在编译时。

  

在我的逻辑中,m1.count应该吐出错误,因为在内存中m1对象附近没有名为count的实例变量。

Ergo 你的逻辑错了。