Java中的多态

A.多态的概述

a.简单说明:多态即为同一个对象在不同时刻表现出的不同形态。

B.多态的前提和体现:

1.有继承/实现关系

2.有方法重写

3.有父类引用指向子类对象

4.代码演示;

package demo120;

/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的实现前提
 *               1.有继承/实现关系
 *               2.有方法重写
 *               3.有父类引用指向子类对象
 */
public class Cat extends Animal {
        //有方法重写
    @Override
    public void eat() {
        System.out.println("猫要吃鱼。。。。");
    }
}
package demo120;

/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的实现前提
 *              举例子;我们说猫是猫:猫 Cat = new 猫();
 *                   也可以说猫是动物:动物 Animal = new 猫();
 *                   这里我们举猫的例子就是多态的表现形式
 *               多态的前提和体现:
 *                  1.有继承/实现关系
 *                  2.有方法重写
 *                  3.有父类引用指向子类对象
 *
 */
public class Animal {
    //Animal类中的方法
    public void eat() {
        System.out.println("动物要吃东西。。。。");
    }

}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的实现前提
 *              测试类
 */
public class AnimalDemo {
    public static void main(String[] args) {
        //有父类引用指向子类对象
        Animal a = new Cat();
    }
}

C.多态中成员访问的特点​​​

a:成员变量:编译看左边,执行看左边

b:成员方法:编译看左边,执行看右边(因为子类重写了父类的方法

c.代码演示:

package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态中成员访问的特点(父类)
 *              1.成员变量;编译看左边,执行看左边
 *              2.成员方法:编译看左边,执行看右边
 */
public class Animal02 {
    //Animal02中的成员变量
    public int age = 8;

    //Animal02中的成员方法
    public void eat() {
        System.out.println("动物要吃东西。。。。");
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态中成员访问的特点(子类)
 *              1.成员变量;编译看左边,执行看左边
 *              2.成员方法:编译看左边,执行看右边
 */
public class Cat02 extends Animal02 {
    //Cat02类中的成员变量
    public int age = 3;
    public int weight = 15;

    //重写Animal02类中的eat()方法
    @Override
    public void eat() {
        System.out.println("猫要吃鱼。。。。。");;
    }
    //自己本身的成员方法
    public void play() {
        System.out.println("猫要玩耍。。。。。");
    }

}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态中成员访问的特点(测试类)
 *              1.成员变量;编译看左边,执行看左边
 *              2.成员方法:编译看左边,执行看右边
 */
public class AnimalDemo02 {
    public static void main(String[] args) {
        //父类引用指向子类对象
        Animal02 a = new Cat02();
        //成员变量;编译看左边,执行看左边(输出父类的成员变量age)
        System.out.println(a.age);

//        //成员变量;编译看左边,执行看左边(如果尝试输出子类(右边)的成员变量则会报错)
//        System.out.println(a.weight);

        //成员方法:编译看左边,执行看右边(因为子类重写了父类的成员方法)
        a.eat();


    }
}
8
猫要吃鱼。。。。。

Process finished with exit code 0

可以看到在控制台输出了"8"(父类中的成员变量,对应:成员变量编译看左边,执行看左边),"猫要吃鱼。。。。"(子类中的成员方法,对应:成员方法编译看左边,执行看右边)

D.多态的好处与弊端;

a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,在将来使用时使用具体的子类型参与操作。

b.弊端:不能使用子类的特用功能。

c.代码演示;

package demo120;

/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的好处与弊端
 *              a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,
 *              在将来使用时使用具体的子类型参与操作。
 *
 *              b.弊端:不能使用子类的特用功能。
 *              父类
 */
public class Animal03 {

    public void eat() {
        System.out.println("动物要吃东西。。。。");
    }

}
ackage demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的好处与弊端
 *              a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,
 *              在将来使用时使用具体的子类型参与操作。
 *
 *              b.弊端:不能使用子类的特用功能。
 *              子类
 */
public class Cat03 extends Animal03 {
    //方法重写

    @Override
    public void eat() {
        System.out.println("猫要吃鱼。。。。。");
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的好处与弊端
 *              a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,
 *              在将来使用时使用具体的子类型参与操作。
 *
 *              b.弊端:不能使用子类的特用功能。
 *              子类
 */
public class Dog03 extends Animal03 {
    //方法重写

    @Override
    public void eat() {
        System.out.println("狗子要吃肉骨头。。。。。");
    }

    //在此处给狗类添加一个自己独特的成员方法
    public void play() {
        System.out.println("狗子要拆家。。。。。。");
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的好处与弊端
 *              a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,
 *              在将来使用时使用具体的子类型参与操作。
 *
 *              b.弊端:不能使用子类的特用功能。
 *              操作类
 */
public class UseAnimal03 {
    //把父类型作为参数
    public void useAnimal(Animal03 a) {
        a.eat();
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的好处与弊端
 *              a.好处:提高了程序的扩展性。具体体现在定义方法的时候使用父类型作为参数,
 *              在将来使用时使用具体的子类型参与操作。
 *
 *              b.弊端:不能使用子类的特用功能。
 *              测试类
 */
public class AnimalDemo03 {
    public static void main(String[] args) {
        //创建操作类的对象
        UseAnimal03 ua = new UseAnimal03();

        //创建猫类对象
        Animal03 cat = new Cat03();

        //创建狗类的对象
        Animal03 dog = new Dog03();

        //调用操作类的方法
        ua.useAnimal(cat);
        ua.useAnimal(dog);

        //弊端:不能使用子类的特用功能测试类,
        //报错:Cannot resolve method 'play' in 'Animal03'
//        dog.play()
    }
}

E.多态中的转型;

a.向下转型:从子到父类,父类引用指向子类对象。

b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题

c.代码演示;

package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的转型
 *                  a.向下转型:从子到父类,父类引用指向子类对象。
 *
 *                  b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题)
 *
 *                  父类
 */
public class Animal04 {
    public void eat() {
        System.out.println("动物要吃东西。。。。。");
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的转型
 *                  a.向下转型:从子到父类,父类引用指向子类对象。
 *
 *                  b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题)
 *
 *                  子类
 */
public class Cat04 extends Animal04 {
    @Override
    public void eat() {
        System.out.println("猫要吃鱼。。。。。。");
    }

    //子类自己的方法
    public void play() {
        System.out.println("猫要玩。。。。。");
    }
}
package demo120;
/**
 * @author ln
 * @date 2022/1/20
 * @description 多态的转型
 *                  a.向下转型:从子到父类,父类引用指向子类对象。
 *
 *                  b.向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题)
 *
 *                  测试类
 */
public class AnimalDemo04 {
    public static void main(String[] args) {
        //向下转型:从子到父类,父类引用指向子类对象。
        Animal04 a = new Cat04();
        a.eat();

        //向上转型:从父到子,父类引用抓换为子类对象(解决了多态不能访问子类独自的方法问题)
        Cat04 c =(Cat04) a;
        c.eat();
        //可以调用子类自己的方法了
        c.play();
    }
}
猫要吃鱼。。。。。。
猫要吃鱼。。。。。。
猫要玩。。。。。

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值