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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. 看程序写结果1
  2. class Fu{
  3.     public int num = 10;
  4.     public Fu(){
  5.         System.out.println("fu");
  6.     }
  7. }
  8. class Zi extends Fu{
  9.     public int num = 20;
  10.     public Zi(){
  11.         System.out.println("zi");
  12.     }
  13.     public void show(){
  14.         int num = 30;
  15.         System.out.println(num);
  16.         System.out.println(this.num);
  17.         System.out.println(super.num);
  18.     }
  19. }
  20. class Test1_Extends {
  21.     public static void main(String[] args) {
  22.         Zi z = new Zi();
  23.         z.show();
  24.     }
  25. }

  26. 看程序写结果2
  27. class Fu {
  28.     static {
  29.         System.out.println("静态代码块Fu");
  30.     }

  31.     {
  32.         System.out.println("构造代码块Fu");
  33.     }

  34.     public Fu() {
  35.         System.out.println("构造方法Fu");
  36.     }
  37. }

  38. class Zi extends Fu {
  39.     static {
  40.         System.out.println("静态代码块Zi");
  41.     }

  42.     {
  43.         System.out.println("构造代码块Zi");
  44.     }

  45.     public Zi() {
  46.         System.out.println("构造方法Zi");
  47.     }
  48. }

  49. Zi z = new Zi(); 请执行结果。
复制代码


结果1:
fu
zi
30
20
10

分析1:
子类空参构造方法默认调用父类的空参构造方法;
子类中有 与 父类中成员变量 同名的变量时 ,调用此变量默认采用就近原则;
使用this. 调用子类的成员变量;
调用super.调用父类的成员变量;

结果2:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi

分析2:
创建子类对象时,jvm会先后把父类的class文件和子类的class文件加载进内存,加载的同时会执行静态代码块;
然后调用构造方法创建对象,java中是分层初始化:先初始化父类,再初始化子类;
所以先走父类构造方法,发现有构造方法就先执行,再执行构造方法,随后执行子类的构造

其实只要记住一句话:现有父再有子!

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马