Java基础-编译类型和运行类型(多态)

package com.hspedu.testpoly_;

import org.junit.Test;

public class TestPoly_ {

    /**
     * 1、编译类型和运行类型:
     * 例如:Animal dog = new Dog("小白");
     * Animal是编译类型(=的左边),Dog是运行类型(=的右边)
     * 
     * 2、编译类型确定即不能再改变,运行类型可以修改
     * 例如:Animal white = new Dog("小白狗");
     * white = new Cat("小白猫");
     * 
     * 3、程序的执行结果是根据运行类型决定的,但是编译类型决定可以调用的方法有哪些
     * 例如:Animal white = new Dog("小白狗");
     * white对象可以调用的方法有:eat方法(Animal类里的所有方法),不能调用Dog类里的run方法
     * white对象调用的eat方法的执行结果,是Dog类的eat方法执行结果
     */
    @Test
    public void testPolymorphism() {
        Animal white = new Dog("小白狗");
        white.eat();
//        white.run();  // 错误:没有run方法

        white = new Cat("小白猫");
        white.eat();
//        cat.jump();   // 错误:没有jump方法
    }
}

class Animal {
    String name;

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

    public void eat() {
        System.out.println("觅食...");
    }
}

class Dog extends Animal {
    String name;

    public Dog(String name) {
        super(name);
        this.name = name;
    }

    @Override
    public void eat() {
        System.out.println(name + "在啃骨头..");
    }

    public void run() {
        System.out.println("dog run...");
    }
}

class Cat extends Animal {
    String name;

    public Cat(String name) {
        super(name);
        this.name = name;
    }

    @Override
    public void eat() {
        System.out.println(name + "在吃鱼..");
    }

    public void jump() {
        System.out.println("cat jump...");
    }
}

1、多态是两个类存在继承关系;

2、多态向上转型:父类的引用指向子类的对象;语法:父类 xxx = new 子类();

3、可以调用父类中的所有方法,前提是有访问权限,不能调用子类的独有方法;

  程序在编译阶段,已经决定这个对象可以调用的属性、方法

4、程序运行结果是根据运行类型决定。

 

package com.hspedu.testpoly_;

import org.junit.Test;

public class TestPoly_ {

    /**
     * 父类对象指向子类时,如何调用子类方法?
     * 例如:Animal white = new Dog("小白狗");
     * white不能直接调用run方法,需要进行向下转型
     * Dog dog = (Dog) white;
     * dog则可以调用子类Dog中的所有方法
     */
    @Test
    public void testPolymorphism() {
        Animal white = new Dog("小白狗");
        white.eat();
//        white.run();  // 错误:没有run方法
        Dog dog = (Dog) white;
        dog.run();

        white = new Cat("小白猫");
        white.eat();
        Cat cat = (Cat) white;
        cat.jump();

    }
}

class Animal {
    String name;

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

    public void eat() {
        System.out.println("觅食...");
    }
}

class Dog extends Animal {
    String name;

    public Dog(String name) {
        super(name);
        this.name = name;
    }

    @Override
    public void eat() {
        System.out.println(name + "在啃骨头..");
    }

    public void run() {
        System.out.println(name + " run...");
    }
}

class Cat extends Animal {
    String name;

    public Cat(String name) {
        super(name);
        this.name = name;
    }

    @Override
    public void eat() {
        System.out.println(name + "在吃鱼..");
    }

    public void jump() {
        System.out.println(name + " jump...");
    }
}

 

posted @ 2022-05-06 16:58  柯南同学  阅读(341)  评论(0编辑  收藏  举报