首先你需要了解什么是继承、抽象类、接口
类转型(向上转型)
Java的变量可以相互转型,如:
int a = (int) 3.5;
Java的类也可以相互转型
Java的类转型只限制于有继承关系的类
子类可以转换为父类(向上转型),但父类不能转换为子类(父类转子类只有一种情况例外,就是这个父类本身就是从子类转换过来的)
Human obj1 = new Man();//OK,Man extends Human
Man obj2 = new Human();//illegal,Man is derived class Human
父类转子类的一种特殊情况
Human obj1 = new Man();
Man obj2 = (Man) obj1; //OK,因为obj1本身就是Man的对象
类型转换带来的作用就是多态
多态
重写
子类可以重新定义一个名字,参数和父类一样的方法,这种行为就是重写(overwrite),区别于重载(overload)。子类的方法优先级高于父类
多态的作用
- 以统一的接口来操纵某一类中不同对象的动态行为
//Human.java
public class Human {
int height;
int weight;
public void eat() {
System.out.println("I can eat!");
}
}
//Man.java
public class Man extends Human {
public void eat() {
System.out.println("I can eat more");
}
public void plough() { } //子类自己的方法
public static void main(String[] a) {
Man obj1 = new Man();
obj1.eat(); // call Man.eat()
Human obj2 = (Human) obj1;
obj2.eat(); // call Man.eat()
Man obj3 = (Man) obj2;
obj3.eat(); // call Man.eat()
}
}
obj1 obj2 obj3的eat()方法引用的都是Man的eat方法。
即使一个子类被强制转换成了它的父类,但其对象的地址仍是子类的地址,只是无法调用子类自己定义的方法。例如obj2的地址和obj1是同一个地址,只是obj2对象被屏蔽了plough()方法
- 对象之间的解耦
契约思想
设计思想:基于接口,利用转型和多态,不影响真正方法的调用,成功将调用类和被调用类解耦
类不会直接使用另一个类,而是采用接口的形式,外部可以直接"空投"这个接口的任意子类对象。
public interface Animal {
public void eat();
public void move();
}
public class AnimalTest {
public static void haveLunch(Animal a) { //类不直接使用具体的类,而是用Animal接口调用方法
a.eat();
}
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++) {
haveLunch(as[i]); //直接向haveLunch()传入数组中某个对象具体的类
}
haveLunch(new Cat()); //Animal a = new Cat(); haveLunch(a);
haveLunch(new Dog());
}
}
Java包和思维导图:链接:https://pan.baidu.com/s/1wBwbuI-hXaEneNq_LcY9bg
提取码:brxk