因简书改版后无法添加扩展链接,20170309问题解析请到公众号查看,问题解析在公众号首发,公众号ID:weknow619。
package Mar2017;
public class Ques0310 {
static void test() {
System.out.println("test method in Test class");
}
public static void main(String[] args) {
Ques0310 test = new Ques0310();
test.test();
Sub sub = new Sub();
sub.test();
test = sub;
test.test();
sub = test;
sub.test();
}
}
class Sub extends Ques0310 {
static void test() {
System.out.println("test method in Sub class");
}
}
今日问题:
请问主程序运行结果是什么?
注:weknow团队近期开通并认证了分答,欢迎大家收听,有问题也欢迎到分答来咨询哦,回见您!!
748537-0a2c0f3ca15d5dc5.png
网友评论
表面类型为声明时的类型,实际类型为对象产生时的类型
程序中的test的表面类型一直是父类Ques0310,sub的表面类型一直是子类
,所以赋值语句sub = test;必须要强转,否则会因为向下转型而在编译时报错。
2.对于非静态方法,根据实际类型来执行,而静态方法是根据表面类型来执行
3.当然需要注意的是这里的test方法并非重写而是隐藏
总上所述,该程序无法编译成功。如果 加上强转 eg: sub = (Sub) test; 则程序依次调用父类,子类,父类,子类的test方法。(ps:程序中的test的表面类型一直是父类Ques0310,sub的表面类型一直是子类。手机打字真是麻烦,要是能够输入语音就好了 )