3)定义变量时指定的初始化值和初始化块中指定的初始值的执行顺序与他们在源程序中的排列顺序相同。

  验证代码一:
public class Test{
     
     String i = "定义变量时指定的初始化值";
 
     {
         i = "初始化块中指定的初始值";
     }
     
     public static void main(String[] args) {
         for (int i = 1; i <= 2; i++) {
             System.out.println("创建第 " + i + " 个对象"); 
             System.out.println(new Test().i);
             System.out.println();
         }
     }
 }

  运行结果:

  验证代码二:
public class Test{
 
     {
         i = "初始化块中指定的初始值";
     }
     
     String i = "定义变量时指定的初始化值";
 
     public static void main(String[] args) {
         for (int i = 1; i <= 2; i++) {
             System.out.println("创建第 " + i + " 个对象"); 
             System.out.println(new Test().i);
             System.out.println();
         }
     }
 }

  运行结果:

  4、关于父子实例的内存控制

  (一般情况下是不用内部类来验证的,但是都是一样的啦,我偷懒下,所以使用了内部类,大家原谅哈)

  1)当子类重写父类方法后,父类表面上只是调用属于自己的被子类重写的方法。
public class Test{
     class Base {
         Base() {
             this.info();
         }
         public void info() {
             System.out.println("Base");
         }
         public void getInfo() {
             info();
         }
     }
     
     public class Child extends Base{
         @Override
         public void info() {
             System.out.println("Child");
         }
     }
     
     public static void main(String[] args) {
         Test test = new Test();
         Base base = test.new Child();
         base.info();
         base.getInfo();
     }
 }