String a="abc";这个是对象吗?

有人说只有new出来的存在堆内存才是对象,
String a=new String("abc")

首先,String a="abc";这句代码做了两件事情,第一,在栈中定义了一个引用变量a;第二,代码编译期间在常量池中存储了“abc"这个常量串,并将这个引用变量指向常量池中的这个常量地址。不应该问这是不是一个对象,而应该问这个对象的内容是存储在哪里,本地方法区(即常量池中的数据存储的位置),还是堆内存中(动态创建的对象)?答案是,这个对象"abc"是存储在本地方法区中。
其次,String a=new String("abc")这个代码创建了2个对象,new操作在堆内存中创建了一个对象,对象的引用赋给变量a,而这个对象的值又指向常量池中值为"abc"的这个对象。
其实,只要是非java的8大基础类型以外的变量都是引用类型,即我们通常说的对象类型。这是个老生常谈的问题,只要稍微了解下JVM的底层知识,就不难理解了。

“abc”是一个对象,a是一个引用

是对象,直接赋值和new出来的区别就在于,new出来肯定会新建一个对象,但是直接赋值的会先在常量池中查找,要是有这个常量,那么直接将地址指向引用,没有的话才新建

一样是对象 堆 堆栈 都是对象 只是生存期不同

肯定是对象无疑,毕老师的回答很详细。