zoukankan      html  css  js  c++  java
  • Java第十天,多态

    多态

    一、多态的定义:

    一个对象拥有多种形态,这就是对象的多态性。也就是说多态针对的是对象。多态的前提是接口和继承(C++中实行多继承,不存在接口)。

    二、多态在代码中的形式:

    父类 对象名 = new 子类();

    或者

    接口 对象名 =  new 实现类();

    三、成员方法使用规则:

    右边new的是谁,便使用谁的成员方法(编译看左,运行看右)。

    四、成员变量使用规则:

    ①直接通过对象名访问成员变量:

    看等号左边是谁,则优先用谁。没有则向上找。

    ②间接通过成员方法访问成员变量:

    看该方法属于谁,则优先用谁,没有则向上找。

    五、对象的转型:

    ①向上转型

    (1)其实就是多态的写法,左父右子。向上转型一定是安全的。

    (2)对象无法调用子类特有方法。

    ②向下转型

    (1)其实就是还原过程(只能还原为原来类别)。格式为:

    子类 对象名 = (子类)父类对象

    (2)转型很可能会失败(本来是猫,向上转为动物后,又向下转型为狗)。

    (3)如何判断对象本来属于哪个类(子类)。

    对象 instanceof 类 ==》 返回一个布尔值。

    六、多态的注意事项:

    1. 只有成员方法才能覆盖重写,成员变量不可以覆盖重写。
    2. 父类如果要调用子类的方法必须要有同名方法。
    3. 多态情况下,子父类存在着同名的成员变量时,默认会访问父类的成员变量。
    4. 多态情况下,子父类存在着同名的非静态函数时,默认是访问子类的成员函数。
    5. 多态情况下,子父类存在着同名的静态函数时,默认是访问父类的成员函数。
    6. 多态情况下,不能访问子类特有的成员。

    七、代码

    Animal类:

    package com.lanyue.day08;

    public abstract class Animal {

        public static String INFO = "动物界";

        public abstract void eat();
        public abstract void work();
    }


    Dog类:

    package com.lanyue.day08;

    public class Dog extends Animal{

        @Override
        public void eat() {

            System.out.println("狗吃骨头");
        }

        @Override
        public void work() {

            System.out.println("狗能看家");
        }
    }


    Cat类:

    package com.lanyue.day08;

    public class Cat extends Animal{

        @Override
        public void eat() {

            System.out.println("猫吃鱼");
        }

        @Override
        public void work() {

            System.out.println("猫能抓老鼠");
        }

        public void catPlay(){

            System.out.println("猫喜欢玩");
        }
    }


    运行类:

    package com.lanyue.day08;

    public class Demo {

        public static void main(String[] args) {

            Dog dog = new Dog();
            dog.eat();
            dog.work();

            Cat cat = new Cat();
            cat.eat();
            cat.work();

            Animal animal = new Cat();
            animal.eat();
            animal.work();

            if(animal instanceof Cat){

                ((Cat) animal).catPlay();
                System.out.println("猫属于" + Animal.INFO);
            }
        }
    }


  • 相关阅读:
    C#动态调用WCF接口(2)
    WCF 动态调用(1)
    WCF信道工厂Channel Factory
    使用 ObjectDataSource 缓存数据
    DatabaseFactory.CreateDatabase 方法操作数据库
    大学毕业4年-回想和总结(5)-投资理財方法论
    用递归法将一个整数n转换成字符串。
    朴素贝叶斯
    Android热补丁技术—dexposed原理简析(阿里Hao)
    SQLAlchemy使用笔记--SQLAlchemy ORM(三)
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700540.html
Copyright © 2011-2022 走看看