java中的多态

本文主要讲述java中的多态性质:

  老韩ppt,讲述多态的概念,如图所示:

vip

  • 向上转型:

代码结构如图:

  Animal类:

public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat(){
        System.out.println("animal在吃...");
    }
    private void sleep(){
        System.out.println("animal在睡觉...");
    }
}

  Cat类:

public class Cat extends Animal{
    // 调用父类的带参构造器
    public Cat(String name) {
        super(name);
    }

    public void eat(){
        System.out.println("猫吃鱼...");
    }
    public void CatchMouse(){
        System.out.println("猫抓老鼠...");
    }
}

  PloyDetail类:

public class PloyDetail {
    public static void main(String[] args) {
        Animal animal = new Cat("大黄");
        // animal.CatchMouse();
        animal.eat();
        animal.sleep();
     
    }
}

运行结果如下:

说明,编译阶段a是A的对象,但是在运行时,仍然按照子类的具体实现,即new ...,调用方法,先在具体实现的类中查找,如果没有再去父类中继续查找,例如eat()方法,子类Cat有该方法,直接调用,而sleep()方法,子类Cat中没有该方法,查看父类,父类中有sleep()方法,调用该方法。

向上转型注意细节:

① 向上转型的使用前提是继承,具体细节如下:

  向上转型:父类的引用指向了子类的对象,语法:父类类型 引用名 = new 子类类型();

② 可以调用父类的所有成员(遵循访问权限),但是不能调用子类的特有成员,原因如下:

  A a = new B(),A是B的父类,在编译阶段,a是A类的对象,能调用哪些成员,是由编译类型决定的。

③ 最终运行效果看子类的具体实现,调用方法时,按照从子类开始查找方法,如果子类没有,就从其父类查找,一层一层查找下去。最后,如果还是没有该方法,就报错。

  • 向下转型:

代码结构如图:

  Dog类:

public class Dog extends Animal{
    public Dog(String name) {
        super(name);
    }
}

  PloyDetail类:

public class PloyDetail {
    public static void main(String[] args) {
        Animal animal = new Cat("大黄");

        // animal.CatchMouse()
        animal.eat();
        animal.sleep();

        Cat cat = (Cat)animal;
        cat.CatchMouse();
//        Dog dog = (Dog)animal;

    }
}

运行结果如下:

 

 Cat cat =(Cat) animal,将Cat类的引用cat指向animal指向的内容。

 

 

 向下转型注意细节:

① 使用语法:子类类型 引用名 = (子类类型) 父类引用

Animal animal = new Cat("大黄");
Cat cat = (Cat)animal;

② 只能强转父类的引用,不能强转父类的对象

Animal animal = new animal("大黄");
Cat cat = (Cat)animal;

这种方式是错误的,animal已经是Animal类的对象了,无论是编译阶段还是在运行阶段。

③ 要求父类的引用必须指向当前目标类型的对象

Animal animal = new Cat("大黄");
Dog dog = (Dog)animal;

这种方式是错误的,animal在编译阶段是Animal类的对象,但是在运行时,是Cat类对象。

④ 当向下转型时,可以调用子类类型中的所有成员。

cat.CatchMouse();

 多态时,属性的值看编译类型。

posted @ 2022-12-14 15:49  zwGitOne  阅读(35)  评论(0编辑  收藏  举报