向上造型
计算机 编译过程 和运行过程


Pet pet = new Cat();
图中 pet.eat()为父类构造方法 、 pet.catchMouse()为子类方法
向上造型构成对象不能调用子类独有方法
出现方法重写会调用子类方法
向下造型

Cat cat1 = (Cat)new Pet 这种形式错误,不应出现
正确向下造型应该是
Pet pet = new Cat();
Cat cat2 = (Cat)pet;
这时可以应用子类方法
引用类型的数组类型对象
Dog[] dog = new Dog[2];
dog[0] = new  Dog("大巴",5,"蓝色");
dog[1] = new Dog("大黑",6,"蓝噻");
for (int i = 0; i < 2; i++) {
    System.out.println(dog[i]);
}
for (Dog dog1 : dog) {
    System.out.println(dog1.name+dog1.coatColor+dog1.age);
}
public class Dog  {
    String name;
    int age;
    String coatColor;
    public Dog() {
    }
    public  Dog(String name, int age, String coatColor) {
        this.name = name;
        this.age = age;
        this.coatColor = coatColor;
    }
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public String getCoatColor() {
    return coatColor;
}
public void setCoatColor(String coatColor) {
    this.coatColor = coatColor;
}引用类数组类型的 定时创建 随机子类对象
package com.poloymorphic.extendsx;
//import com.oracleday14.Dog;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
/**
 * 多态
 * 向上造型
 */
public class ExtendsDemo {
//        Cat cat = new Cat();
//
//        /**
//         *   创建对象时,编译首先  读到  Pet  pet
//         *   确定声明创建是一个Pet类型的对象
//         *   然后检查后面实际创建的类与声明创建的类是否有继承关系
//         *   有继承关系时编译通过  不会去管具体实际创建的子类到底是哪些
//         *   也就不知道有哪些子类具体的独有方法
//         *   只会调用继承了的父类的方法
//         *
//         */
//        Pet pet = new Cat();
//        //父类型的引用调用子类型的对象 叫做向上造型
//        pet.eat();
        pet.catchMouse();
//        //调用子类方法
//        //调用不了子类独有的方法
//
//
        Cat cat1 = (Cat)new Pet(); //类型不匹配异常
//        //子类型的引用指向父类型的对象  向下造型
//        Pet pet1 = new Pet();
//        Cat cat2 = (Cat)  pet;
//        Pet pets[] = {
//                new Cat(),
//                new Rabbits(),
//                new Dog(),
//                new Cat(),
//                new Dog(),
//                new Rabbits(),
//        };
//        for (int i = 0; i < pets.length; i++) {
//            if (pets[i] instanceof Dog) {
//                Dog dog = (Dog)pets[i];
//                dog.eat("骨头");
//            }else if (pets[i] instanceof Cat) {
//                Cat cat = (Cat)pets[i];
//                cat.eat("猫粮");
//            }else if (pets[i] instanceof Rabbits){
//                Rabbits rabbits = (Rabbits) pets[i];
//                rabbits.eat("萝卜");
//            }
//        }
        private Pet pets[] = {};     //自定义数组长度
//        Pet pets[] = new Pet[20];
    public Pet[] creatPets(){
        Arrays.copyOf(pets,pets.length+1);
        //每次调用creatPet数组  数组长度加1   创造一个新的pet对象
        Random random = new Random();
        for (int i = 0; i < pets.length; i++) {
            int n = random.nextInt(20);
            if (n <= 4){
                pets[i] = new Dog();
            }else if( n<= 12){
                pets[i] = new Rabbits();
            }else if (n <= 19){
                pets[i] = new Cat();
            }
        }
        //遍历for循环给声明的pet类型创建一个子类对象
        return pets;
        //creatPets给定一个返回值
    }
    /**
     *   遍历循环输出数组
     */
        public void printPet(Pet petss[]){
        for (Pet pet : petss) {
            System.out.println(petss);
        }
    }
    public static void main(String[] args) {
            ExtendsDemo exdemo = new ExtendsDemo();
            //创建定时器对象
        Timer timer = new Timer();
        timer.schedule(new TimerTask(){
            @Override
            public void run(){
                exdemo.creatPets();
                exdemo.printPet(exdemo.pets);
            }
        },0,1000);
    }
}
class Pet {
    String name;
    int age;
    String color;
    public void eat() {
        System.out.println("在吃东西");
    }
}
class Cat extends Pet {
    public void catchMouse() {
        System.out.println("抓老鼠");
    }
    public void eat(String food) {
        System.out.println("🐱吃"+food);
    }
}
class Dog extends Pet {
    public void bark() {
        System.out.println("叫唤");
    }
    public void eat(String food) {
        System.out.println("狗子吃" + food);
    }
}
class Rabbits extends Pet {
    public void eat(String food) {
        System.out.println("兔子吃" + food);
    }
}




![【LeetCode】数据结构题解(11)[用队列实现栈]](https://img-blog.csdnimg.cn/a5c4695c00b94865831cb79d75a45b32.png)













