在上一篇文章中,小编为您详细介绍了关于《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 网线接口不可靠》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

java键盘输入字符串静态变量_Java 中为什么样在静态方法中可以调用的方法、可以使用的成员变量必须是静态的?老师说字符串常量和静态变量放在data segment中...相关推荐

  1. 【C语言】#文件操作#有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。

    题目: (1)有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号.姓名.3门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中. 设5名学生的学号.姓名和3 ...

  2. Java 键盘输入的三种方法

    Java 键盘输入的三种方法 1.System.in和System.out方法:从控制台接收一个字符,然后将其打印出来 虽然此方式实现了从键盘获取输入的字符,但是System.out.read()只能 ...

  3. java 键盘输入语句怎么写

    java 键盘输入语句写法 第一种: public class shuRu{ public static void main(string arg[]){ system.out.println(arg ...

  4. Java Scanner类的详细介绍(Java键盘输入)

    Java Scanner类的详细介绍(Java键盘输入) 一.Scanner类的简单使用 二.Scanner类的详细介绍 1.判断输入数据类型 2.next()与nextLine()的区别 3.求多个 ...

  5. java键盘输入整数_Java中从键盘输入多个整数的方法

    例题:求数列的和 分别输入两个整数n,m,中间以空格隔断,n 为数列第一项,后面各项均为前一项的开根号,求前m项的和. 第一种从键盘输入并读取的方式:sc.hasnextint() 函数和sc.nex ...

  6. java键盘输入构建任意二叉树并实现前序、中序、后续遍历

    import java.util.ArrayList; import java.util.List; import java.util.Scanner;public class CreateBinar ...

  7. java键盘输入语句_java键盘输入语句怎么写

    展开全部 这样写就可以了 方法一import java.util.*Scanner in=new Scanner(System.in) System.out.println("please ...

  8. java键盘输入怎么输入汉字,图文教你java怎么接收从键盘输入的字符串

    电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到java怎么接收从键盘输入的字符串的问题,如果我们遇到了java怎么接收从键盘输入的字符串的情况,该怎么处理怎么才能解决 ...

  9. java 键盘输入多种方法

    一.java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner. 实例程序: 1.利用 Scanner 实现从键盘读入int ...

最新文章

  1. 中文版!学习 TensorFlow、PyTorch、机器学习、深度学习和数据结构五件套!(附免费下载)...
  2. asp css怎么写?_一次完整的asp.netmvc页面优化过程
  3. 《深入理解C++11:C++ 11新特性解析与应用》——2.4 宏__cplusplus
  4. 字典-字典的增删改查常用操作
  5. 计算机学生工学交替报告书,工学交替学生守则
  6. 跨平台(windows+linux)的线程辅助程序,跨平台(Windows+Linux)的Socket通讯程序(二)—结构...
  7. 艾蔻智能机器人怎么连接网络_艾蔻扫地机器人z3怎么用?
  8. RabbitMQ学习之基于spring-rabbitmq的RPC远程调用
  9. Parcel React 开发服务器热更新实战
  10. android单元测试作用,Android单元测试源码解读
  11. event对象在IE和firefox下兼容写法
  12. 编译ffmpeg没有生成编译后ffplay
  13. Delta3D(7)教程:在场景编辑器中加载角色
  14. rs485与modbus协议
  15. 软件实施工程师是一个什么样的工作?他的具体工作内容是什么?发展前景怎样?...
  16. 华硕主板固态硬盘不识别_主板启动设置无法识别固态硬盘 - 卡饭网
  17. 值得推荐的C/C++框架和库
  18. 准谐振器和双二阶广义积分器的共同点和不同点
  19. C# WinForm打开PDF文件
  20. unity 接入谷歌广告

热门文章

  1. OpenCV图像处理——opencv简介(一)
  2. 1328:【例7.7】光荣的梦想
  3. 干货分享: 陶瓷3D打印之粘结剂喷射技术的成形材料、优势与挑战
  4. 没学过编程能学python吗_乡音无改鬓毛衰是shuāi还是cuī?
  5. PaaS概念遍地开花,Gartner教你分辨“泡沫”和“爆点”
  6. 【电路第三章】电路中的一般分析方法
  7. Vue cli3 中全局引入scss文件
  8. Github Desktop(Windows桌面版)简单教程
  9. 反问疑问_疑问句和反问句的区别.
  10. 位置式PID——小车类学习心得