Java是面向对象的语言,面向对象的三大特性:封装,继承和多态
今天我们来谈谈多态
- 多态:顾名思义,就是多种形态,是指子类的多种形态
- 多态分为向上转型和向下转型,我们先介绍向上转型
多态之向上转型
- 我们经常说:老虎是动物,狗是动物,学生是人,老师是人,这其实也是一种多态
我们来看这样的例子:
class Person{
void show() {
System.out.println("我是人!");
}
}
class Student extends Person {
void show() {
System.out.println("我是学生!");
}
}
class Teacher extends Person{
void show() {
System.out.println("我是老师!");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
Person person = new Teacher();
person.show();
Person p ;
Student s= new Student();
p = s;
p.show();
}
}
- 这个例子中,父类为:Person,子类Student,Teacher 都重写了父类的show()方法
- 在主函数中,我们new了一个Teacher对象,并将Teacher对象赋值给父类的引用变量,这时就说,子类的对象是父类对象引用变量的上转型对象
- 结果为:
向上转型的注意事项
- 上转型对象不能操作子类新增的成员
例如在上面的例子中,在子类Student中增加新方法:
void study() {
System.out.println("I'm study!");
}
主函数中,上转型对象person调用study方法
person.study();//报红
此时编译器报错,The method study() is undefined for the type Person
**修改方案:**将上转型对象强制转回去,转成子类:将person.study();
改为((Student) person).study();
,此处的语法类似于基本数据类型的强制类型转换 byte x = (byte)123
- 上转型对象调用的是子类重写的方法
上述例子中,上转型对象person.show()就是调用子类的重写方法
向上转型的作用
- 上转型的作用:利于扩展,提高代码的复用性
下面的例子可能不是很恰当
abstract class Animal{
abstract void eat();
}
class Dog1 extends Animal{
public void eat() {
System.out.println("啃骨头");
}
void lookHome() {
System.out.println("看家");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("吃鱼");
}
void catchMouse() {
System.out.println("抓老鼠");
}
}
public class Test1 {
public static void main(String[] args) {
Dog1 d = new Dog1();
d.eat();
Dog1 d2 = new Dog1();
d2.eat();
Cat c1 = new Cat();
c1.eat();
}
}
抽象类Animal有一个抽象方法:eat(),子类,Dog,Cat重写抽象方法,在主类中,多次定义Dog类对象,调用eat方法
假如我有五个狗,五个猫,就得写10次对象.eat(),代码过于冗长
- 解决方法:在主类中添加
public static void method(Animal a) { a.eat(); }
使用method(d1); method(d2)
调用ea()方法,主类的代码如下:
public class Test1 {
public static void main(String[] args) {
Dog1 d = new Dog1();
method(d);
Dog1 d2 = new Dog1();
method(d2);
Cat c1 = new Cat();
method(c1);
}
public static void method(Animal a) //利用多态的向上转型
{
a.eat();
}
}
此时的method()方法就利用的多态的向上转型