• 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...");
        }
    }
  • 相关阅读:
    解决js计算0.1+0.2 !==0.3
    webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk
    jq轮播图插件
    如何在 GitHub 的项目中创建一个分支呢?
    VUE图片剪辑插件 React图片剪辑插件
    前端图片压缩上传
    vue实现rsa加密,数字签名,md5加密等
    vue-class-component使用Mixins
    微信小程序--获取用户地理位置名称(无须用户授权)的方法
    [学习笔记]二进制分组
  • 原文地址:https://www.cnblogs.com/kenantongxue/p/16229541.html
Copyright © 2020-2023  润新知