Java学习总结(一)
5年前
1433
0
学习总结:equals和==的区别、重写与重载的区别
equals和==的区别
一、对象类型不同
1、equals():是超类Object中的方法。
2、==:是操作符。
二、比较的对象不同
1、equals():用来检测两个对象是否相等,即两个实例所指向的内存空间的值是不是相同。
2、==:用于比较引用和比较基本数据类型时具有不同的功能,他是判断两个变量或实例是不是指向同一个内存空间。
三、运行速度不同
1、equals():没有==运行速度快。
2、==:对内存地址进行比较 ,运行速度比equals()快,因为==只是比较引用。
用一张图可以简要的表现他们之间的关系:
equals与==的区别详解:
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
String a=”hello”是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String a=”hello”;形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为”hello”的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象, 如果没有,则在常量池中新创建一个”hello”,下一次如果有String b = “hello”;又会将b指向”hello”这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
而String a = new String(“hello”);和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
也可以这么理解: String str = “hello”; 先在内存中找是不是有”hello”这个对象,如果有,就让str指向那个”hello”.
如果内存里没有”hello”,就创建一个新的对象保存”hello”. String str=new String (“hello”) 就是不管内存里是不是已经有”hello”这个对象,都新建一个对象保存”hello”。
扩展资料:
equals()和==的源码定义:
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写。
但是没有对equals进行重写的类就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非在此类中重写equals。
重写与重载的区别
Overload(重载)
重载 Overload 方法名相同,如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
1、参数类型、个数、顺序至少有一个不相同
2、可以有不同的返回类型,只要参数列表不同就可以了
3、可以有不同的访问修饰符
4、可以抛出不同的异常
代码示例:
注意:
public static void add(int a, int b){
}
public static int add(int a, int b,int c){
return a+b+c;
}
以上不会重载,不允许和给定函数存在于同一个类中,因为会产生调用不确定性
Override(重写)
重写 Override 覆盖。 将父类的方法覆盖 重写方法重写:方法名相同,访问修饰符只能大于被重写的方法访问修饰符,方法签名个数,顺序个数类型相同
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)。
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
5、方法被定义为 final 不能被重写
6、子类方法不能抛出比父类方法更多的异常 (但子类方法可以不抛出异常)
例如: 父类的一个方法申明了一个检查异常 IOException,在重写这个方法是就不能抛出 Exception, 只能抛出 IOException 的子类异常,可以抛出非检查异常。
区别:
方法的重载和重写都是实现多态的方式区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。