Java里,多态分为两种:
① 操作符的多态
+ 可以作为算数运算,也可以作为字符串连接
② 类的多态
父类引用指向子类对象
———————————————————————————————————————————
操作符的多态
同一个操作符在不同情境下,具备不同的作用
如果+号两侧都是整型,那么+代表 数字相加
如果+号两侧,任意一个是字符串,那么+代表字符串连接
代码示例如下:
public class OperatorPolymorphism {
public static void main(String[] args) {
int a = 5;
int b = 6;
int c = a + b; // 如果+号两侧都是整型,那么+代表 数字相加
System.out.println(c);
int x = 5;
String y = "5";
String z = x + y; // 如果+号两侧,任意一个是字符串,那么+代表字符串连接
System.out.println(z);
}
}
运行结果如下:
11
55
———————————————————————————————————————————
观察类的多态现象
观察类的多态现象:
1. a1和a2都是Animal类型
2. 都调用eat()方法
3. 输出不同的结果
多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态
代码如下:
Animal类 作为父类:
public class Animal {
public void eat() {
System.out.println("动物具有吃东西的能力!");
}
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.eat();
a2.eat();
}
}
Dog和Cat作为其子类:
public class Dog extends Animal{
public void eat(){
System.out.println("狗是吃骨头的~");
}
}
public class Cat extends Animal{
public void eat(){
System.out.println("猫是吃鱼的~");
}
}
Animal类中的main方法,输出结果如下:
狗是吃骨头的~
猫是吃鱼的~
———————————————————————————————————————————
类的多态条件
要实现类的多态,需要如下条件
1. 父类(接口)引用指向子类对象
2. 调用的方法有重写
那么多态有什么作用呢? 通过比较不使用多态与使用多态来进一步了解
不使用多态
如果不使用多态,
假设人类要喂养狗和猫,就需要为人类设计两个方法
feedTheDog( )
feedTheCat( )
此外,人与动物之间的每一种互动,因此都要单独写一个方法,比如
touchTheCat( )
touchTheDog( )
等等。
除了Dog和Cat以外,还有很多种动物,那就要设计更多的方法,很麻烦!
代码如下:
public class Human {
public void feedTheDog(Dog dog) {
dog.eat();
}
public void feedTheCat(Cat cat) {
cat.eat();
}
public static void main(String[] args) {
Human Tom = new Human();
Dog dog = new Dog();
Cat cat = new Cat();
Tom.feedTheDog(dog);
Tom.feedTheCat(cat);
}
}
使用多态
如果动物的种类特别多,那么就需要设计很多的方法
比如feedTheDog( ),feedTheCat( )等等
这个时候采用多态来解决这个问题
设计一个方法叫做feedTheAnimal( ),其参数类型是Animal
如果是需要feedTheDog( ),调用该方法
如果是 需要feedTheCat( ) ,还是调用该方法
无论feed什么动物,只需要一个方法即可
代码如下:
public class Human {
public void feedTheAnimal(Animal animal) {
animal.eat();
}
public static void main(String[] args) {
Human Tom = new Human();
Dog dog = new Dog();
Cat cat = new Cat();
Tom.feedTheAnimal(dog);
Tom.feedTheAnimal(cat);
}
}