多态 polymorphic

2023-05-21,

多态是同一个行为具有多个不同表现形式,多态实现需要以下条件

继承父类并重写方法
父类引用指向子类对象:Animal a = new Cat();

多态实例:

//测试类
public class TestDog {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.name);//加载的是父类属性
a.move();//如果未重写move()是加载父类方法,但子类重写move()就加载子类方法
  } //这里move()如果被private、static、final修饰,就变成了静态绑定无法被重写。而多态是动态绑定。
   //那么此时父类调用父类方法,子类调用子类方法。
}
//父类
public class Animal {
String name = "animal";
void move() {
System.out.println("animal run");
}
}
//子类
public class Dog extends Animal{
String name ="dog";
@Override
void move() {
System.out.println("dog run");
}
}

解释:

    父类引用变量指向子类时,自动调用父类的方法和变量,无法调用子类的新方法和方法。
    但如果子类重写了父类的某个方法,通过父类引用变量调用时实际调用子类重写的方法。
    如果通过父类引用变量调用的是静态方法,即使子类中该方法被重写,调用时也仍然与父类一致,因为父类的静态方法在父类加载时就已经加载了,在对象建立之前就存在了,无法被之后出现的子类对象复写。

————————————————
原文链接:https://blog.csdn.net/sttttttuttering/article/details/109272847

多态弊端:父类无法使用子类属性和方法,向下转型损失精度

多态优势:当作参数传入,多态提高扩展性。用关键字 instanceof 条件语句判断传入多态的类型,如果是动物是猫,就有抓老鼠的方法,如果是鸟,就有会飞的方法。

       if(a.instanceof Catch){
a.catchMouse();
}else if(a.instanceof bird){
a.fly();
}else ....

多态练习题:main方法执行结果?

public class TestPolymorphic {
public static void main(String[] args) {
A a= new B();
a.show();//B System.out.println("---------------");
B b=new C();
b.show();
}
}
public class A {
public void show() {
show2();
}
public void show2(){
System.out.println("A");
}

public class B extends A{
public void show2(){
System.out.println("B");
}
}
public class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("C");
}
}

测试结果:

B
---------------
C

多态 polymorphic的相关教程结束。

《多态 polymorphic.doc》

下载本文的Word格式文档,以方便收藏与打印。