月满霜华 发表于 2017-11-13 14:14:34

关于用new创建对象

为啥有的时候创建对象需要new有的时候不需要比如String类{:10_247:}

alltolove 发表于 2017-11-13 15:05:01

有的时候他是把new封装到一个方法里了,其实最终还是要new的

月满霜华 发表于 2017-11-14 00:28:40

alltolove 发表于 2017-11-13 15:05
有的时候他是把new封装到一个方法里了,其实最终还是要new的

怎么说呢?什么叫最终还是要new,像String对象这样的,代码里并没有new它啊,还是说java虚拟机帮他自动完成了?如果是这样,又如何辨认哪些需要(显示地)用new,哪些是计算机来完成的呢?{:10_245:}

懒癌患者 发表于 2017-11-14 08:09:59

调用的话肯定要new出来,String是Java封装好了的

月满霜华 发表于 2017-11-14 08:45:12

懒癌患者 发表于 2017-11-14 08:09
调用的话肯定要new出来,String是Java封装好了的

jdk里面不都是封装好的吗?他们好多不都是要new吗?比如Scanner

懒癌患者 发表于 2017-11-14 11:09:39

月满霜华 发表于 2017-11-14 08:45
jdk里面不都是封装好的吗?他们好多不都是要new吗?比如Scanner

话不不投机...对象有很多..

懒癌患者 发表于 2017-11-14 11:11:47

楼主的这个问题瞬间无解{:10_250:好像在说:“中国为什么也有说外语的?”

月满霜华 发表于 2017-11-14 12:17:21

懒癌患者 发表于 2017-11-14 11:11
楼主的这个问题瞬间无解{:10_250:好像在说:“中国为什么也有说外语的?”

我只是想请教什么时候不需要在代码里手动写new...哪里话不投机了{:10_266:}

hacker.jin 发表于 2017-11-16 12:54:08

楼主菜鸟还爱钻牛角尖啊,答案:

静态类不需要new,就这么简单,

终于你说的字符串不需要new,呵呵

String str = "Hello";你说的是这样吗?

我来解释下这个过程吧,首先,这个"hello"叫做字面量

编译器在编译的时候,生成的实际上是一个静态常量

jre运行时会把它加载到常量池里面(可以理解为一个静态常量,注意是静态)

当运行到String str = "Hello"这里时,实际上是把这个静态常量的引用给str这个String变量

如果String str = "Hello" + i;那么会在堆空间创建一个字符串,然后从常量池中取得Hello这个字符串,放到这个新的字符串中,再把i放到这个新的字符串中,再把这个新的字符串的引用给str

所以,没事别瞎拼字符串,耗内存

最后,如果字面量是"Hello"+"World",那么编译后常量池的值是HelloWorld,而不会产生两个字符串

hacker.jin 发表于 2017-11-16 12:55:20

本帖最后由 hacker.jin 于 2017-11-16 12:59 编辑

hacker.jin 发表于 2017-11-16 12:54
楼主菜鸟还爱钻牛角尖啊,答案:

静态类不需要new,就这么简单,


其实你可以理解为,静态的东西,在jvm启动时就已经"""new"""出来了,后面用的时候只要活得他的引用就可以了

还有main方法必须是静态的,也是这个原因,另外,关于new,你先搞清楚什么是面向对象,类是可以比喻成人类,注意是人类,不是人,人类是一个概念,一个统称,表示了所有人,而new就是你和你老婆XXOO生出一个新的人,这个XXOO的过程就是new,如果还不懂,你别学java了

月满霜华 发表于 2017-11-20 01:38:06

hacker.jin 发表于 2017-11-16 12:54
楼主菜鸟还爱钻牛角尖啊,答案:

静态类不需要new,就这么简单,


好深刻{:10_245:}

月满霜华 发表于 2017-11-20 01:38:53

hacker.jin 发表于 2017-11-16 12:54
楼主菜鸟还爱钻牛角尖啊,答案:

静态类不需要new,就这么简单,


多谢啦。{:10_281:}
页: [1]
查看完整版本: 关于用new创建对象