多态的定义
-
Java中多态性指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式
-
发送消息就是方法调用
-
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在IE界面下弹出的浏览器的帮助文档;如果当前在 Word 下弹出的就是 office帮助;在 Windows 下弹出的就是 Windows 帮助和支持
-
可见,同一个事件发生在不同的对象上会产生不同的结果,因此,多态的主要作用适用于消除类型之间的耦合关系
多态存在的三个必要条件
-
继承
-
重写覆盖
-
对象向上造型–父类引用指向子类对象
其他
在测试类中,调用属性时,与子类无关,这时会直接调用父类的属性。
方法重载与重写
方法重载
同一个类中,方法名相同、参数列表不同(类型、个数、顺序)、返回类型可以相同或不同、访问权限可以相同或不同的方法。
方法重写
-
发生方法覆盖的两个方法的方法名、参数列表必须完全一致(子类重写父类的方法) ,方法返回值如果是基本数据类型,则返回值应该保持一致,如果返回值是类,则子类覆盖方法的返回值必须是父类方法返回值或其的子类(协变返回类型)
-
子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
-
属性无重写的说法
-
如果子类重写了父类的方法,在测试类调用时,会直接调用子类的重写方法,如果子类没有重写,那就调用所继承来的方法(父类的)。
构造方法与继承
-
对于构造方法而言,它只能够被调用,而不能被继承
-
当构建子类对象时会优先隐式自动调用父类的无参构造方法,而且这个构建调用过程是从父类“向外”递归扩散的,也就是从父类开始向子类一级一级地完成构建,即如果C继承自B,而B继承自A,那么构建C的对象时,会先调用A的构造方法,然后调用B的构造方法,最后调用C的构造方法,以此类推
-
子类会默认调用父类的无参构造方法,也就是说子类必须能够访问父类的一个构造方法,并且一定会调用
抽象类与抽象方法
抽象类
Java的抽象就是只声明行为接口(方法签名)而不完成具体的实现。
抽象方法
-
抽象方法同样用abstract说明,抽象方法没有方法体,只有方法签名
-
可以这么认为,抽象方法实际上就是由抽象基类强制要求其派生子类必须实现的方法原型
-
构造方法和final、static方法不可以修饰为abstract
抽象类的特点
-
用abstract修饰的类就是抽象类。抽象类是抽象方法的容器,如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。抽象类中也可以包含有非抽象的方法甚至抽象类中可以没有抽象方法(只要一个类不应该有具体对象,就应该是抽象类,不一定是有抽象方法的)。
-
抽象类不可以直接实例化,只可以用来继承作为其他类的父类存在。
-
抽象类的派生子类应该提供对其所有抽象方法的具体实现。
-
如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化,但可以有构造函数(用于帮助子类快速初始化共有属性)。
接口
在Java中接口是一个比抽象类更加抽象的概念,由于只声明行为,因此在接口中的方法均是抽象的。
从上面的表格可以看出:
-
成员变量方面,在接口中只存在公开静态常量(即便没有使用static final修饰,Java也会默认确定其性质)
-
成员方法方面,在接口中只存在公开抽象方法(即便没有abstract修饰,Java也会默认其抽象性质)
接口的特点
-
一个类可以同时继承自一个父类并实现若干接口。
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
}
-
implements用于指定该类实现的是哪些接口。当使用implements关键字接口列表中存在多个接口名时,各个接口名之间使用逗号分隔。