• Java中多态


    1.1 多态的概述及其代码体现

    * A:多态(polymorphic)概述

    * 事物存在的多种形态

    * B:多态的前提

    * a:要有继承关系

    * b:要有方法重写。

    * c:要有父类引用指向子类对象。

    代码:

    public class Demo01_Polymorphic {
    public static void main(String[] args) {
    Cat cat = new Cat(); // new Cat()是一个对象,小猫是一只猫
    cat.eat();

    Animal animal = new Cat(); // 父类引用指向子类对象,子类即父类
    animal.eat();
    }
    }

    //基本类
    class Animal{
    public void eat(){
    System.out.println("动物吃饭");
    }
    }

    // 猫类继承了动物类
    class Cat extends Animal{
    // 重写了父类方法
    public void eat(){
    System.out.println("猫吃鱼");
    }
    }

    1.2多态中成员方法的特点

    1.2.1 成员变量

    A:多态中成员访问的特点

        * a:成员变量

            * 编译看左边(父类),运行看左边(父类)。

    
    

    代码:

    public class Demo02_Polymorphic {
    public static void main(String[] args) {
    Father f = new Son(); // 父类引用指向子类对象
    System.out.println(f.num); //10 f是Father类型的,只能看到father那一块输出的结果是10
    Son son = new Son();
    System.out.println(son.num);
    }
    }
    // 父类
    class Father{
    int num = 10;
    }

    // 继承父类
    class Son extends Father{
    int num = 20;
    }
    
    

    内存图:

    
    

    1.2.2 成员方法

    A:多态中成员访问的特点

        * a:成员方法

            * 编译看左边(父类),运行看右边(子类)。(只有这一种情况是真正的多态)

    1.2.3 静态方法

    A:多态中成员访问的特点

        * a:静态方法

            * 编译看左边(父类),运行看左边(子类)。

    
    

    代码:

    
    
    public class Demo02_Polymorphic {
    public static void main(String[] args) {
    Father f = new Son(); // 父类引用指向子类对象 f是Father类型 int a
    f.show(); // 成员方法的动态绑定
    }
    }
    // 父类
    class Father{
    int num = 10;
    public static void show(){
    System.out.println("Father static 父类");
    }
    }

    // 继承父类
    class Son extends Father{
    int num = 20;
    // 子类重写了父类的方法
    public static void show(){
    System.out.println("Son staitc 子类");
    }
    }

    1.3 多态中向上转型和向下转型

    A:案例演示
        * 详细讲解多态中向上转型和向下转型
        * Person p = new SuperMan(); 向上转型
        * SuperMan sm = (SuperMan)p; 向下转型

    代码:

    /**
    * A:案例演示
    * * 详细讲解多态中向上转型和向下转型
    * * Person p = new SuperMan(); 向上转型
    * * SuperMan sm = (SuperMan)p;向下转型
    */
    public class Demo03_Polymorphic {
    public static void main(String[] args) {
    Person p = new SuperMan(); // 父类引用指向子类对象
    p.business();
    // p.fly(); // 超人所具有特性 父类的对象无法使用子类的特有方法

    SuperMan s1 = (SuperMan)p; // int i = (int)5.0;
    s1.fly(); // 这时候可以调用子类的特有方法
    }
    }

    class Person{
    String name = "John";
    public void business() {
    System.out.println("谈生意");
    }
    }

    class SuperMan extends Person{
    String name = "SuperMan";

    // 重写了谈生意的方法
    public void business() {
    System.out.println("谈几个亿的大单");
    }
    // 特有的方法
    public void fly() {
    System.out.println("飞出去救人");
    }
    }

    1.4 多态的好处和弊端

    * A:多态的好处

    * a:提高了代码的维护性(继承保证)

    * b:提高了代码的扩展性(由多态保证)

    * B:案例演示

    * 多态的好处

    * 可以当作形式参数,可以接收任意子类对象

    * C:多态的弊端

    * 不能使用子类的特有属性和行为。

    代码:

    
    
    public class Demo01_Polymorphic {
    public static void main(String[] args) {
    Cat cat = new Cat();
    method(cat); // 第一次调用时Animal a = cat{new Cat()};
    Dog dog = new Dog();
    method(dog); // 第二次调用时Animal a = dog{new dog()};
    Pig pig = new Pig();// 第一次调用时Animal a = pig{new Pig()};
    method(pig);
    }

    public static void method(Animal a){ // 父类的引用指向子类对象
    a.eat();
    }
    }

    //基本类
    class Animal{
    public void eat(){
    System.out.println("动物吃饭");
    }
    }

    // 猫类继承了动物类
    class Cat extends Animal{
    // 重写了父类方法
    public void eat(){
    System.out.println("猫吃鱼");
    }
    }

    class Dog extends Animal{
    // 重写了父类方法
    public void eat(){
    System.out.println("狗吃骨头");
    }
    }

    class Pig extends Animal{
    // 重写了父类方法
    public void eat(){
    System.out.println("吃玉米");
    }
    }
  • 相关阅读:
    最主要的商业模式
    Linux-清除rootpassword
    Drupal 关于节点(nodes)的理解
    hdu4240 求一条流量最大的路/(此题网上百分之90以上算法是错误的)
    LeetCode Next Permutation
    关于使用strtok的一个小问题
    SDUT--Pots(二维BFS)
    微信 小程序组件 滑动导航和获取元素实际高度
    微信 小程序组件 电话
    微信小程序组件 客服
  • 原文地址:https://www.cnblogs.com/LEPENGYANG/p/14992050.html
Copyright © 2020-2023  润新知