A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sq_jun 中级黑马   /  2015-1-28 01:43  /  1112 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Fu{
  2.         int num = 5;                                 
  3.         Fu(){       
  4.                System.out.println(num);                       
  5.                                 show();                             //55  
  6.                 System.out.println(num);            //5
  7.         }
  8.         void show(){
  9.                 System.out.println("55");
  10.         }
  11. }
  12. class Zi extends Fu{
  13.         int num = 3;
  14.         Zi(){
  15.         
  16.         }   
  17.         void show() {                                
  18.                         System.out.println(num);                                       
  19.                                         }
  20. }
  21. public class Demo {
  22.         public static void main(String[] args) {
  23.                 Zi z = new Zi();                                    
  24.                
  25.         }
  26. }
复制代码

3 个回复

倒序浏览
确实有点不同,这是由JVM造成的,这段代码在CLR编译出来就是5   55   5,JVM就是5  0   5;
为了测试,我们把子类改成:
  1. class Zi extends Fu{
  2.         int num = 3;
  3.         Zi(){
  4.         
  5.         }   
  6.         void show() {                                
  7.                         System.out.println("num");                                       
  8.                                         }
复制代码

发现输出结果:
---------- 运行 ----------
5
num
5

输出完成 (耗时 0 秒) - 正常终止


这说明调用show方法时子类的,而CLR是调用父类的show。这也算一个知识点吧!由于在建立子类的时候,num还没有值,所以会是0
回复 使用道具 举报
(推测)
你在父类的构造方法中调用子类重写的方法
这时子类才进行了声明和jvm默认初始化 并没有进行赋值操作(把3赋给num)
你可以把int改成String试试 结果就成了null
这是我根据结果的推测
回复 使用道具 举报
你想的结果是什么?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马