多态(入门)

204 阅读2分钟

多态

(建立在封装和继承基础之上,若果没有两者存在,多态也没了意义)

image.png

image.png

对象的多态是多态的核心

重载:

 class A extends B{
        //和下面的sum构成重载
        public int sum(int n1,int n2){
            return n1+n2;
        }
        public int sum(int n1,int n2,int n3){
            return n1+n2+n3;
        }
    }

利用不同的参数个数去调用sum()方法,就会去钓鱼不同的方法,因此对sum方法来说,就是多种状态的体现

重写:

class B{
        public void say(){
            System.out.println("B 方法被调用");

        }
    }
    

    class A extends B{
     
        public void say(){
            System.out.println("A 方法被调用");
    }

在调用时系统会自动定位各个类的同名方法

多态的具体体现(基础):

向上转型:父类的引用指向子类的对象

原则(父类的引用指向子类的对象)编译对象的等级要大于运行类型才成立,同等级的子类也不行

image.png

image.png

案例:(向上转型)

image.png

在编译阶段,能调用哪些成员是由编译类型来决定的。(也别忘了访问权限的问题)

对于成员的调用先看编译类型,对于方法的调用,先看运行类型。

image.png

【最终运行效果看子类(运行类型)的具体实现——>即调用方法时,按照从子类开始查找方法,然后调用,规则和方法调用一致。】

image.png

image.png

如果你想用到子类里的方法,但是创建的对象的编译类型是父类的类型,这时就用到了向下转型

案例:(向下转型)

image.png

image.png

image.png

违反了第四条规定:要求父类的引用必须是当前目标引用的对象。不能将Cat强制转换成一个没有继承关系的Dog。

学到此处又引出了属性与重写的问题(属性没有重写之说,属性的值看编译类型,与调用方法不一样):

image.png

image.png

instanceOf(比较操作符)

题目给定:AA是BB的父类

image.png

aa的编译类型是AA,运行类型是BB,aa instanceof AA是比较(aa的运行类型)与 AA的等级高低,aa的等级低就返回true,aa的等级高就返回false。

训练例题:

1、

image.png

2、

image.png

3、

image.png

  1. obj—-》BBB,b1=obj
  2. b1—–》BBB
  3. obj—–》CCC,obj=b1
  4. obj—–》BBB

此时如果调用obj.XXX();就要从XXX();进行查找。