第八章 多态

概要

多态在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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值