构造器
关于构造器的一点理解
作用:确保初始化
我们创建对象时,一般都会写:(以Person类为例)
Person p = new Person();
其实,这个new操作涉及到了一系列的动作,首先应该明确一点,构造器并不是在创建类。这么说或许不是特别合理,因为java中将创建和初始化捆绑在一起。
在调用构造器之前,对象在堆上已经创建完毕,只是对象的实例数据部分全是0,此时对于虚拟机来说,对象的创建已经完成,但是对于程序来说,对象的创建才刚刚开始。
而后调用构造器,就是对对象的一系列初始化操作
也就是说,我们在构造器中进行的操作实际上有一个前提是在堆中已经存在对象了。
现在来看这样一段程序:
String s1 = "abc"; String s2 = "abc"; String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s1==s2); //true System.out.println(s3==s4); //false System.out.println(s1==s3); //false System.out.println(s1.equals(s2)); //true System.out.println(s1.equals(s3)); //true
首先需要知道,java中是有常量池的,可查看此博客http://blog.sina.com.cn/s/blog_ee34aa660102wrk3.html。
其次,“==”和equals()方法的区别,“==”比较的是变量本身的值,在对象中反映为对象的地址,而equals()方法比较的是字符串中所包含的内容,也可以理解为值。
可知变量s1,s2的值均存于常量池中。并且,s1,s2对应的是同一常量。
此时s3,s4均是通过new操作的对象引用,且分别指向堆中的对象,故上诉程序的结果也就如此。