Bootstrap

Java的多态性

Java的多态性

多态性是面向对象编程的一个重要特征,是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的涵义。可以理解为一个事务的多种形态。

Java实现多态有三个条件:继承,重写和向上转型。

继承:在多态中必须存在有继承关系的子类和父类。

重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用重写的子类方法。

向上转型:父类引用指向子类对象,只能调用父类中已有的方法,不能直接调用子类的方法(向下转型,强制转换类型,把父类强制转换为子类,为了避免出现类转换异常使用关键字instanceof 判断是对象是否是类的实例)。

对象的多态性只适用于方法,不适用于属性。

虚拟方法调用(多态情况下):子类中重写了与父类同名同参数的方法,在多态情况下,父类的方法为虚拟方法,父类动态调用属于子类的该方法。在编译时无法确定调用对象,在运行时确定调用子类方法(动态绑定)。

代码示例:

package Day3;
/*
Java多态性
1.多态性:可以理解为一个事务的多种形态。
2.对象的多态性:父类的引用指向子类的对象(子类的对象赋给父类的引用)。
3.多态性使用:有了对象的多态性以后,时候编译的时候只能调用父类声明的方法,执行的时候实际执行的是子类重写的方法。
4.多态性的使用前提:1.类的继承关系;2.子类有方法的重写;3.父类引用指向子类对象;
5.对象的多态性只适用于方法,不适用于属性
 */
public class SICCSTest {
    public static void main(String[] args) {
        //对象的多态性:父类的引用指向子类的对象
        Animal an1 = new Dog();
        Animal an2 = new Cat();
        //调用的方法是子类重写的方法(虚拟方法)
        an1.shout();//Dog shout
        an2.shout();//Cat shout
        //an1.play();//不能调用父类中没有的方法,编译时an1是Animal类型

        //对象的多态性只适用于方法,不适用于属性
        System.out.println(an1.id);//1001
        System.out.println(an2.id);//1001

        //向下转型,使用子类特有的方法(存在转换不成功的风险,如子类之间强制转换)
        //通过instanceof判断
        if(an1 instanceof Dog){
            Dog dog = (Dog)an1;
            dog.play();//Dog play with kids
        }
        if(an1 instanceof Cat){
            Cat cat = (Cat)an1;
            cat.play();//
        }
//        Dog dog = (Dog)an1;
//        Cat cat = (Cat)an2;
//        dog.play();//Dog play with kids
//        cat.play();//Cat play the ball

        SICCSTest test = new SICCSTest();
        test.func(new Dog());
        test.func(new Cat());



    }

    //通过多态的使用,可以减少重复代码
    public void func(Animal animal){
        animal.eat();
        animal.shout();
    }

}

class Animal{
    int id = 1001;

    public void eat(){
        System.out.println("Animal eat");
    }
    public void shout(){
        System.out.println("Animal shout");
    }

}

class Dog extends Animal{
    int id = 101;
    public void eat(){
        System.out.println("Dog eat");
    }
    public void shout(){
        System.out.println("Dog shout");
    }

    public void play(){
        System.out.println("Dog play with kids");
    }

}

class Cat extends Animal{
    int id =110;
    public void eat(){
        System.out.println("Cat eat");
    }
    public void shout(){
        System.out.println("Cat shout");
    }
    public void play(){
        System.out.println("Cat play the ball");
    }

}

;