public class Square{
private double length = 5.2D;
private double width = 1.314D;
private double area;
public double getArea(){
return length*width;
}
}
public class TestSquare{
public static void main(String[] args){
Square s = new Square();
s.getArea();
}
}
1.程序开始运行时,TestSquare被类加载器加载进入内存,main方法由于是static方法首先pop到栈中;
2.接着就是new Square(),类加载器加载Square类,对类中的成员变量和方法进行初始化;
3.在栈中分配内存给对象的引用s,在堆中对Square类进行默认构造器的初始化,得到其存储地址赋值给引用s
4.引用s在调用getArea()方法时,通过隐藏的this指针,找到堆内存地址,返回area值;
了解了这个以后,我们去看 == 和 equals 的区别更加明白了
1. == 对于对象而言,比较的是栈内存中的存放的对象地址,用来判断两个对象的地址是否相同,而对于基本类型来说,由于其存放的就是其内容,所以只要值相等就可以;
2. equals 比较的是两个对象的值是否相等,而不是物理地址,但是在Object方法中的equals一般都需要自己重写一下才能起到这个作用;
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
在String,Integer等包装类中对其进行了重写,但是自己重写的时候依旧需要注意以下几点:
1. 自反性:对任意引用值X,x.equals(x)的返回值一定为true;
2. 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3. 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
4. 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
5. 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。