再述:Java多态

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变量中保存的不是上转型对象,所以不能下转型
		
		
		//如果子类成员变量与父类成员变量名字重复,则上转型对象调用的是父类中的方法
	}	
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值