前期绑定与后期绑定

本文介绍了绑定的概念,分为前期绑定和后期绑定两种类型。前期绑定包括final、static、private、构造方法和成员变量,而后期绑定则在运行时根据对象类型进行绑定,实现多态性。Java通过一小段特殊代码实现后期绑定,使得每个对象可以有不同行为。文中还通过Person和Boy类的示例进行了说明。
摘要由CSDN通过智能技术生成

文章目录

概念

  • 绑定:一个方法的调用与方法的所在类【方法主体】关联起来
  • 前期绑定:final、static、private、构造方法、成员变量【包括静态及非静态】
  • 后期绑定:除了前期绑定之外的其他方法属于后期绑定,运行时能判断对象的类型进行绑定

注:为了执行后期绑定,Java 使用一小段特殊的代码来替代绝对地址调用,这段代码使用在对象中存储的信息来计算方法体的地址(过程在以后详述),这样,根据这一小段代码的内容,每一个对象都可以具有不同的行为表现。所以,当向一个对象发送消息时,该对象就能知道对这条消息应该做些什么

举例说明

  • Person【人类】
/**
 * 描述:人类
 */
class Person{

    protected String UNIQUE_FLAG = "Person";

    /** 心 **/
    private Heart heart;

    public Person(){
        System.out.println("Person created......");
    };

    public Person(String id,String name){
        super(id,name);
    }

    public Person(String name){
        super(name);
    }

    public Heart getHeart() {
        return heart;
    }

    public void setHeart(Heart heart) {
        this.heart = heart;
    }

    /**
     * 描述:购买
     * @param <E>
     * @return
     */
    public static <E> List<E> buy(E arg,int num){
        return MagicStore.get(arg,num);
    }

    public static void birth(){
        System.out.println("降临人世间......");
    }

    public static void die(){
        System.out.println("走向人间天堂......");
    }

    public void breath(){
        System.out.println("Person" + "呼吸......");
    }
}
  • Boy【男孩】
/**
 * 描述:男孩
 */
class Boy extends Person{

    protected String UNIQUE_FLAG = "Boy";

    /** 男孩的心 **/
    private Heart heart;

    public Boy(){
        System.out.println("Boy created......");
    }

    public Boy(String name){
        super(name);
    }

    Boy(String id,String name){
        super(id, name);
    }

    public static void birth(){
        System.out.println("Boy" + "降临人世间......");
    }

    public static void die(){
        System.out.println("Boy" + "走向人间天堂......");
    }

    @Override
    public void breath(){
        System.out.println("Boy" + "呼吸......");
    }
}

  • 测试类
public class AyTest {

    public static void main(String[] args){

        // 男孩产生,用 Person 引用,打印 1 和 2 结果
        Person boy = new Boy();
        // 男孩出生,由于 birth 是静态方法,是前期绑定,所以调用 person 的 birth 方法
        boy.birth();
        // final 常量也是前期绑定,所以调用父类 Person 的 UNIQUE_FLAG 常量
        System.out.println(boy.UNIQUE_FLAG);
        // breath 是后期绑定,所以调用 boy 的 breath 方法
        boy.breath();
        // 编译报错,访问权限的原因
        boy.heart;
    }

}
  • 打印结果
Person created......  1
Boy created......     2
降临人世间......       3
Person                4
Boy呼吸......         5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值