一 静态绑定与动态绑定
1.1 前言概述
昨天去用友面试,被问到了如下几个问题
1.单例模式使用场景
2.责任链模式
3.分布式事务TCC
4.动态绑定和静态绑定
5.类加载器
今天就来研究一下静态绑定和动态绑定
1.2 静态绑定代码
1.父类:定义一个static修饰的方法
public class Fruit {public static void getFruitName(){System.out.println("我是 水果的基类.....");}
}
2.子类
public class Apple extends Fruit {public static void getFruitName(){System.out.println("我是苹果....");}
}
3.调用
public class TestAF {public static void main(String[] args) {Fruit f=new Apple();f.getFruitName();Fruit f2=new Fruit();f2.getFruitName();}
}
4.结果
5.结论:static,private和final方法的绑定是在编译期确定类型的,这些方法无法实现重写。
Fruit f=new Apple(); f.getFruitName();//输出Fruit类的getFruitName的方法
1.3 动态绑定代码
1.父类:定一个非static,private,final的方法,实现重写
public class Fruit {public void getFruitName(){System.out.println("我是 水果的基类.....");}
}
2.子类:
public class Apple extends Fruit {public void getFruitName(){System.out.println("我是苹果....");}
}
3.调用
public class TestAF {public static void main(String[] args) {Fruit f=new Apple();f.getFruitName();Fruit f2=new Fruit();f2.getFruitName();}
}
4.结果
5.结论: 子类重写了父类中非static,private和final的方法,重写的方法调用时,在运行期确定对象的类型。发生在后期绑定
Fruit f=new Apple(); f.getFruitName();//输出Apple类的getFruitName的方法
1.4 总结
1.静态绑定发生在编译期,动态绑定发生在运行期
2.static,private和final方法的绑定是在编译期确定类型的,这些方法无法实现重写。
Fruit f=new Apple(); f.getFruitName();//输出Fruit类的getFruitName的方法
3.子类重写了父类中非static,private和final的方法,重写的方法调用时,在运行期确定对象的类型。发生在后期绑定
Fruit f=new Apple(); f.getFruitName();//输出Apple类的getFruitName的方法
4.重载方法的绑定是静态的,并且覆盖方法的绑定是动态的。
Java 静态和动态绑定|极客教程