• 多态详解


    1.多态的定义:

    父类的引用调用子类的对象

    2.多态的特点

    2.1 引用类型可变,对象类型不变:

    例如:

    class Child extends Parent

    Parent a=new Child();

    Chils b=new Child();

    2.2 只能调用引用类型中的引用的方法

    例如:

    Child中有一个sleep(),Parent中也有一个sleep();

    那么:

    2.2.1 a.sleep();就是可以调用的

    若 Parent中没有sleep();

    那么:

    2.2.2 a.sleep();会报编译错误

    2.3 子类中的方法覆写了父类中方法

    例子:

    上一个2.2.1 中实现就是会调用子类中的sleep()方法

    3.多态的作用:

    主要是提高了代码的通用性:

    也就是你一个父类Parent有多个子类,而多个子类中都覆写了父类中的某个方法

    那么可以只创建一个父类引用指向这多个子类对象的方法就行了


    最后国际惯例:贴上练习代码君:

    package com.jacob.javase;


    /*
     * 多态:父类引用子类的对象(主要作用就是使用子类中的重写方法)
     */
    public class Polymorphism {
    public static void main(String[] args) {
    // 提升练习:
    A a = null;
    // 这个作用主要是通过与程序交互一步一步发现new对象变化实现
    if (args[0].equals("1")) {
    a = new B();
    // B b=new B();
    // b=(B)a;
    // b.method();
    } else if (args[0].equals("2")) {
    a = new C();
    } else if (args[0].equals("3")) {
    a = new D();
    }


    a.method();
    // a.method(true);
    B b=new C();
    b.method(true);
    System.out.println(a.common);
    System.out.println(b.common);
    // 基础知识:
    // 多态:父类的引用指向子类的对象
    // A a = new B();// 这就是多态
    // System.out.println(a.common);//——0;调用的A的属性
    // 多态调用方法:若父类中没有此方法,子类中有,报编译错误
    // "The method method() in the type A is not applicable for the arguments (boolean)"
    // 这是报的错,说明a还是一个A对象 ,因为我在B中定义了
    // a.method(true);
    // 试一下A、B中共有的方法
    // a.method();// 没问题;看一下输出就知道调用的那个了……B,这说明调用的B中的方法
    // 向上类型转换:子类转父类——没必要强制转换
    // A a1 = new A();


    // B b = new B();
    // a1 = b;// 直接就转换了
    // System.out.println(a1.common);——0;调用的A的属性
    // System.out.println(b.common);
    // a=b;
    // a1.method(true);和上报一样的错
    // a1.method();// ——B,依然调用的是b中的方法
    // 向下类型转换
    // b=a;“Type mismatch: cannot convert from A to B”
    // b=(B)a;//需要强制转换
    // b.method();//——B
    // b.method(true);//
    }
    }


    class A {
    int common;


    public A() {
    System.out.println("A的无参构造函数");
    }


    public void method() {
    System.out.println("A");
    }
    }


    class B extends A {
    int common = 1;


    // int special;
    public B() {
    System.out.println("B的无参构造函数");
    }


    public void method() {
    System.out.println("B");
    }


    public void method(Boolean a) {
    System.out.println("此方法为B中有而A中无,就是这么任性");
    }
    }


    class C extends B {
    int common = 2;


    public C() {
    System.out.println("C的无参构造函数");
    }


    public void method() {
    System.out.println("C");
    }

    public void method(Boolean a) {
    System.out.println("此方法为C、B中有而A中无,就是这么任性");
    }
    }


    class D extends C {
    public void method() {
    System.out.println("D");
    }
    }


  • 相关阅读:
    Linux安装MySql
    Tomcat9配置SSL证书
    Linux安装Tomcat
    VMware安装Centos8
    Linux安装JDK
    mysql中utf8和utf8mb4区别
    MVVM模式
    深入浅析Node.js单线程模型
    同步异步阻塞非阻塞
    v-model
  • 原文地址:https://www.cnblogs.com/xieji233/p/6155640.html
Copyright © 2020-2023  润新知