Java day6【第十六章】多态性
【第十六章】多态性
一.多态性简介
多态性是面向对象中的第三个主要特征,多态性是在继承性的基础之上扩展出来的概念
可以实现父子类的相互转换处理
1.多态性的基本概念:
在JAVA之中,多态性有俩种实现模式:
(1)方法多态性:
方法的重载:同一个方法的名称可以根据传入的参数类型或个数的不同,实现不同功能的执行
class chongzai{
public void print(){
System.out.println("www.mldn.con");
}
public void print(String str){
System.out.println(str);
}
}
方法的覆写:同一个方法可能根据子类使用的不同来实现不同的功能。
class Message{
public void print(){
System.out.println("www.mldn.con");
}
}
class DateMessage extends Message{
public void print(){
System.out.println("Oracle数据库连接信息。。");
}
}
class NetworkMessage extends Message{
public void print(){
System.out.println("网络连接数据信息。。");
}
}
(2)对象多态性
父子实例之间的转换处理,他有俩种模式:
对象向上转型:父类 父类实例 = 子类实例;这种模式是自动完成转换
对象向下转型:子类 子类实例= (子类)父类实例;强制完成转换
从实际的转型处理来讲,大部分情况下考虑最多的一定是对象的向上转型(90%),对于对象的向下转型往往都在使用子类特殊功能的时候(3%),还有一些时候是不会考虑转型的(7%)
上转型对象会失去原对象的一些属性和方法。(向上转型对象相当于子类对象的一个简化版)。
比如动物是父类,老虎是子类,那么当我们说老虎是动物的时候,老虎就失去了老虎本来拥有的一些特征,向上更宽的范围定义。
二.对象向上转型(接受或返回参数的统一性):
对象转型的处理属于多态性,而这一特性必须在继承的基础上实现。
范例:观察一个简单代码:
class Message{
public void print(){
System.out.println("www.mldn.con");
}
}
class DateMessage extends Message{
public void print(){
System.out.println("Oracle数据库连接信息。。");
}
}
public class tsy
{
public static void main(String[] args)
{
DateMessage msg = new DateMessage();
msg.print();
}
}
本程序是一个最简单的方法覆写操作实现,整体的程序之中由于实例化的是子类对象,并且子类对象覆写了父类中的print方法,所以调用的是被覆写的方法。
范例:观察向上转型:
class Message{
public void print(){
System.out.println("www.mldn.con");
}
}
class DateMessage extends Message{
public void print(){
System.out.println("Oracle数据库连接信息。。");
}
}
public class tsy
{
public static void main(String[] args)
{
Message msg = new DateMessage(); //向上转型
msg.print();
}
}
那么这时候就要进行思考了,向上转型到底有什么用呢?
观察下面代码:
class Message
{
public void print(){
System.out.println("连接信息格式化中..");
}
}
class DateMessage extends Message
{
@Override
public void print(){
System.out.println("数据库连接信息格式化中..");
}
}
class WebServerMessage extends Message
{
@Override
public void print(){
System.out.println("Web连接信息格式化中..");
}
}
public class tsy
{
public static void main(String[] args)
{
fun(new DateMessage());
fun(new WebServerMessage());
}
public static void fun(Message mes){
mes.print();
}
}
可以看出,向上转型可以对传入的参数进行统一的设计,但是我们这里为什么不适用重载的方法来实现这个目的呢?
在程序类设计的时候,除了满足于当前的要求之外,还要做出可维护性的设计,如果随着项目的发展,Message产生了许多的子类,每当扩充一个Message子类之后,就要追加一个fun()的方法重载,这样就对程序的维护性造成很大影响。
三.对象向下转型:
向下转型主要特点在于需要使用到一些子类自己特殊的定义处理:

范例:实现向下转型:
向下描述的是子类的特殊定义,但是向下转型不一定是安全的。因为在进行向下转型之前,一定要发生向上转型。

四. instanceof关键字
通过上面的分析,我们可以发现,向下转型是一件具有安全隐患的操作 ,为了保证向下转型的正确性,我们往往需要在转型之前进行判断某个实例是否是某个类的对象,这个就需要通过instaceof语法来实现:
对象 instanceof 类
该判断将返回一个bool类型。
范例:
class Person
{
public void print(){
System.out.println("我是人");
}
}
class SuperMan extends Person
{
public void print(){
System.out.println("我是超人");
}
}
public class tsy
{
public static void main(String[] args)
{
Person per = new Person();
System.out.println(per instanceof Person); //per是Person类,所以返回true
System.out.println(per instanceof SuperMan); //per不是SuperMan类,所以返回false
}
}
浙公网安备 33010602011771号