Java方法重写和多态
前言
多态在程序中是一种偏抽象的概念,在前期我们主要理解为主,在代码量提上去之后,自然而然就融会贯通了。在面向对象编程中。比较对象的相等性是一个常见的需求。Java中有两种方式用于比较对象的相等性,即"=="运算符和equals()方法。本文将介绍它们的使用场景和区别,并深入探讨equals方法的重写以及多态性的应用。
一、== 与 equals
- == 在值(基本)类型中,是比较值是否相等
- == 在引用类型中,是比较引用是否相等,也就是说是否指向同一个对象。
- equals是Object类的方法,所以所有的类都有equals方法。
- 在引用类型中,equals方法跟==作用相等。
- String类型比较特殊,String类中重写了equals方法,变成比较字面值是否相等
二、equals重写
如果我们的实际编程中,需要改变equals的判断是否相等的规则,则就需要重写equals方法。
例:如果一个Person类的两个对象 姓名和年龄都相等,就视为相等。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override//重写equals
public boolean equals(Object obj){
if(obj == null){//判断obj是否为空
return false;
}
if(!(obj instanceof Person)){//instanceof判断obj是否是Person的实例
return false;
}
Person eqObj = (Person)obj;//强制转换
if(this.name.equals(eqObj.name) && this.age==eqObj.age){
return true;
}
return false;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class TestPerson {
public static void main(String[] args) {
Person p1 = new Person("张三",20);
Person p2 = new Person("张三",20);
System.out.println(p1.equals(p2));
}
}
- 两个对象通过equals判断为true,则表示两个对象相等,那么两个对象hashCode()返回的哈希码一定相等。
- 两个对象的hashCode()返回的哈希码相等,equals不一定返回true。
三、多态
多态:父类的引用指向子类的对象
给它不同的实例,它就会产生不同的行为
好处:代码的维护性和扩展性增强(要符合开闭原则)
多态是运行时发生的行为,编译器找的是父类的同名方法
多态的核心条件是要有重写
父类的方法正常情况来说没有实现的意义,但是要求子类必须实现,所以通常情况下,父类的方法设为抽象方法abstract
例:定义一个Person2类,有三个人种Chinese,American,Japanese,四个类都有一个swim方法,
public class Person2 {
public void swim(){
System.out.println("默认游泳");
}
}
public class American extends Person2{
public void swim(){
System.out.println("自由泳");
}
}
public class Chinese extends Person2{
public void swim(){
System.out.println("仰泳");
}
}
public class Jpanese extends Person2{
public void swim(){
System.out.println("蛙泳");
}
}
这时候我们可以写一个SwimManger类来管理游泳。
public class SwimManager {
public void start(Person2 p){
p.swim();
}
}
测试类SwimTest
public class SwimTest {
public static void main(String[] args) {
Chinese c=new Chinese();
American a=new American();
Jpanese j=new Jpanese();
SwimManager m = new SwimManager();
m.start(c);
m.start(a);
m.start(j);
//父类的引用指向子类的对象
//给它不同的实例,它就会产生不同的行为
}
}
上述代码展示了面向对象编程中的多态性的应用,具体来说是通过方法重写(override)实现的。
分析:
- 对于 Person2 类中的 swim() 方法而言,它是一个默认的游泳方法实现。在子类 American、Chinese 和Japanese 中,它们通过方法重写(override)来重新定义了 swim() 方法的具体实现,覆盖了父类 Person2中的默认实现。
- 这里的代码复用是指子类继承了父类的 swim()
方法的声明和基本结构,而不需要重新编写方法的签名和方法体。子类只需要关注实现自己特定的游泳方式,而无需重复编写整个方法的结构。
1.代码复用:通过继承和方法重写,子类可以重用父类的代码逻辑,不需要重复编写相同的方法实现。
2.可扩展性:如果需要新增一种国籍的人,并定义其游泳方式,只需创建一个新的子类并重写 swim() 方法即可,不需要修改现有的代码。
3.灵活性:通过将不同子类对象传递给
SwimManager 的 start() 方法,实现了对不同国籍人的统一管理,根据不同的实例调用相应的方法,实现了多态性。
四、abstract抽象
- 包含抽象方法的类一定是抽象类
- 抽象类中可以没有抽象方法,只有普通方法。
- 抽象类不能被实例化,
- 抽象类的作用主要是让子类来重写父类的抽象方法;子类必须要重写父类的所有的抽象方法,否则子类也只能是抽象类
总结
首先介绍了"==“运算符和equals()方法在比较对象相等性时的不同行为。对于基本类型,”==“比较的是值是否相等;而对于引用类型,”==“比较的是引用是否指向同一个对象。equals方法是Object类的方法,因此所有的类都具有equals方法,它在引用类型中的作用与”=="相同。然而,String类型是一个特殊情况,它重写了equals方法,用于比较字面值是否相等。
接下来,讨论了equals方法的重写。当我们需要改变equals方法判断相等的规则时,就需要对equals方法进行重写。通过一个Person类的例子,展示了如何重写equals方法来判断两个对象是否相等。在重写equals方法时,需要考虑空引用判断、类型判断和属性值比较等因素。
随后,介绍了多态性的概念和应用。多态性指的是父类的引用可以指向子类的对象,从而产生不同的行为。通过方法重写和继承,可以实现多态性的应用。以一个SwimManager类和多个子类(Chinese、American、Japanese)为例,展示了如何通过多态性管理不同国籍人的游泳行为。多态性提高了代码的维护性和扩展性,并遵循开闭原则。
最后,简要介绍了抽象类的概念和用途。抽象类包含抽象方法,可以没有抽象方法,但可以有普通方法。抽象类不能被实例化,其主要作用是让子类重写父类的抽象方法。子类必须重写所有的抽象方法,否则子类也必须是抽象类。
通过本文,对于对象相等性的比较、equals方法的重写、多态性的应用以及抽象类的使用有了更加深入的理解。这些概念和技术在面向对象编程中非常重要,对于编写高质量的Java程序
原文地址:https://blog.csdn.net/qq_61102168/article/details/136549189
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!