public class Dis
{
static class QQ {}
static class _360 {}
static class sqq extends QQ{}
public static class F{
public void f1(QQ arg)
{
System.out.println("F QQ");
}
public void f1(_360 arg)
{
System.out.println("F 360");
}
// public void f1(sqq arg)
// {
// System.out.println("F sqq 360");
// }
}
public static class S extends F{
public void f1(QQ arg)
{
System.out.println("S QQ");
}
public void f1(_360 arg)
{
System.out.println("S 360");
}
public void f1(sqq arg)
{
System.out.println("s sqq 360");
}
}
public static void main(String[] args){
F son = new S();
son.f1(new sqq());
}
}
S是F的子类,sqq是QQ的子类。
在S和F中定义多态方法f1()
F son = new S();
son 的静态类型是F ,动态类型是 S
调用son.f1()的时候,要先在F类中查找对应函数声明,有则通过,调用S中的对应方法。如果没有,则把son.f1()中的参数向上转型,看看能不能在F中找到对应函数声明,能找到,就调用S中参数转型后的f1函数,找不到就编译报错
这段代码F.f1(sqq s)被注释,有F.f1(QQ q)。当son.f1(new sqq())时,因为F没有f1(sqq s),会将sqq向上转为QQ,编译通过,运行时调用S.f1(QQ)即输出"S QQ"
如果把F.f1(QQ)注释掉,编译会报错
感觉静态类型就是编译时用来检查的,动态类型就是运行时实际类型