当前位置 : 主页 > 编程语言 > c语言 >

多态和动态绑定

来源:互联网 收集:自由互联 发布时间:2023-09-06
1. 多态接上 2. instanceof比较操作符 instanceof 比较操作符,用于判断 对象的运行类型 是否为 XX 类型或 XX 类型的子类型【举例说明】 代码在com.stulzl.poly_detail03.包中 311 PolyDetail03 package co

1. 多态接上

2. instanceof比较操作符

instanceof 比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型【举例说明】

代码在com.stulzl.poly_detail03.包中 311

PolyDetail03

package com.stulzl.poly_detail03;

//instanceof 比较操作符,用于判断对象的运行类型是否为 XX 类型或 XX 类型的子类型
public class PolyDetail03 {
    public static void main(String[] args) {
        //重点理解:判断对象的运行类型是否为 XX 类型或 XX 类型的子类型
        BB bb = new BB();
        System.out.println(bb instanceof BB);//true
        System.out.println(bb instanceof AA);//true

        //aa 编译类型AA 运行类型是BB
        AA aa = new BB();
        System.out.println(aa instanceof AA);//true
        System.out.println(aa instanceof BB);//true

        Object obj = new Object();
        System.out.println(obj instanceof AA);//false

        String str = "hello";
        System.out.println(str instanceof Object);//true
    }
}
class AA{//父类

}
class BB extends AA{//子类

}

3. 多态的练习

3.1 例1 312

请说出下面的每条语言,哪些是正确的,哪些是错误的,为什么?

多态和动态绑定_多态

3.2 例2 313

判断输出

package com.stulzl.polyexercise;

public class PolyExercise {
    public static void main(String[] args) {
        Sub s = new Sub();
        System.out.println(s.count);//20
        s.display();//20

        Base b = s;//这里相当于多态 Base b = new Sub;向上转型
        System.out.println(b==s);//true//相当于判断地址,二者都指向Sub,地址一样
        System.out.println(b.count);//10
        b.display();//20
    }
}
class Base{//父类
    int count=10;
    public void display(){
        System.out.println(this.count);
    }
}
class Sub extends Base{//子类
    int count =20;
    public void display(){
        System.out.println(this.count);
    }
}

4. java动态绑定机制(非常重要) 314

当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

当调用对象属性时,没有动态绑定机制,哪里声明那里使用

多态和动态绑定_动态绑定_02

4.1 问题引入判断输出

代码在com.stulzl.dynamic_binding.包中

DynamicBinding

package com.stulzl.dynamic_binding;

//动态绑定机制  314
public class DynamicBinding {
    public static void main(String[] args) {
        //a 的编译类型 A, 运行类型 B
        A a = new B();//向上转型

        //当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
        //?40 再注销B类中的sum时 产生动态绑定 父类中的sum()方法包括了 getI()方法由于
        // 产生动态绑定 此getI()方法调用子类getI() 即 20+10   30
        System.out.println(a.sum());

        //当调用对象属性时,没有动态绑定机制,哪里声明那里使用
        //?30 再注销B类中的sum1时 属性不会产生动态绑定 继续使用父类 sum1()
        // 即 return i + 10;//10 + 10  20
        System.out.println(a.sum1());
    }
}
class A {//父类
    public int i = 10;
    //动态绑定机制:
    public int sum() {//父类 sum()
        return getI() + 10;  //20 + 10
    }
    public int sum1() {//父类 sum1()
        return i + 10;//10 + 10
    }
    public int getI() {//父类 getI
        return i;
    }
}
class B extends A {  //子类
    public int i = 20;

//    public int sum() {
//        return i + 20;
//    }

    public int getI() {//子类 getI()
        return i;
    }

//    public int sum1() {
//        return i + 10;
//    }
}
【文章出处:滨海网站建设公司 http://www.1234xp.com/binhai.html 复制请保留原URL】
上一篇:操作符
下一篇:没有了
网友评论