今天在看到了一道面试题,题目是一道代码阅读题,问下面的代码输出结果是什么?
我最开始的理解:
上面的代码我们可以看到,上面的类中有两个内部类Sub和Super,Sub继承了Super,Sub类重写了父类Super的getType方法;
而在main方法中创建了一个Super变量指向了一个子类Sub对象,并调用了其getType方法。按照多态的原理,这个变量调用的应该是子类的getType方法,也就是会得到三个字符串“Sub”,但是结果并非如此,结果如下:
这个结果是调用了三次父类Super的第一个getType方法产生的。
疑问:
会产生这个结果的原因显而易见,子类重写了父类的方法,但是并没有将其覆盖,所以调用一个父类Super类型的变量,调用的任然是父类的方法。但是为什么没有覆盖呢?
解释:
我上网查了一些别人的博客,理解了其中的原因。
上面的getType方法是static修饰的静态方法,而静态方法的加载机制和非静态方法不同,它是在编译期间就会被分配内存,加载完成;而非静态方法则是在创建对象时才被加载。
因此即便是在子类对象中定义一个与父类一模一样的静态方法,但是这个静态方法属于子类本身,与父类分别占用不同的内存空间,在内存中会分配两块控件去存放这两个静态变量,因此静态方法不存在重写。
原文:https://www.cnblogs.com/tuyang1129/p/11178925.html