Java静态绑定与动态绑定之测试分析

 上篇文章转载了一篇《Java静态绑定与动态绑定》的文章写的挺详细的,本来是要附上自己写的测试用例的,结果发现发表了blog后就不能修改了,没办发只能是再写一篇记录一下了。

package binding;

public class BindingFather {
    /*
       类成员变量
     */
    protected String a="father";
    /*
       构造方法
     */
    BindingFather(){

        System.out.println("This is a Father Class");
    }

    /**
     * static method test
     */
     public static void staticMethod(){
         System.out.println("This is a Father staticMethod");
     }
     /*
       final method test
      */
    public  final void finalMethod(){

        System.out.println("This is a Father finalMethod");
    }

    public void commonMethod() {
        System.out.println("This is a Father commonMethod");
    }

}

子类代码:

package binding;

public class BindingChild extends BindingFather {
    /*
       类成员变量
     */
    protected String a="child";
    /*
       构造方法
     */
    BindingChild(){
        super();
        System.out.println("This is a child Class");
    }
    /*
        static method test
     */
    public static void staticMethod(){
        System.out.println("This is a child staticMethod");
    }
    /*
      final method test
      无法重写final方法
     */
//    public  final void finalMethod(){
//        System.out.println("This is a child finalMethod");
//    }

    public void commonMethod(){

        System.out.println("This is a child commonMethod");
    }

}

测试类:

package binding;

public class BindingTest {
    public static void main(String  args[]){
        /*
         静态绑定测试
         */
        BindingFather binding=new BindingChild();
        binding.finalMethod();
        System.out.println("binding.a="+binding.a);
        binding.commonMethod();
        binding.staticMethod();
        BindingChild bindingChild=new BindingChild();
        bindingChild.finalMethod();
        System.out.println("bindingChild.a="+bindingChild.a);
    }
}

测试结果:

Java静态绑定与动态绑定之测试分析

结果分析:

  1、输出第一行“This is a Father Class”是测试类中BindingFather binding=new BindingChild();

在类初始化的时候会先初始化父类,由父类的构造方法打印出来的

2、输出第二行“This is a child Class”是测试类BindingFather binding=new BindingChild();初始化完父类然后初始化子类,此时子类中的构造方法打印出来的。

3、输出第三行“This is a Father finalMethod”,是因为finalMethod是final修饰的,是静态绑定的。所以输出是父类的打印(也只能是父类的了,因为被final修饰的方法是不能被重写的)

4、输出第四行“binding.a=father”,是因为a是父类的成员变量,也是静态绑定的。

5、输出第五行“This is a child commonMethod”是因为commonMethod()是普通的方法,是运行时被绑定的,属于java的多态。

6、输出第六行“This is a Father staticMethod”是因为staticMethod()是静态方法,是静态绑定的,输出父类的打印

7、输出第七行“This is a Father Class”和第八行“This is a child Class”和开始输出是一样的,测试类BindingChild bindingChild=new BindingChild();初始化的时候先初始话父类然后初始话子类。

8、输出第九行“This is a Father finalMethod”是因为子类继承了父类的finalMethod()方法,由于该方法被final修饰是无法重写的,所以输出还是父类的结果。

9、最后一行“bindingChild.a=child”这个就很明显了,此时变量和对象都是子类,输出的成员变量也是子类的结果。