本文实例讲述了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程序设计有所帮助。
我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。
问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。
本文向大家介绍Java中的静态绑定和动态绑定详细介绍,包括了Java中的静态绑定和动态绑定详细介绍的使用技巧和注意事项,需要的朋友参考一下 一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里首先我们将确定
静态绑定还是动态绑定? 这显示了什么样的多态性?
起初我是一个初学者 我看过很多教程,读过很多例子,甚至试图从JLS来理解这个主题,但我仍然有一些困惑或误解。 让我给你看我看不懂的问题。
下面的代码有4个类:Base1、Derived1(派生自Base1)、Base2、Derived2(派生自Base2)。两个基本类都有整数data1和display_data()函数。这两个派生类都有整数data1和data2,以及display_data()函数。 我在我的代码中尝试了4个案例,可以在主函数中看到。我不知道哪一个是静态绑定,哪一个是动态绑定。我需要一些帮助。我还想知道,这些情况中