String s=new String("xyz") 创建了几个对象

1,String s =new String("xyz");创建了几个对象?

这个问题出现好多次,有的说俩个,有的说三个。

我觉得正确答案是:

通过new关键字创建的对象只在堆内存生成一个对象。另外在栈中局部变量表中的引用不算是对象吧!所以只有一个。想把堆中的对象(也就是new出来的)放到常量池中,我知道的方法只有通过String的intern()方法,但是这有个需要注意的地方,就是intern()方法执行并不是把堆中该对象的引用放到常量池中去,但是常量池中放的是什么我也不知道。

有例为证:String s=new ("a");

System.our.println(s==s.intern());

结果是false,所以常量池中放的并不是堆中该对象的引用。

String s="abc",这创建了几个对象,这个问题好像是有点不好说了。

首先看jdk 版本:1.7以前的,永久代中还存在字符串常量池

这种的话,先判断常量池中是否有该对象,若没有的话,在字符串常量池中创建一个对象,并返回其引用,注意着时候只创建了一个对象(我说的前提都是局部变量表里面的东西不算的情况下),堆内存创建这个对象,若常量池中存在该字符串对象,那么直接返回常量池中该对象的引用,并没有创建对象。

jdk1.7以后:这时候要去永久代,但是好像是得一步步来,所以就先把方法区(永久代,因为sun是通过永久代的方式实现的方法区,所以都叫方法区为永久代)中的字符串常量池去掉了,放到堆里面了,且池中不放对象了,可以放对象的引用了,方法区好像是jdk1.8完全去掉了,取而代之的是一个放元数据的区域。这些不多说了。在jdk1.7中,也会先判断常量池中有没有这个对象的引用,若有直接返回这个引用,若没有,在堆中创建一个对象,之后,把引用放到常量池中。对,就是这样。若有发现不对的地方希望告诉我一声。


2,Overload 和Override的区别?Overloadded 方法是否可以改变返回值类型?

load 是重载,就是一个类中多个相同方法名但是参数的(个数,类型,顺序)不同,注意顺序有的时候总是忘。

ride 是重写,就是子类的方法覆盖父类中的方法,当用父类引用指向子类对象的时候,调用该方法,执行的是子类重写的方法,多态的一种实现。其实重载也是多态的一种实现。

关键在与overloaded 方法是否可以改变返回值类型?当参数不同的时候 是可以改变返回类型的(这里的不同是上面的三个任意一个或多个),但是如果参数相同,不能通过改变返回值类型来实现重载的。

猜你喜欢

转载自blog.csdn.net/wlittlefive/article/details/52577872
今日推荐