java动态绑定和静态绑定用法实例详解

作者:XINGKONG_04 时间:2022-04-17 19:55:20 

本文实例讲述了java动态绑定和静态绑定用法。分享给大家供大家参考,具体如下:

背景

1.当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用的是父类的方法还是子类的重写方法呢(尤其是存在向上类型转换的情况)?

2.当一个类中存在方法名相同但参数不同(重载)的方法,程序在执行的时候该如何辨别区分使用哪个方法呢?

在java中存在绑定的机制解决以上疑问。

绑定

绑定:将一个方法的调用与方法所在的类(方法主体)关联起来。即决定调用哪个方法和变量。

在java中,绑定分为静态绑定和动态绑定。也叫作前期绑定和后期绑定。

静态绑定

在程序执行以前已经被绑定(即在编译过程中就已经知道这个方法到底是哪个类中的方法)。

java当中的方法只有final、static、private修饰的的方法和构造方法是静态绑定的。

private修饰的方法:private修饰的方法是不能被继承的,因此子类无法访问父类中private修饰的方法。所以只能通过父类对象来调用该方法体。因此可以说private方法和定义这个方法的类绑定在了一起。

final修饰的方法:可以被子类继承,但是不能被子类重写(覆盖),所以在子类中调用的实际是父类中定义的final方法。(使用final修饰方法的两个好处:(1)防止方法被覆盖;(2)关闭java中的动态绑定)。

static修饰的方法:可以被子类继承,但是不能被子类重写(覆盖),但是可以被子类隐藏。(这里意思是数哦如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类中的方法,而如果子类中定义了相同的方法,则会调用子类中定义的方法,唯一的不同就是:当子类对象向上类型转换为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法,因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。隐藏和覆盖的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏的变量和方法,而不能访问父类被覆盖的方法)。

构造方法:构造方法也是不能被继承的(因为子类是通过super方法调用父类的构造函数,或者是jvm自动调用父类的默认构造方法),因此编译时也可以知道这个构造方法方法到底是属于哪个类的。

因此,一个方法被继承,或者是被继承后不能被覆盖,那么这个方法就采用静态绑定

动态绑定

在运行时期根据具体对象的类型进行绑定。

若一种语言实现了后期绑定,同时必须提供一些机制,可在运行期间判断对象的类型,并分别调用适当的方法。也就是说,编译器此时依然不知道对象的类型,但方法调用机制能自己去调查,找到正确的方法主体。不同的语言对后期绑定的实现方法是有所区别的,但我们至少可以这样认为:它们都要在对象中安插某些特殊类型的信息。

动态绑定的过程:

1.虚拟机提取对象实际类型的方法表

2.虚拟机搜索方法签名

3.调用方法

java中重载的方法使用静态绑定,重写的方法使用动态绑定。

实验


package practice;
public class Bind{
public static void main(String[] args) {
Child c = new Child();
Parent p = c;

System.out.println(p.getPristr());
System.out.println(c.pristr);
c.print();
p.print();

c.print1();
p.print1();

c.print2();
p.print2();

}
}
class Parent{
private String pristr = "parent private string";
String pubstr = "public string";

public String getPristr() {
return pristr;
}
public void setPristr(String pristr) {
this.pristr = pristr;
}
public Parent() {
System.out.println("parent构造函数");
}

final public void print() {
  System.out.println("parent的print");
 }
 public static void print1() {
  System.out.println("parent的print1");
 }
 public void print2() {
  System.out.println("parent的print2");
 }
}
class Child extends Parent{
String pristr = "child private string";
String pubstr = "public string";

public Child() {
System.out.println("child构造函数");
}

public static void print1() {
System.out.println("child的print1");
 }

public void print2() {
  System.out.println("child的print2");
 }
}

结果

parent构造函数
child构造函数
parent private string
child private string
parent的print
parent的print
child的print1
parent的print1
child的print2
child的print2

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

来源:https://blog.csdn.net/XINGKONG_04/article/details/81155642

标签:java,动态绑定,静态绑定
0
投稿

猜你喜欢

  • Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题

    2023-12-24 20:21:25
  • Android RecyclerView详解之实现 ListView GridView瀑布流效果

    2023-11-26 10:09:00
  • springboot整合shiro实现记住我功能

    2023-07-29 20:21:34
  • Spring cloud alibaba之Ribbon负载均衡实现方案

    2021-11-08 20:05:23
  • ListView的View回收引起的checkbox状态改变监听等问题解决方案

    2023-07-26 17:33:45
  • 浅谈Java封装、继承、多态特性

    2023-10-09 13:59:35
  • C#使用iTextSharp操作PDF

    2023-07-29 02:03:11
  • mybatis-plus QueryWrapper 添加limit方式

    2022-12-09 02:08:11
  • List集合对象中按照不同属性大小排序的实例

    2023-06-07 14:27:41
  • jdbc+jsp实现简单员工管理系统

    2021-08-31 23:08:15
  • JAVA十大排序算法之快速排序详解

    2022-06-08 16:09:11
  • 一文带你搞懂Java中的泛型和通配符

    2023-12-10 16:15:07
  • 解决IDEA springboot"spring-boot-maven-plugin"报红问题

    2023-08-15 21:29:19
  • 使用Http Head方法获取文件长度的实现方法详解

    2023-04-05 01:50:37
  • c#字符串编码问题的处理解决

    2021-07-06 13:47:49
  • Java 调整格式日志输出

    2021-10-05 23:09:14
  • Android GestureDetector手势滑动使用实例讲解

    2022-01-18 01:34:12
  • Android中自定义进度条详解

    2022-11-10 00:27:52
  • java Spring MVC4环境搭建实例详解(步骤)

    2021-11-17 05:08:08
  • shiro整合springboot前后端分离

    2022-02-22 10:40:31
  • asp之家 软件编程 m.aspxhome.com