什么是多态
多态,即多种行为的状态。是指父类类型的变量指向子类类型创建的对象,使用该变量调用父类中一个被子类重写的方法,则父类中的方法呈现出不同的行为特征,这种现象即为多态。表现形式为:父类类型变量 = 子类创建的对象
代码展示:
public class Mammal {//父类
public void move() {
System.out.println("正在移动...");
}
}
public class Bat extends Mammal{//子类
String weight = "1.2kg";
@Override
public void move() {
System.out.println("靠翼飞行...");
}
}
public class Test {//main方法中多态的表现
public static void main(String[] args) {
Bat bat = new Bat();
bat.move();
Mammal mammal = new Bat();//多态的表现形式
mammal.move();
}
多态的特点
1、编译时和运行时的类型不一致,否则一定不会产生多态。对Test项目中部分段的代码进行分析叙述:
Bat bat = new Bat();
bat.move();
在编译时,变量为子类类型,所以编译时调用子类的move方法;在运行时,执行时bat指向的就是本类创建的对象,所以调用本类的move方法;
Mammal mammal = new Bat();
mammal.move();
在编译时,为父类类型,所以编译时调用父类的move方法;在运行时,mammal指向子类创建对象,所以运行时调用子类方法。编译和运行时调用的方法不一致,此现象称之为多态。
2、编译时调用的方法一定被子类重写。
public class Mammal {//父类
public void move() {
System.out.println("正在移动...");
}
}
public class Bat extends Mammal{//子类
@Override
public void move() {
System.out.println("靠翼飞行...");
}
}
3、多态中,父类类型变量 = 子类创建的对象(又称为上[↑]转型对象)
代码体现在Test类代码中,Mammal mammal = new Bat(); 即为具体表现形式。
Mammal mammal = new Bat();
mammal.move();
上转型对象的特点
1、上转型对象不可调用子类新增的属性与方法。(例如代码中,mammal可以调用Bat中的move方法,却无法将把Bat中的weight输出出来。)若上转型必须调用子类的新增属性和方法,则需要将其转化为下转型对象。可以参照Test中带注释的代码理解。
public class Mammal {//父类
public void move() {
System.out.println("正在移动...");
}
}
public class Bat extends Mammal{//子类
String weight = "1.2kg";
public void eat(){
System.out.println("正在吃虫子");
}
@Override
public void move() {
System.out.println("靠翼飞行...");
}
}
public class Test {//main方法中多态的表现
public static void main(String[] args) {
Bat bat = new Bat();
bat.move();
Mammal mammal = new Bat();//多态的表现形式
mammal.move();
Bat b = (Bat) mammal;//将上转型转化为下转型
System.out.println(b.weight);
b.eat();
2、非上转型对象无法下转型为下转型对象。
3、如果子类成员变量与父类成员变量重复,则上转型对象调用的是父类中的方法。
public class Mammal {//父类
int weight = 1.2;
public void move() {
System.out.println("正在移动...");
}
}
public class Bat extends Mammal{//子类
String weight = "1.2kg";
public void eat(){
System.out.println("正在吃虫子");
}
@Override
public void move() {
System.out.println("靠翼飞行...");
}
}
public class Test {//main方法中多态的表现
public static void main(String[] args) {
Bat bat = new Bat();
bat.move();
Mammal mammal = new Bat();//多态的表现形式
Bat b = (Bat) mammal;//将上转型转化为下转型
System.out.println(b.weight);
此时,输出weight的结果应该为父类Mammal中的“1.2”。