Java基础(多态)

目录

一、什么是多态

二、多态实现的必要条件

三、多态的特点

四、引用类型转换

五、通过一个题目来分析多态的使用

后言


一、什么是多态

  • 多态是同一个行为具有多个不同的表现形式或形态的能力

二、多态实现的必要条件

  1. 在多态中必须存在有继承或实现关系的子类和父类
  2. 子类对父类中的某些方法进行重新定义
  3. 父类引用指向子类对象 ---->向上转型

示例:

public class Test {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.show1());
        System.out.println(a.show2());
        System.out.println(a.show3());
    }
}

class A {
    public String show1() {
        return "111";
    }
    public String show2() {
        return "222";
    }
}

class B extends A {
    public String show2() {
        return "333";
    }

    public String show3() {
        return "333";
    }
}

 

该代码画出过程分析图:

可以看出,该代码虽然创建的是B类型对象,但最后选择a数据类型时选择的A类,因此a只能调用到图中的show1()和被创建B类型时重写后的show2(),而无法调用到B类中的show3(),这就是多态使用的一个基本示例

三、多态的特点

  1. 子类和父类存在同名的成员变量时,访问的是父类的成员变量
  2. 子父类存在同名的非静态成员方法时,访问的是子类中重写的方法
  3. 子父类存在同名的静态成员变量成员方法时,访问的是父类的成员
  4. 不能访问子类独有的方法

四、引用类型转换

对于父类和子类的关系,用图来描述

People父类是大范围的类型,而Student和Teacher类均属于People类的子类,所以对于子类这种范围小的,我们可以自动转型给父类的变量,而儿子向上转型,父亲是唯一的,因此是自动转换

使用格式:

父类类型  变量名  = new 子类类型();

People student = new Student()

通过Student类new出来的变量student作为中介,再通过People类选择指向,从而完成了向上转型

相当于是

People student = (People)new Student()

五、通过一个题目来分析多态的使用

public class A {
    public String show(D obj) {
        return ("A and D");
    }
    public String show(A obj) {
        return ("A and A");
    } 
}
public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}
public class C extends B{
}
public class D extends B{
}
public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
    }
}

1~3

a1创建的是A类对象,选择的数据类型也是A,因此可以调用A类当中的Show(D obj)和Show(A obj)方法

1、a1.Show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行Show(A obj)方法,所以输出 A and A

2、a1.Show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行Show(A obj)方法,所以输出 A and A

3、a1.Show(d)传参为D类型的d,因此执行Show(D obj)方法,所以输出 A and D

4~6

a2创建的是B类对象,选择的数据类型是A类型,因此a2可以调用A类当中的Show(D obj)和被B类重写过后的Show(A obj)方法

4、a2.Show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行被B类重写后的Show(A obj)方法,所以输出 B and A

5、a2.Show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行被B类重写后的Show(A obj)方法,所以输出 B and A

6、a2.Show(d)传参为D类型的d,因此执行A中的Show(D obj)方法,所以输出 A and D

7~9

b创建的是B类对象,选择的数据类型是A,因为B继承A,所以b可以调用A类当中的Show(D obj)方法和B类当中的show(B obj)、show(A obj)(该方法对A中该方法进行了重写)方法

7、b.show(b)传参为B类型的b,B继承A,所以b可以向上转型成A类型,因此执行B类中的Show(A obj)方法,所以输出 B and A

8、b.show(c)传参为C类型的C,C继承B,B继承A,所以c可以向上转型成B类型再继续向上转型成A类型,因此执行B类中的Show(A obj)方法,所以输出 B and A

9、b.show(d)传参为D类型的d,因此执行A中的Show(D obj)方法,所以输出 A and D


后言

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值