向上转型、多态、设计思想

it2025-08-21  4

首先你需要了解什么是继承、抽象类、接口

类转型(向上转型)

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

最新回复(0)