java绑定_初窥java绑定

提出几个名词:

一:

绑定:一个方法的调用与方法所在的类关联起来。java中的绑定分为静态绑定和动态绑定,又被称作前期绑定和后期绑定。

静态绑定:(final、static、private)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个方法是哪个类的方法,此时由编译器获取其他连接程序实现。

动态绑定:在运行根据具体对象信息进行绑定。

类方法:使用static修饰(静态方法),属于整个类的,不是属于某个实例的,只能处理static域或调用static方法;

实例方法:属于对象的方法,由对象来调用。

显式参数:方法中明确定义的参数。

隐形参数:this修饰的变量。

例:ariseSalary方法中的salary就是隐式参数

抓重点:

既然java分为动态绑定,静态绑定,动态绑定发生在类被调用的时候,静态绑定是通过类信息在编译的时候就发生的。

1.静态绑定

即使用private或static或final修饰的变量或者方法

private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法是和方法所属的类进行绑定;

final:可以被继承,但是不能被重写(覆盖),虽然子类对象可以调用,但是调用的都是父类中的final方法(因此可以看出当类中的方法声明为final的时候,一方面可以防止方法被覆盖,一方面有效关闭java的动态绑定,在程序编译的时候就会绑定起来)(想到final突然想到了String就是使用final修饰的,那么我们都知道他引用的对象值是不能进行修改的,当然,有些时候String类型的值进行了改变,本质不是修改的对象本身,而是引用关系);

static:可以被子类继承,但是不能被子类重写(覆盖),

但是可以被子类隐藏。

结果:

(如果父类里有一个static方法,它的子类里如果没有对应的方法,那么当子类对象调用这个方法时就会使用父类中的方法。而如果子类中定义了相同的方法,则会调用子类的中定义的方法。唯一的不同就是,当子类对象上转型为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法。

结果:

因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。

隐藏和覆盖的区别在于,子类对象转换成父类对象后,能够访问父类被隐藏的变量和方法,而不能访问父类被覆盖的方法)。

构造器:方法名与类名相同,也分为有参构造,无参构造,在java中就算你对某个类没有写构造器,程序也会默认给该类一个无参的构造器用来初始化类。

2.动态绑定

即运行时能够自动地选择调用哪个方法的现象。

调用的方法依赖于显示参数的实际类型,并且在运行时实现动态绑定。动态绑定的过程分为以下几个环节:

(1)编译器查看对象的声明类型和方法名;

(2)编译器查看调用方法时提供的参数类型。例如x.f("hello")(x:类名;f:方法名,下同),编译器将会挑选f(String),而不是f(int),不过存在类型转换(int可以转换成double,Manager可以转换成Employee,等等)。如果编译器没找到参数类型匹配的方法,或者发现有多个方法与之匹配,就会报告一个错误。

至此,编译器获得了需要调用的方法名字和参数类型。

(3)采用动态绑定调用方法的时候,一定调用与所引用对象的实际类型最合适的类的方法。如果x的实际类型是D,它是c类的子类,如果c定义了一个方法f(String),就直接调用它,否则将在D类的超类(父类)即c类中寻找f(String),以此类推。

注:每次调用方法都要进行搜索,时间开销太大,所以虚拟机预先为每个类创建一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样在调用方法的时候,只需要查找这个表即可。

初始化子类对象时,调用的顺序:

调用顺序:父类静态,子类静态,父类非静态,父类构造,子类非静态,子类构造

二:

我们在查看完动态绑定之后,肯定会联想到java三大特性,封装继承多态中的多态特性,

多态:即代码块中定义的引用变量所指向的具体对象和通过该引用变量发出的方法调用在编译的时候不是确定的,只能在程序运行的时候才能确定,多个对象对一个代码块执行之后返回不同结果的一个过程,就像有三个对象,人、狗、老虎同样执行吃什么的操作,人吃肉和五谷,老虎吃肉,狗吃屎,这就起到了代码的复用,不用为人,老虎、狗三个对象各写一个吃什么的方法。在其中不用修改程序代码,就可以让引用变量绑定到各种不同的类的实现上。

所以说java的多态特性是离不开java的动态绑定机制的。

注:一个类中的方法可以互相调用。但要注意:实例方法可以调用该类中的其他方法。类方法只能调用其他类方法

当类文件加载到内存时,实例方法不会被分配内存空间,只有在对象创建之后才会分配。而类方法在该类被加载到内存时就分配了相应的内存空间。

实例方法既能对类变量操作也能对实例变量操作。

类方法只能访问其他类方法。

类方法只能访问其他类数据,类变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值