第八章 多态
2016-07-18 18:33
232 查看
概要
多态在Java面相对象编程中,应该是属于非常重要的一个内容。多态的概念在前面几章中也略有介绍,总的来说,多态就是向上转型后,我们在调用父类的引用时,能够产生子类的行为,有一些规范是比较繁琐复杂的,比如通过父类的引用,调用非静态方法,产生的是子类的行为,而调用其变量,拿到的是父类的数据,有很多规范是繁琐的,但他们却很符合使用场景。良好的设计模式跟多态息息相关,所以我们需要很好的了解多态。下面是重要内容:1.一个方法调用同一个方法主体类容关联成为绑定(这句话的理解尤为重要,说白了,绑定就是把方法调用和具体执行的代码关联起来,因为多态,我们在写方法代码的时候不能确定具体是哪个类的代码)。
2.在编译的时候绑定称为前期绑定,在运行的绑定称为动态绑定。java中,除了static和final方法(要记得private修饰的隐含了final修饰符。为什么是static final?实际上是因为static和final的方法是不能被继承或者被修改的,static跟一个类有关,而private方法则不能被子类覆盖,他们的方法调用代码从头到尾都是确认的,所以前期绑定就可以了 ),其他的都是后期绑定。因为动态绑定,我们向上转型就能正确执行子类的代码了。
3.一个类的变量和静态数据或者方法是没有多态性的(例如:父类和子类有共同一个变量int a。在向上转型调用父类引用拿去变量a的时候,拿到的是父类的a而不是子类的。)
4.我们有一个类,他覆盖了父类的某些方法。在执行初始化的时候我们知道,是要先执行父类构造函数初始化的,如果我们在父类构造函数中调用这个被子类覆盖的方法,他在调用的时候实际上还是调用子类的方法。这个时候值得注意的是,因为我们在初始化父类的时候,子类的变量是还没有被初始化的,调用子类的方法,很有可能因为没有初始化出现异常。所以我们一般情况下,不要在构造函数中调用非final(private隐含final修饰)或者static方法(这是因为这两种方法是不会被子类覆盖修改的)。
5.下列情况:
public class PrivateOverride(){ private void f(){System.out.println("hello world");}//注意这里的方法是private类型的 public static void main(String args[]){ PrivateOverride privateOverride = new Dervided(); privateOverride.f();//这里输出的是父类的方法,既hello world } } class Derived extends PrivateOvveride{ public void f(){ system.out.println("hello world2"); } }
上面的 结果之所以会调用父类的f()方法,不是子类的,是因为父类的f()方法是private的,向上转型根本就不会找到这个方法,所以调用f(),我们只能调用父类的private void f()了,如果是在别的类调用的话,根本就无法找到f()方法,毕竟f()方法是private的,在类外部无法调用。
5.协变类型的理解:子类在覆盖父类中的某个方法的时候,他的返回类型可以是父类这个方法返回类型的子类。例如:
class SuperClass{}//某个父类 class SubClass extends SuperClass{}//某个子类 public class A{ SuperClass display(){//这里申明了一个方法,返回 SuperClass } } public class SubA extends A{ SubClass display(){//这里我们覆盖了display()方法,我们可以返SuperClass的子类SubClass。 } }
6.
相关文章推荐
- C语言指针与函数之三数比较大小并排序
- leetcode 151 Reverse Words in a String (python)
- 第七章 复用类
- hadoop eclipse 插件配置使用
- 死锁的产生与解除
- 第六章 访问控制权限
- 使用Eclipse构建Maven项目 (step-by-step)
- Pig安装及本地模式测试,体验
- Android 之OkHttp get 和post
- ssh的简单配置
- 第五章 初始化与清理
- 微信公众号开发
- hdu 5534 Partial Tree【完全背包】
- Description Resource Path Location Type AndroidManifest.xml file missing!
- 如何阅读一本书 全书笔记
- web前端-boostrap图片轮播
- JS日期与字符串互转
- Description Resource Path Location Type AndroidManifest.xml file missing!
- LINQ的用法
- 编译Libgdiplus遇到的问题