父类引用指向子类对象 调用函数常见问题

解决父类引用调用子类对象当中,引用调用函数的常见问题。该引用只能调用子类中与父类同名的函数,否则报错。

虚拟机在调用重载函数时,是通过参数的静态类型作为调用重载函数的判定依据,而不是动态类型

 

 

 

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只能调用子类中与父类同名的函数,否则报错.

sqq sq = new sqq();

 

son.f1(sq);//调用重载函数时,找不到对应数据类型的重载函数,就会寻找离该数据类型最近的重载函数(自动类型转化)
//不注释父类的f1(sqq arg),打印出s sqq 360,注释父类的f1(sqq arg),打印S QQ

 

QQ qq = new sqq();

//qq 是静态类型,new sqq()是动态类型

//虚拟机在重载时,是通过参数的静态类型作为判定依据,而不是动态类型

son.f1(qq);

//打印结果是S QQ

}

}

posted @ 2017-09-27 16:10  心晴无污  阅读(369)  评论(0编辑  收藏  举报