Java中关于静态绑定、动态绑定的一些笔记

最近在重温设计模式,在秦小波的《设计模式之禅》上,有这么一个例子:
public interface Role {
void accept(AbsActor absActor);
}

public class KungFuRole implements Role {
@Override
public void accept(AbsActor absActor) {
absActor.act(this);
}
}

public abstract class AbsActor {
public void act(Role role) {
System.out.println(“演员可以演任何角色”);
}
public void act(KungFuRole kungFuRole) {
System.out.println(“演员可以演功夫角色”);
}
}

public class OldActor extends AbsActor {
public void act(KungFuRole role) {
System.out.println(“年纪大了,不能演功夫戏”);
}
}

public class client {
public static void main(String[] args) {
Role role = new KungFuRole();
AbsActor absActor = new OldActor();
role.accept(absActor);
absActor.act(role);
absActor.act(new KungFuRole());
}
}

此时的输出为:
年纪大了,不能演功夫戏
演员可以演任何角色
年纪大了,不能演功夫戏

“重载在编译器期就决定了要调用哪个方法,它是根据role的表面类型而决定调用act(Role
role)方法,这是静态绑定;而Actor的执行方法act则是由其实际类型决定的,这是动态绑
定。”
这段话想了很久也不明白意思,于是翻看了很多资料,终于明白,总结成下面一段话:
在java中重载方法的选择是静态绑定, 也就是一个方法的参数选择是静态绑定的, 如:调用了一个重载的方法, 在编译时根据参数列表就可以确定方法, 如果这个方法是非静态方法, 那么具体调用的是父类的方法还是子类的方法就需要动态绑定来确定;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值