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


猜你喜欢
- 从GitHub下载GSON:https://github.com/google/gsonGson的应用主要为toJson与fromJson两
- 刚刚开始学习C#,想自己做一个网页游戏的挂。游戏里面有收钱的动作,一个建筑物一个建筑物的点,很累啊。于是想用C#模拟鼠标操作替我收钱,想着学
- 本文为大家分享了Unity制作签名功能的具体代码,供大家参考,具体内容如下前言:项目中需要做一个签名的功能,同时需要两个两个屏幕进行显示,但
- 使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/tec
- 1.相关介绍@Conditional注解可以用在任何类型或者方法上面,通过@Conditional注解可以配置一些条件判断,当所有条件都满足
- 蔡勒公式 蔡勒(Zeller)公式:是一个计算星期的公式。随便给一个日期,就能用这个公式推算出是星期几。蔡勒公式如下:W = [
- Spring使用AOP完成统一结果封装起因:自己写项目的时候忍受不了每个方法都要写一个retrun Result.success();和 r
- Android开发,触控无处不在。对于一些 不咋看源码的同学来说,多少对这块都会有一些疑惑。View事件的分发机制,不仅在做业务需求中会碰到
- 在PDF文档中,图层可以使部分内容选择性地被隐藏或显示。通过添加图层,我们可以将文本、图片、表格等元素精确定位于页面指定位置,并可将这些元素
- 原生系统Android8.1上,WiFi上出现感叹号,此时WiFi可正常访问。原因这是Android 5.0引入的网络评估机制:就是当你连上
- 女朋友他们项目用了 spring-boot,以 spring-boot-parent 作为 parent:<parent> &l
- 这是一个运用网格布局来做的简易计算器,可能没有那么美观,大家可以继续完善首先先看看成果吧首先先建一个新的Project Calculator
- 在 Java 中将 Object 转换为 Int我们可以使用 Object 类来引用我们在 Java 中不知道其类型的任
- 模糊查询Spring Data Jpa的使用可以减少开发者对sql语句的编写,甚至完全不需要编写sql语句。但是,开发过程中总会遇到各种复杂
- 介绍Java中的建造者模式是一种创建型设计模式,它的主要目的是为了通过一系列简单的步骤构建复杂的对象,允许创建复杂对象的不同表示形式,同时隐
- 在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会
- 预览效果图:需要权限:<uses-permission android:name="com.android.launcher
- 今天在QQ空间看到一篇关于C#语言验证18位身份证号码的验证方法和实例代码,抽了些时间学习了一下,个人觉得还不错,所以把它记了下来,方便以后
- 首先贴一下搭配的环境:配置:Eclipse4.3.2jdk1.7_45Mysql 5.0+然后切入正题:1、login.jsp主要是使用OG
- 这个导出网站功能指通过前台javascript触发进入ashx函数中,实现将服务器中某个文件夹(包含其子文件夹和文件)通通复制到服务器中另一