Java多态
首先创建一个一个多态Java project,创建三个类,Mammal,Bat,Test三个类,Bat(蝙蝠)是属于Mammal(哺乳动物)的一种。Mammal类中有一个move();方法,在Bat类中,继承了Mammal类,并有新的属性weight,和新的方法eat();并且重写父类中的move();方法。代码如下:
package 多态;
public class Mammal {
public void move() {
System.out.println("正在移动.........");
}
}
package 多态;
public class Bat extends Mammal {
double weight;
public void eat() {
System.out.println("吃东西.....");
}
public void move() {
System.out.println("靠翼飞行........");
}
}
在Test中,new了一个Bat对象,调用了Bat类中重写父类的move();方法,注意bat.move();在编译时调用的move();方法和执行的调用子类的move();方法是同一个。
在Java中,小范围精度的数据可以直接赋值给大范围数据类型,比如double price = 9;
,结果显示9.0,但是大精度就不能直接赋值给小精度,需要强制类型转换。比如int x =(int)9.0;
输出结果显示9。
而Mammal mammal = new Bat();
也类似这样的道理,Bat类属于Mammal类,可以这样赋值-父类类型变量=子类创建的对象,而当用父类类型变量mammal去调用move的方法时,由于编译时的变量为父类类型,所以编译时调用的是父类中的move方法,而在运行时,mammal变量指向子类创建的对象,所以运行调用的是子类的move方法,编译时和运行时调用的方法不一致,就是多态,即多种行为状态。
多态的定义
父类类型(比如Mammal)的变量(比如mammal)指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法(比如move方法),则父类中的方法呈现出不同的行为特征,这就是多态。
多态的特点
**a、**编译时和运行时类型一致,则一定不会产生多态。
**b、**编译时调用的方法一定被子类所重写。也就是说Mammal中的move();方法必须被子类Bat类所重写,否则不会出现多态。
**c、**父类类型变量 = 子类创建的对象(又称为上转型对象),Mammal mammal = new Bat();
本身对象new Bat()是一个Bat类,变成了Mamaml类,类型向大的转变了,所以为上转型对象,就好比代码double price = 9;
9本身是一个int类型,但是转变成为了double类,类型转变大了,所以二者是一个道理。
上转型对象的特点
**a、**上转型对象不能调用子类新增的属性和方法。也就是例子上的上转型对象mammal是不能调用Bat类中的weight的属性和eat();方法的,因为weight属性和eat();是Bat类中新增的。
**b、**上转型对象如果必须调用子类新增的属性和方法,则必须下转型。
所谓下转型,可以这样理解int x =(int)9.0;
这样为强制性转换,好比这里Bat b = (Bat)mammal; System.out.println(b.weight); b.eat();
mammal类比Bat类大,使用强制性转换就可以调用子类新增的属性和方法了。
但不是任意的变量都可以下转型,非上转型对象不能下转型,比如Mammal m = new Mammal(); Bat bb = (Bat)m;
这样就不行,因为m不是一个上转型对象,而下面代码的mammal才是一个上转型对象。所以m是不能下转型的。
倘若子类成员变量与父类成员变量名字重复,则上转型对象调用的是父类中的方法。
package 多态;
public class Test {
public static void main(String[] args) {
Bat bat = new Bat();
bat.move();//编译时调用的move方法和执行的调用子类的move方法是同一个方法
double price = 9;//小范围精度的数据可以直接赋值给大范围数据类型
System.out.println(price);
Mammal mammal = new Bat();//父类类型变量 = 子类创建的对象
mammal.move();//编译时变量为父类类型,所以编译时调用的是父类中的move方法
//运行时,mammal变量指向子类创建的对象,所以运行调用的是子类的move方法
//编译时和运行时调用的方法不一致,就是多态,即多种行为状态
//父类类型(比如Mammal)的变量(比如mammal)指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法(比如move方法),则父类中的方法呈现出不同的行为特征,这就是多态。
//多态特点
//1、编译时和运行时类型不一致,则一定不会产生多态
//2、编译时调用的方法一定被子类所重写
//3、父类类型变量 = 子类创建的对象(又称为上转型对象)
//上转型对象特点:上转型对象不能调用子类新增的属性和方法
//上转型对象如果必须调用子类新增的属性和方法,则必须下转型
int x =(int)9.0;
System.out.println(x);
Bat b = (Bat)mammal;
System.out.println(b.weight);
b.eat();
//非上转型对象不能下转型
Mammal m = new Mammal();
Bat bb = (Bat)m;//因为m变量中保存的不是上转型对象,所以不能下转型
//如果子类成员变量与父类成员变量名字重复,则上转型对象调用的是父类中的方法
}
}