概要
所谓多态是指同一个接口或者父类引用变量可以指向不同的对象实例,并根据实际指向的对象类型执行相应的方法。
它允许同一方法在不同对象上表现出不同的行为,是面向对象编程(OOP)的特性之一。
多态的优点:
通过多态,程序可以灵活地处理不同类型的对象,降低代码耦合度,增强系统的可扩展性,新增子类或实现类时,无需修改原有代码,只需要通过接口或者父类引用调用即可。
多态的意义
多态其实是一种抽象行为,它的作用主要是让程序员面对抽象编程而不是具体的实现类,这样写出来的代码扩展性会更强。
大家可能不是很理解什么是抽象编程什么是具体,比如小明爱吃鸡肉,在某种场景下也可以说小明爱吃肉,那么这里的肉就是抽象的,鸡肉就是具体的实现类。假如有一天小明不喜欢吃鸡肉了,喜欢吃牛肉了,这时候不需要改,可以新增一个实现类,或者将牛肉替换成鸡肉。这就是多态的意义。
代码示例:
class Meat{
void eatMeat(){
System.out.println("吃肉");
}
}
class Chicken extends Meat{
@Override
void eatMeat(){
System.out.println("吃鸡肉");
}
}
public class Test{
public static void main(String[] args){
Meat meat = new Chicken();
meat.eatMeat();// 日志打印“吃鸡肉”
}
}
在开发时,对象都是Meat,但是new不同的实现类,表现的形式不同,这就是多态的表现形式。
编译时多态和运行时多态
在面向对象编程中多态的两种实现方式:
-
编译时多态: 通过方法重载实现,在编译时确定方法的调用。
-
运行时多态: 通过方法重写视线,在运行时确定方法的调用。
方法重载
指在同一个类中定义多个方法,这些方法的名称相同但参数不同(类型或数量不同),java编译器在编译时会根据方法调用时传入的参数类型和数量,决定调用哪一个方法。
代码示例:
class Test{
void desc(int a){
System.out.println("Integer"+a);
}
void desc(String a){
System.out.println("String"+a);
}
void desc(long a){
System.out.println("long "+a);
}
}
public class Main{
public static void main(String[] args){
Test test = new Test();
test.desc(1);
test.desc("1");
test.desc(1l);
}
}
方法重写
指子类重写父类的一个或多个方法,通过父类引用调用方法时,实际执行的是子类重写后的方法,这种多态性是在运行时根据对象的实际类型决定的。
示例:
class Animal{
void sound(){
System.out.println("Animal make a sound");
}
}
class Dog extents Animal{
@Override
void sound(){
System.out.println("Dog barks");
}
}
class Cat extents Animal{
@Override
void sound(){
System.out.println("cat meows");
}
}
public class Main{
public static void main(String[] args){
Animal dog = new Dog();
Animal cat = new Cat();
cat.sound(); //打印 "cat meows"
dog.sound(); //打印 "Dog barks"
}
}