首页 > 其他 > 详细

子类能否重写父类的静态方法?

时间:2019-07-13 09:43:23      阅读:132      评论:0      收藏:0      [点我收藏+]

今天在看到了一道面试题,题目是一道代码阅读题,问下面的代码输出结果是什么?

技术分享图片

 

我最开始的理解:

  上面的代码我们可以看到,上面的类中有两个内部类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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!