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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

dfmlcq

初级黑马

  • 黑马币:15

  • 帖子:5

  • 精华:0

本帖最后由 dfmlcq 于 2016-4-21 22:39 编辑

想问下大家,结果的第二句里show方法被子类覆盖我能理解,但num不是已经在第一句被赋值为2了吗,为什么第二句num的值又变成0了?
class Fu{
        int num=2;
        {
                System.out.println("父成员变量num为"+this.num);
        }
        Fu(){
                show();
        }
        void show(){
                System.out.println("父成员变量num"+this.num);
        }
}

class Zi extends Fu{
        int num=8;
        {
                System.out.println("子成员变量num为"+this.num);
        }
        Zi(){
                show();
        }
        void show(){
                System.out.println("子成员变量num为"+this.num);
        }
}
public class test{
        public static void main(String[] args){
                new Zi();
        }
}
/* 结果为:
  父成员变量num为2   
  子成员变量num为0   
  子成员变量num为8
  子成员变量num为8    */
想问下大家,结果的第二句里show方法被子类覆盖我能理解,但num不是已经在第一句被赋值为2了吗,为什么第二句num的值又变成0了?

4 个回复

倒序浏览
好帖vvv好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖好帖
回复 使用道具 举报
字符串子父类这是什么封装继承多态
回复 使用道具 举报
dfmlcq 来自手机 初级黑马 2016-4-22 16:08:27
板凳
有人能帮我看下吗
回复 使用道具 举报
本帖最后由 陈文广 于 2016-4-23 20:36 编辑

这个题目考的是 面向对象的继承关系中 子父类的 创建对象的时候 程序执行的流程问题:首先:我们要知道一个程序要执行,首先JVM会去找main方法的入口,
1.这样会将main方法的所在的类的字节码文件加载进内存:main方法所在的类B的静态代码块会被执行因为静态代码块会随着类的加载而加载
但是如果main方法所在的类B又继承了某个类A,那么类A的静态代码块会在类B的静态代码块执行前先执行. 因为java会先加载好父类后再加载子类
父类初始完毕后再初始化子类
2.在加载字节文件的同时 JVM会将所涉及到的类的 各个属性和方法都加载进内存   这其中就涉及到了 各个类的属性 的默认化 了 ,它是在创建对象之前就完成了的
并且是在本类的构造代码块之前就执行完毕
3.在创建对象之前 还有一步是 代码执行到的地方涉及到各个类的属性会显示初始化
4.默认初始化->显示初始化->构造代码执行->构造方法执行初始化
5.一般的执行循序是:静态代码块->默认初始化->显示初始化->构造代码块执行->构造方法执行初始化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马