【JAVA学习笔记】什么时多态?多态的使用

提示:本文章用途只为学习,部分代码来源于网络,如有侵权,请联系私信博主删除

文章目录

  • 一、多态是什么?
  • 二、对象的多态性
  • 三、.多态的使用
  • 四、多态性使用前提
  • 总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、多态是什么?

1.理解多态性:可以理解为一个事物的多种形态。

2.对象的多态性:只适用于方法,不适应于属性(编译和运行都看左边,只有右边会报错)

二、对象的多态性

父类的引用指向子类的对象

三、.多态的使用

虚拟方法调用
有了对象的多态性以后,只能调用父类中声明的方法,但在运行期,实际执行的时子类重写父类的方法
编译看左边,运行看右边

四、多态性使用前提

①:要有类的继承关系
②:又有方法的重写

部分测试代码如下:

package com.duotai;

/**
 * @description:
 * @author: z1415
 * @time: 2022/7/18 9:56
 */
public class Man extends Person{
    boolean isSmoking;
    int id = 1002;


    public void earnMoney(){
        System.out.println("男人负责挣钱养家");
    }

    public void eat(){
        System.out.println("男人多吃饭:张力气");
    }

    public void walk(){
        System.out.println("走路八七");
    }
}
package com.duotai;

/**
 * @description:
 * @author: z1415
 * @time: 2022/7/18 9:54
 */
public class Person {
    String name;
    int age;
    int id = 1001;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public void eat(){
        System.out.println("人:吃饭");
    }
    public void walk(){
        System.out.println("人:走路");
    }
}

package com.duotai;

/**
 * @description:
 * @author: z1415
 * @time: 2022/7/18 9:58
 */
public class Woman extends Person{
    boolean isBeauty;

    public void goShopping(){
        System.out.println("女人喜欢购物");
    }

    public void eat(){
        System.out.println("女人少吃");
    }
    public void walk(){
        System.out.println("窈窕走路");
    }
}

    有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法中,但是由于变量声明为父类类型,导致
    编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能用。

   如何调用子类特有的属性和方法?
    使用强制类型转换符,向下转型,使用instanceof进行判断
    进行instanceof的判断,一旦返回true,就进行向下转型,如果返回false,不进行向下转型。
    
    如果a instanceof A返回true,则a instanceof B也返回true
    其中,B是类A的父类

    使用强制转换时,可能出现ClassException的异常。
*/
/**
 * @description:面向对象之三:多态性
 * @author: z1415
 * @time: 2022/7/18 10:00
 */
public class PersonTest {
    public static void main(String[] args){
        Person p1 = new Person();
        p1.eat();

        Man man = new Man();
        man.eat();
        man.age = 25;
        man.earnMoney();

        //********************************************************
         System.out.println("*********************************");
        //(对象的)多态性:父类的引用指向子类的对象
         Person p2 = new Man();

//         Person p3 = new Woman();
        //多态的使用:当调用子父类同名参数的方法时,实际执行的时子类重写父类的方法------虚拟方法的调用

         p2.eat();
         p2.walk();

         System.out.println("********************");

         System.out.println(p2.id);

         System.out.println("*****************************");
         //不能调用子类特有的方法、属性,编译时,p2是Person属性
        // p2.earnMoney();
        p2.name = "Tom";

        Man m1 = (Man) p2;
        m1.earnMoney();
        m1.isSmoking = true;

        //instanceof关键字的使用A:判断对象a是否是类A的实例。如果是,返回true,如果不是,返回woman
        if(p2 instanceof Woman){
            Woman w1 = (Woman) p2;

            w1.goShopping();
            System.out.println("********Woman********");
        }

        if(p2 instanceof Man){
            Man w2 = (Man) p2;

            w2.earnMoney();
            System.out.println("********Man********");
        }

        //练习
        //问题一:编译通过,运行不通过
//        Person p3 = new Woman();
//        Man m3 = (Man)p3;

        //问题二:编译通过,运行也通过
        Object obj = new Woman();
        Person p = (Person) obj;

    }
}

总结

本篇博文主要写了JAVA面向对象的三大特征之一——多态的学习过程,如何使用多态,使用好多态还值得我们继续学习

你可能感兴趣的:(Java学习笔记,java,学习,开发语言)