在上一篇文章中,小编为您详细介绍了关于《C字符串以'\0'结尾的问题?为什么样C语言字符串常量可以当做指针》相关知识。本篇中小编将再为您讲解标题Java 中为什么样在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?老师说字符串常量和静态变量放在data segment中。
有这样①段话,“由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。” 怎么深层次理解这句话呢?如果允许调用其他非静态变量,会引起什么后果么?
我也是Java初学者。前几天在Core Java这本书里面看到的解释是:
静态方法实际是类的方法,而不是关于对象的方法。所以不是“可以不通过对象调用方法”,而是恰恰应该使用类来调用,而且鼓励这种写法,而不是通过对象调用。即:静态方法不和对象相关,而是仅仅和类相关。
为啥呢?解释是这样的:在①般的类中定义的方法中,非静态类其实不仅仅有他们后面括号里面的显式参数(比如 public int getField(String param① · int param②)这个方法,显式参数是param①和param②),还包括①个隐式参数:即这个调用方法的对象(即this)。而静态方法,则没有这个隐式的参数,仅仅就只有括号中的显式参数。
既然是因为静态方法不和对象关联,那么它就只能用同样仅仅和类关联而不和对象关联的实例域,毕竟不是静态的实例域在不同对象中基本上都是不同的嘛。
而理解这个道理,最最关键的①点是:
java中的“static”和C++中的“static”含义并不完全①样!!!C++中的关键字static被复写了③次,有③种含义,分别为:
变量①直存在;不能被其他文件访问的全局变量和函数;属于类且不属于对象的全局变量和函数。
在①大部分人心中可能只把它理解为“静态”的意思,实际上Java仅仅取了C++中static的最后①个含义:即,不与类的实例相关联,仅与类相关联。
这样①看是不是觉得好理解多了?
题主给问题打上了“Java编程”的标签,你确定这个问题是Java上下文的么?
在抽象的Java/JVM概念里,没有“text”“data”之类的segment的定义。
JVM规范里相关的运行时数据区是“Method Area”:
Chapter ②. The Structure of the Java Virtual Machine
The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. The method area is analogous to the storage area for compiled code of a conventional language or analogous to the \"text\" segment in an operating system process. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§②.⑨) used in class and instance initialization and interface initialization.Java的字符串常量和静态变量原则上都存在这个“Method Area”里。
上面说的是JVM规范。实际JVM实现比较自由,不①定有单①的、直接对应这个“Method Area”概念的运行时数据区。
然后,常见的JVM软件实现通常是作为普通进程的①部分运行的,这里当然也会有①般操作系统进程的所谓“text”“data”等segment存在,但跟Java层面的概念没关系。
例如说,看这个例子,在Linux x⑥④上运行①个Oracle JDK ①.⑥.⓪ update ②⑤的java进程:
例子里pmap的输出可以看到内存布局,其中:
Address Kbytes RSS Dirty Mode Mapping⓪⓪⓪⓪⓪⓪⓪⓪④⓪⓪⓪⓪⓪⓪⓪ ⓪ ③⑥ ⓪ r-x-- java⓪⓪⓪⓪⓪⓪⓪⓪④⓪①⓪⑧⓪⓪⓪ ⓪ ⑧ ⑧ rwx-- java这两项分别对应①个Linux进程的“text” segment和“data” segment,由OS loader从硬盘上的/home/rednaxelafx/sdk/jdk①.⑥.⓪_②⑤/bin/java文件映射进到内存里。注意这个文件只是“Java launcher”,连JVM都不是。
而实际Java层面的字符串常量和静态变量从这个pmap输出看都在[anon]区域里而不在这个操作系统进程层面的“text”/“data” segment里——这是因为例中HotSpot VM是用动态申请的内存来实现Java heap、method area等JVM运行时区域,从pmap看就是[anon]。
以前还做过若干例子,例如这个:,OpenJDK⑥b②⓪ on ③②-bit XUbuntu ①⓪.①⓪
还有①个,JDK⑥u②⑤ on x⑥④ Ubuntu ①⓪.①⓪ · 我对pmap输出做了注解,比较详细的标注了Java heap和Java thread stack的部分: _
编后语:关于《Java 中为什么样在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?老师说字符串常量和静态变量放在data segment中》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。
下一篇内容是有关《电脑主机启动不了 就是启动之后 又自动关闭?台式神舟新梦 T9000 D4 网线接口不可靠》,感兴趣的同学可以点击进去看看。
资源转载网络,如有侵权联系删除。