您的位置:首页 > 其它

第八章 多态

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: