关于String的问题

String s = "xyz",这条代码不是不会在堆区中创建String对象,引用s直接指向常量池吗?
为什么还还能通过引用s调用String的方法,比如s.length();

常量池是跟数据存储有关,length()是个方法,为啥不能通过s调用呢??

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/733701
  • 你也可以参考下这篇文章:string的取值范围
  • 除此之外, 这篇博客: 浅谈String的不可变性以及String拼接的简单总结中的 一、String的不可变性,实例化的两种方式以及预备知识 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    1.String的不可变性:
    String是一个final类,不可被继承所以其字符序列不可变,
    String对象的字符内容是存储在一个字符数组value[]中的,字符串是常量,创建之后不能更改

    String的声明为下图:
    在这里插入图片描述

    2.String实例化的两种方式:
    ①通过字面量定义的方式
    ②通过new+构造函数的方式
    3.预备知识:内存解析
    堆:此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。
    栈:即虚拟机栈,用于存储局部变量等。局部变量存放了编译期可知长度的各种基本数据类型(boolean,byte,char,short,int,float,double,long等),对象引用(不等同于对象本身,是对象在堆内的首地址)方法执行完自动释放。
    方法区:用于存放已被虚拟机加载的类信息,常量(常量池),静态变量,即时编译器编译后的代码等数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^