1:什么是多态
-
1:不同类的对象对同一消息作出不同的响应就叫做多态。
-
举例子说明:
-
小明是一个学生(也就是拥有学生形态),小明同时亦是一个员工(去兼职了,也就是拥有了员工形态)
-
总结:
-
小明是一个对象,这个对象既拥有学生形态,也有员工形态。一个对象拥有多种形态,这也就是:对象的多态性
2:多态的作用
- 简单讲就是解耦。再详细点讲就是,多态是设计模式的基础,不能说所有的设计模式都使用到了多态,但是23种中的很大一部分,都是基于多态的。
3:多态使用的格式
- 代码中体现多态性,其实就是一句话:父类引用指向子类对象
格式
- 1:父类对象 对象名 = new 子类对象();
- 2:接口名称 对象名 = new 实现类名称();
访问成员变量的两种方式
- 1:直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找
- 2:间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找
4:多态例子解释怎么使用
例子:场景假设
- 一个主人养了猫和狗,猫和狗都有自己爱吃的东西,主人在喂它们的时候,如果既要判断是猫还是狗,再判断他们分别爱吃什么,就显得很麻烦。如果主人养了很多种动物,这样的重复判断,就会浪费很多时间。有什么办法,能让主人拿到一种食物就知道这是哪种动物的,就好了。
1.首先,创造动物类:
// 动物类
class Animal {
int age;
String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 动物类里面有叫和吃两个方法
public void cry() {
System.out.println("我不知道叫什么");
}
public void eat() {
System.out.println("我不知道吃什么");
}
}
2.其次,分别创造猫类和狗类(他们继承于动物类):
// 狗类继承于动物类
class Dog extends Animal {
// 覆盖(重写)方法
public void cry() {
System.out.println("旺旺");
}
public void eat() {
System.out.println("我是狗,我爱吃骨头");
}
}
// 猫类继承于动物类
class Cat extends Animal {
// 覆盖(重写)方法
public void cry() {
System.out.println("喵喵");
}
public void eat() {
System.out.println("我是猫,我爱吃鱼");
}
}
3.再者,创建食物类:
// 食物类
class Food {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 食物类里面让它有一个方法
public void showName() {
}
}
4.再者,猫和狗都有自己不同的爱吃的食物(他们继承于食物类):
// 鱼(食物的一种)继承于食物
class Fish extends Food {
public void showName() {
System.out.println("食物:鱼");
}
}
// 骨头(食物的一种)继承于食物
class Bone extends Food {
public void showName() {
System.out.println("食物:骨头");
}
}
5.主人类(就可以将动物和对应的食物统一起来)
// 主人类 存在一種餵食方法
class Master {
// 给动物喂食物,如果没有多态,他要写给猫喂食和给狗喂食两个方法
// 有了多态,以后即使再来好多动物,用这一个函数就可以了
public void feed(Animal an, Food f) {
an.eat();
f.showName();
}
}
6.最后,方法的调用(测试)
public class DuoTaiDemo {
public static void main(String args[]) {
Master master = new Master();
master.feed(new Dog(), new Bone());
// hin方便,可以再试试
master.feed(new Cat(), new Fish());
}
}
7:分析
- 1:一个动物类
- int age
- String name
- 方法cry叫什么
- 方法eat吃什么
- 2:猫狗类
- 猫狗类就要继承动物类,重写cry方法和eat方法
- 就有了dog类和cat类
- 3:食物类
- String name
- 方法showName
- 4:骨头和鱼类
- 猫和狗的食物都要继承食物类
- 重写showName方法
- 5:主人类
- 主人要给动物喂食物
- public void feed(Animal an, Food f) {
an.eat();
f.showName(); - }
- 6:测试
- 需要new一个主人对象,然后给对象的动物喂食物
- master.feed(new Dog(), new Bone());
- master.feed(new Cat(), new Fish());