多态
java的特性里面绕不过去的一个概念 就是 多态,多态是继承的基础上一个更高级的特性。
说到继承我们都理解 就是子类继承父类 ,子类拥有父类的一起公有资源 可以在这个基础上添加 修改 重写。
那么什么是多态呢?
先看个例子:
public class Animal {
@Setter
@Getter
private String name = "动物";
@Setter
@Getter
private int age;
@Setter
@Getter
private String color;
public void show(){
System.out.println("这是一个动物");
}
}
public class Dog extends Animal{
//狗的品种
@Setter
@Getter
private String typeDog;
@Override
public void show() {
System.out.println("这是一只狗 汪汪汪");
}
}
public class Cat extends Animal{
//猫的品种
@Setter
@Getter
private String typeCat;
@Override
public void show() {
System.out.println("这是一只猫 喵喵喵");
}
}
我们先看个动物类 然后cat 和dog 分别继承于它 并重写了show方法 此外他们俩还单独各加了一个 品种名称属性。
然后我们来试一下 所谓多态 简单一句话 就是子类的对象 赋值给父类的引用
Animal a1 = new Dog();
public class InheritanceDemo {
public static void main(String[] args) {
Animal a1 = new Dog();
System.out.println(a1.getName());
show(a1);
Animal a2 = new Cat();
System.out.println(a2.getName());
show(a2);
}
public static void show(Animal animal){
animal.show();
}
}
那么当这个 a1 去调用 show方法的时候: 他就会去调用子类的方法 而不是自己的方法。 而a1去调用属性name的时候 神奇的是他依然在调用自己的属性:
动物
这是一只狗 汪汪汪
动物
这是一只猫 喵喵喵
Process finished with exit code 0
这样的好处在于 你可以解耦 继承关系中的方法调用 比如这个方法 show(Animal animal) 参数是 animal, 你可以传任何继承animal对象的多态引用 它就会自动去调用子类对象的方法 , 是不是很方便!
我们总结一下多态的好处:
- 灵活性:多态性允许使用父类类型的引用变量来引用子类对象,从而使代码更加灵活,可以适应不同类型的对象。这样一来,程序在运行时可以根据实际对象的类型来调用相应的方法,而不需要关心具体的实现细节。
- 可扩展性:通过多态性,可以轻松地添加新的子类,并在不修改现有代码的情况下使用这些新类。这种灵活性使得系统更容易扩展,更适应变化。
- 可维护性:通过多态性,可以将相同的代码应用于不同类型的对象,这样可以减少代码的重复,提高代码的可维护性。如果需要修改某个行为,只需要修改父类或接口中的方法,而无需修改所有的子类。
同理
除了继承 接口也可以多态!
interface Animal {
void sound();
}
class Dog implements Animal {
public void sound() {
System.out.println("Dog barks");
}
}
class Cat implements Animal {
public void sound() {
System.out.println("Cat meows");
}
}
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.sound(); // 输出 "Dog barks"
animal2.sound(); // 输出 "Cat meows"
}
}
对新手来说 多态里面有几点注意的 !
-
首先就是上面那个例子
Animal a1 = new Dog();
System.out.println(a1.getName());
调用方法会多态 调用属性不会多态 属性还是按照父类属性的值为准 -
必须是重写父类的方法才能多态 如果你在子类写一个父类里面没有的新方法 你去多态调用就会报错