Java类的三大特性之三:多态性

  众所周知,Java类有三大特性:1.封装性;2.继承性;3.多态性。博主前面已经介绍了前两种,下面博主将介绍Java类的第三大特性,也是Java类中最难理解的一种特性:多态性。什么叫多态性呢?顾名思义,多态性就是一种事物的多种表现形态。举个例子:
            在这里插入图片描述
汽车可以被看做是我们日常生活中的一种事物,正因为多态性,所以汽车呈现出了很多种的表现形态,如:轿车(宝马7系),跑车(GTR、阿斯顿马丁、法拉利)、SUV(奔驰大G)、卡车(斯堪尼亚)等等。这就是多态性的一种体现,类似于这样的例子还有很多。接下来我们将用代码来展示多态性的应用,在开始展示之间我们先介绍两个概念和一个操作符。

1. 对象类型的转换
  Java中对象类型的转换有两种,一种是向上转型,另一种是向下转型。什么叫向上转型呢?向上转型用一句话概括就是:从特殊到普通。正方形是多边形的一种,其四条边相等,如果把正方形的每条边的长度都改变以下,那么它就变成了一个普通的多边形,这就叫向上转型。同理,向下转型就是从普通到特殊。将一个多边形转换成正方形的过程就叫向下转型。代码层面上的理解如下:
(1)定义一个多边形类

class Polygon{
		//属性
		private int number_side;
		//构造器
		public Polygon(int number_side) {
			super();
			this.number_side = number_side;
		}
		//方法
		public int getNumber_side() {
			return number_side;
		}
		public void setNumber_side(int number_side) {
			this.number_side = number_side;
		}
}

(2)定义一个正方形类继承于多边形类

class Polygon{
		//属性
		private int number_side;
		//构造器
		public Polygon(int number_side) {
			super();
			this.number_side = number_side;
		}
		//方法
		public int getNumber_side() {
			return number_side;
		}
		public void setNumber_side(int number_side) {
			this.number_side = number_side;
		}
}

(3)创建一个测试类

public class Test {
	public static void main(String[] args) {
		//创建一个多边形对象,边数为4
		Polygon p = new Polygon(4);
		//创建一个正方形对象,边长为5
		square s = new square(5,4);
		//将子类对象正方形赋给父类对象多边形为向上转型
		p = s;
		//将父类对象强制转换成子类对象为向下转型
		s = (square)p;
	}
}

将子类对象s赋给父类对象p即为向上转型,将父类对象p+强转符转换成子类对象s即为向下转型。从代码中我们可以观察到,向上转型并不需要强制转换,而向下转型则需要强制转换。

2. 操作符instanceof
  在程序执行向下转型的操作中,如果父类对象不是子类对象的实例,就会发生ClassCastException异常,所以在执行向下转型之前通常都要判断父类对象是否为子类对象的实例。这个判断就通过操作符instanceof来完成(该操作符也可以用于判断是否一个类实现了某一接口或者判断一个实例对象是否属于一个类)。这里博主先不用代码来演示instanceof的用法,因为接下来要进入本文的主题,在讲解多态性的过程中会使用到instanceof,所以这里先不做代码上的演示。

  接下来将进入本文的主题:多态性。什么是多态性前面已经说过了,下面废话少说直接上干货。
  仍然以之前多边形和正方形为例,将测试类更改一下,如下所示:

public class Test {
	public static void main(String[] args) {
		//创建一个子类对象,将其赋给父类p
		//此行代码即为多态性的体现,及父类对象是子类对象的一个实例
		Polygon p = new square(5,4);
		if(p instanceof square){
			//将父类对象p向下转型为子类对象s
			square s = (square)p;
			s.show();
		}
	}	
}

  可以看到,代码中我们创建了一个正方形的实例:new square(5,4),但是接收这个实例的却不是square的对象,而是其父类对象p,将子类实例赋给父类对象就是java多态性的一种体现。而且我们还使用了instanceof操作符判断了父类对象p是否为子类的实例,如果是,才进行向下转型的操作 ,这样可以帮我们避免bug的出现,所以在以后遇到需要执行向下转型的操作时,应该习惯的去使用instanceof,这是一种良好的编程习惯,也是我们日后走上开发者岗位后的职业素养,在编程中,养成良好的编程习惯可以起到事半功倍的效果。
  其实java中的多态性不仅仅只是上面所介绍的,除此之外还有方法的重载与重写(注意:方法的重载与方法的重写本质上没有任何关系,只不过名称很像罢了)。方法的重写博主会单独的拿出一篇来介绍它,所以这里只介绍方法的重载。,为什么说方法的重载也是多态性的一种表现呢?我们带着疑惑来看下面的代码:

public class TestOverLoad {
	public static void main(String[] args) {
		System.out.println("调用method(int a ,int b)方法: " + method(1,2));
		System.out.println("调用method(double a ,double b)方法: " + method(1.1,2.1));
		System.out.println("调用method(int a)方法: " + method(1));
		System.out.println("调用method(int a ,double b)方法: " + method(1,2.1));
		System.out.println("调用method(double a ,int b)方法: " + method(1.1,2));
	}

	//定义一个方法,返回值为int类型,有两个int类型形参
	public static int method(int a ,int b){
		return a+b;
	}	
	//定义一个方法,返回值为double类型,有两个double类型形参
	public static double method(double a ,double b){
		return a+b;
	}
	//定义一个方法,返回值为int类型,有一个int类型形参
	public static int method(int a){
		return a;
	}
	//定义一个方法,返回值为int类型,有一个int类型形参和一个double类型形参
	public static int method(int a ,double b){
		return 1;
	}
	//定义一个方法,返回值为int类型,有一个double类型形参和一个int类型形参
	public static int method(double a ,int b){
		return 1;
	}
}

上面代码的输出为:
在这里插入图片描述
  可以看到,以上代码中的五个方法名全部相同,但是程序仍然可以正常运行,原因就是以上五个方法之间互相构成重载关系。以上的五个方法虽然名称相同(可以理解为同种事物),可是它们的表现形式却不一样,这正好符合多态性的本质:同种事物的不同表现形式,所以方法的重载也是多态性的一种表现。通过以上代码可以总结出方法之间构成重载关系的要素:
1.方法的参数个数不同,构成重载
2.方法的参数类型不同,构成重载
3.方法的参数顺序不同,构成重载

  但应注意的是:两个方法只有返回值类型不同不能构成重载关系,还需要通过参数的类型及个数来判断。
以上便是关于java多态性的基本内容,希望对大家的学习有帮助,如有不正确的地方,欢迎大家批评指正。

特殊声明:本人并不是大佬,只是说一说自己在学习Java过程中的理解,文章有不正确的地方欢迎大家批评指正。最后希望大家不喜勿喷,营造良好的学习环境。
温馨提示:道路千万条,学习第一条。平时不学习,招聘两行泪!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值