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); } }
测试结果:
结果分析:
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”这个就很明显了,此时变量和对象都是子类,输出的成员变量也是子类的结果。