黑马程序员技术交流社区

标题: 这段代码结果和我想的相差很大,求解 [打印本页]

作者: sq_jun    时间: 2015-1-28 01:43
标题: 这段代码结果和我想的相差很大,求解
  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. }
复制代码

作者: 邓士林    时间: 2015-1-28 09:05
确实有点不同,这是由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

作者: d342784178    时间: 2015-1-28 09:18
(推测)
你在父类的构造方法中调用子类重写的方法
这时子类才进行了声明和jvm默认初始化 并没有进行赋值操作(把3赋给num)
你可以把int改成String试试 结果就成了null
这是我根据结果的推测

作者: 麦兜de篼    时间: 2015-1-28 09:44
你想的结果是什么?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2