一、概念
多态的概念:指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。
也就是说,程序中原本定义的引用对象的具体类型并不确定,而是在程序运行时才能够确定,从而使得同一个对象能够代表不同的对象,程序每一次的运行都会有不同的效果。
二、背景知识
要了解多态,首先需要对类型转换有一些认识。
强制类型转换
double a=156.13;
int b= (int)a;
向上转型
public class TestPet {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet pet1=new Pet();
pet1.run();
//向上转型
Pet pet2 =new Cat();
pet2.run();
// pet2.jeep();错误
}
}
public class Pet {
public void run() {
System.out.println("Pet run");
}
}
public class Cat extends Pet{
@Override
public void run(){
System.out.println("Cat run");
}
public void jeep() {
System.out.println("Cat jeep");
}
}
在向上转型后,父类调用的方法为子类中自己重写的方法,但是不能够再调用子类自己独有的方法。
由于此时不能够调用Cat类中的jeep方法,所以需要再向下转型。
向下转型
public class TestPet {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet pet1=new Pet();
pet1.run();
//向上转型
Pet pet2 =new Cat();
pet2.run();
// pet2.jeep();错误
//向下转型
Cat cat =new Cat();
Pet pet3=cat;
cat=(Cat)pet3;
cat.jeep();
}
}
public class Pet {
public void run() {
System.out.println("Pet run");
}
}
public class Cat extends Pet{
@Override
public void run(){
System.out.println("Cat run");
}
public void jeep() {
System.out.println("Cat jeep");
}
}
三、多态知识点
多态的前提:继承、重写、父类引用指向子类对象(向上转型)
多态需要注意的细节:
1.当子父类存在同名的成员变量时,访问的是父类的成员变量。
2.当子父类存在同名的静态函数时,访问的是父类的函数。
3当子父类存在同名的非静态函数时,访问的是子类的函数。
4不能访问子类特有的成员。
public class TestPet {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pet pet2 =new Cat();
System.out.println(pet2.name);
pet2.walk();
pet2.run();
//pet2.jeep 错误
}
}
public class Pet {
public String name;
public Pet() {
this.name="zou";
}
public void run() {
System.out.println("Pet run");
}
public static void walk() {
System.out.println("Pet walk");
}
}
public class Cat extends Pet{
public int age;
public String name;
public Cat() {
this.name="m";
this.age=6;
}
public void run(){
System.out.println("Cat run");
}
public void jeep() {
System.out.println("Cat jeep");
}
public static void walk() {
System.out.println("Cat walk");
}
}
四、多态的应用场景
1.在循环时通过调用父类对象来访问不同的子类,从而批量处理不同类型的数据
2.在写方法时,将父类作为形式参数传入方法中,而子类作为实际参数在方法中被调用,使得方法可以接受更多类型的数据。
五、小结
多态能够避免不同子类的差异,简化程序,使我们的程序更加通用,还是非常有用的!