在上一篇文章中,小编为您详细介绍了关于《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 网线接口不可靠》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器