Thinking in JAVA by my self NO.8
多态,改变代码的组织和结构,使程序变的可扩展!
由多态引出的一个概念,后期绑定!c语言中只有前期绑定这种调用方式,而java中存在动态绑定或运行时绑定,这种机制要求在方法调用前jvm本身已经安置了类型信息。
java中除了static方法和final方法(private方法也属于final方法)之外,其他方法都是后期绑定。意味着我们不必判定是否应该进行后期绑定,它会自动发生。
使用final就是为了关闭动态绑定,这种做法在局部范围对程序有好处,整体上性能不会有太大改观,所以我们应该出于设计来使用final而不是出于提高性能来使用final。
多态需要注意的两个缺陷
1.基类的私有方法是无法被子类覆盖的,如果出现相同名称和签名的方法,只能是一个新的方法
2.类中的静态方法是不可以多态的,当出现不同签名的静态方法,他们某种意义上职能算是新方法,调用时采用静态绑定。
另外构造器也并不是多态的,他们实际上是一个static方法,只不过是隐式声明了
构造器的作用是用来检查对象是否被正确地构造,导出类(子类)只能访问自己的属性,无法访问基类的私有属性,所以在调用子类构造器时,会逐渐向上调用。
如果没有明确指定调用某个基类构造器,默认调用默认构造器,如果不存在默认构造器,则编译器会报错。
有人提出了针对构造的动态绑定问题!
一个构造器内,调用正在构造的对象的某个动态绑定方法,会发生什么情况?答案是难以预料!
构造器中唯一能够安全调用的是基类的final方法和private方法。
协变返回类型,允许在覆盖方法中返回更具体的导出类类型。
使用状态模式,满足对具体对象的运行时切换.原则是
用继承表达行为的差异,并用引用更替的方式来表达状态上的变化
因为基类不会具有多余导出类的接口,所以向上转型是安全的,反之,向下转型,我们并不知道基类可以转型为哪一种具体的导出类,所以是不安全的,向下转型有时需要强制转换,并且有ClassCastException的异常
由多态引出的一个概念,后期绑定!c语言中只有前期绑定这种调用方式,而java中存在动态绑定或运行时绑定,这种机制要求在方法调用前jvm本身已经安置了类型信息。
java中除了static方法和final方法(private方法也属于final方法)之外,其他方法都是后期绑定。意味着我们不必判定是否应该进行后期绑定,它会自动发生。
使用final就是为了关闭动态绑定,这种做法在局部范围对程序有好处,整体上性能不会有太大改观,所以我们应该出于设计来使用final而不是出于提高性能来使用final。
![]() |
多态示意图 |
多态需要注意的两个缺陷
1.基类的私有方法是无法被子类覆盖的,如果出现相同名称和签名的方法,只能是一个新的方法
2.类中的静态方法是不可以多态的,当出现不同签名的静态方法,他们某种意义上职能算是新方法,调用时采用静态绑定。
另外构造器也并不是多态的,他们实际上是一个static方法,只不过是隐式声明了
构造器的作用是用来检查对象是否被正确地构造,导出类(子类)只能访问自己的属性,无法访问基类的私有属性,所以在调用子类构造器时,会逐渐向上调用。
如果没有明确指定调用某个基类构造器,默认调用默认构造器,如果不存在默认构造器,则编译器会报错。
有人提出了针对构造的动态绑定问题!
一个构造器内,调用正在构造的对象的某个动态绑定方法,会发生什么情况?答案是难以预料!
![]() |
构造器溢出问题 |
构造器中唯一能够安全调用的是基类的final方法和private方法。
协变返回类型,允许在覆盖方法中返回更具体的导出类类型。
使用状态模式,满足对具体对象的运行时切换.原则是
用继承表达行为的差异,并用引用更替的方式来表达状态上的变化
因为基类不会具有多余导出类的接口,所以向上转型是安全的,反之,向下转型,我们并不知道基类可以转型为哪一种具体的导出类,所以是不安全的,向下转型有时需要强制转换,并且有ClassCastException的异常