类转型
父类一定不可以转成子类么?有一种情况例外:
多态
多态的定义
多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。
重写:子类的方法替换掉父类的方法,对于类中的方法而言,需要有类
重载:函数名一样,形参不一样。对于函数而言
举个例子:
这里三个对象调用的内存都是同一块:
多态的作用
举个例子,该例子为AnimalTest.java
,具体代码如下:
package chapter5.abstractAndInterface;
import java.util.concurrent.Phaser;
public class AnimalTest {
public static void main(String[] args) {
Animal[] as = new Animal[4];
as[0] = new Cat(); // 转型
as[1] = new Dog();
as[2] = new Cat();
as[3] = new Dog();
for(int i=0; i<as.length; i++) {
as[i].move(); // 调用每个元素的自身的move方法,可以解释多态作用的第1点
}
for(int i=0; i<as.length; i++) {
haveLunch(as[i]);
}
haveLunch(new Cat()); // new Cat()做了向上转型
haveLunch(new Dog());
haveLunch(
new Animal() { //一般接口无法new的,这里new 接口的同时,必须要将接口中的所有方法补足补全,实际上是已经实现了这个接口
@Override
public void eat() {
System.out.println("I can eat from an anonymous class");
}
@Override
public void move() {
System.out.println("I can move from an anonymous class");
}
}
);
}
private static void haveLunch(Animal a) {
a.eat(); // 调用的不是Animal的eat,因为Animal的eat是空的,故而调用的是每个元素自身的eat方法
}
}
运行结果如下:
cat: i can move
Dog: i can move
cat: i can move
Dog: i can move
cat: i can eat
Dog: i can eat
cat: i can eat
Dog: i can eat
cat: i can eat
Dog: i can eat
I can eat from an anonymous class
其中,Dog
类的代码如下:
package chapter5.abstractAndInterface;
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog: i can eat");
}
@Override
public void move() {
System.out.println("Dog: i can move");
}
}
该例子中用到的其余相关联的代码见博主另一篇文章Java核心技术系列之华东师范大学Java核心技术第五章继承、接口和抽象类中的抽象类与接口章节。
契约设计
关于契约设计中的最后一点,我们来看之前的例子: