一.多态: 完成某个行为,当不同对象去完成时会产生处不同的状态。
多态是面向对象编程继 封装,继承 的三大特性之一。指同一行为具有多个不同表现形式。
在Java中,多态允许父类引用指向子类对象,通过统一接口调用不同实现。
二.多态实现条件 ①必须在继承体系下
②父类引用指向子类对象(向上转型)
如:Parent obj = new Child()
③子类必须要对父类中的方法进行重写
④通过父类引用调用重写的方法
多态体现:在代码运行时,当传递不同对象时,会调用对应类中的方法
实例: public class Animal { String name; int age; public Animal(String name,int age){ this.name = name; this.age = age; } public void eat(){ System.out.println(name+"吃饭"); } } AI写代码 java 运行
public class Dog extends Animal { public Dog(String name,int age){ super(name,age); } public void eat(){ System.out.println(name+"吃骨头"); } } AI写代码 java 运行 public class Cat extends Animal{ public Cat (String name,int age){ super(name,age); } public void eat(){ System.out.println(name+"吃鱼"); } } AI写代码 java 运行 public class Test { public static void eat(Animal animal){ animal.eat(); } public static void main(String[] args){ Cat cat = new Cat("猫",2); Dog dog = new Dog("狗",1); eat(cat); eat(dog); } } AI写代码 java 运行
图解:
三.重写(override) 重写 也被称为 覆写,覆盖。重写是子类对父类 非静态,非private修饰,非构造方法等 的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处: 在于 子类可以根据需要,定义特定于自己的行为。也就是说子类能根据需要实现父类的方法。
方法重写的规则: 子类重写父类的方法时,一般必须与父类方法原型一致:返回致类型 方法名(参数列表) 要完全一致 被重写的方法返回值类型可以不同,但是必须是具有父子关系的 如果子类重写父类的方法,子类的权限大于等于父类的权限 父类被 static(静态方法),private,final(密封方法) 修饰的方法和构造方法都不能被重写 重写的方法,可以使用 @Override 注释来显示指定,有了这个注释能帮助我们进行一些合法性校验,例如:不小心将方法名拼错了,此时编译器就会发现 父类中没有该方法 ,就会编译报错,提示无法构成重写 重写和重载的区别: 区别点 重写 重载 参数列表 不能修改 必须修改 返回类型 不能修改(除非可以构成父子类关系) 可以修改 访问限定符 必须降低限制或者与原限制相同 可以修改 方法重载是一个类的多态性表现 方法重写是子类与父类的一种多态表现 重写的设计原则: 对于已经投入使用的类,尽量不要进行修改。可以重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。
动态绑定和静态绑定: 静态绑定:前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用哪个方法。代表方法重载 动态绑定:晚期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能确定具体调用哪个方法代表:方法重载
四.向上转型和向下转型 向上转型: 创建一个子类对象,将其当成父类对象来使用 语法格式:父类对象 对项名 = new 子类类型() class Animal {} class Dog extends Animal {}
Animal animal = new Dog(); // 向上转型
AI写代码 java 运行 使用场景: public class Test { public static void eat(Animal animal){ animal.eat(); } public static void main(String[] args){ Animal cat = new Cat("猫",2); Dog dog = new Dog("狗",1); eat(cat); eat(dog); } } AI写代码 java 运行
图解:
向上转型优点:让代码是实现更加灵活简单 向上转型缺陷:不能调用子类特有的方法 向下转型: 将一个子类对象经过向上转型之后当成父类方法使用,在无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可。
Animal animal = new Dog(); Dog dog = (Dog) animal; // 向下转型
AI写代码 java 运行 特点:向下转型不安全,可能导致 ClassCastException ,通常在运行时检查。 instanceof: 向下转型用的比较少,而且不安全,万一转换失败,运行就会抛出异常。
Java在为了提高向下转型的安全性,引入了 instanceof,如果该表达式为true,则可以安全转换
instanceof检查:向下转型前建议使用instanceof检查对象类型,避免运行时错误。
if (animal instanceof Dog) { Dog dog = (Dog) animal; }
AI写代码 java 运行
总结: 多态代码示例: class Animal { public void sound() { System.out.println("Animal makes a sound"); } }
class Dog extends Animal { @Override public void sound() { System.out.println("Dog barks"); } }
class Cat extends Animal { @Override public void sound() { System.out.println("Cat meows"); } }
public class Main { public static void main(String[] args) { Animal myAnimal = new Animal(); Animal myDog = new Dog(); Animal myCat = new Cat();
myAnimal.sound(); // 输出: Animal makes a soundmyDog.sound(); // 输出: Dog barksmyCat.sound(); // 输出: Cat meows
}
}
AI写代码 java 运行
多态的应用场景 接口统一调用:通过父类引用调用子类方法,降低代码耦合。 集合框架:如List list = new ArrayList<>(),利用多态实现灵活替换。 设计模式:策略模式、工厂模式等均依赖多态特性。 ———————————————— 版权声明:本文为CSDN博主「Boop_wu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Boop_wu/article/details/149318187