java 基础面试题 静态绑定与动态绑定

一  静态绑定与动态绑定

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.结果

java 基础面试题 静态绑定与动态绑定_第1张图片

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.结果

java 基础面试题 静态绑定与动态绑定_第2张图片

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 静态和动态绑定|极客教程

你可能感兴趣的:(java,java,开发语言)