Java面向对象编程-多态性

本文详细介绍了Java中的多态性,包括方法多态性和对象多态性。对象向上转型允许使用父类引用指向子类对象,实现方法调用的灵活性,而对象向下转型则能访问子类特有的属性和方法,但需谨慎操作以避免ClassCastException。此外,文章提到了instanceof关键字在向下转型前的安全检查作用,确保了代码的稳定性。
摘要由CSDN通过智能技术生成

多态性

1、多态性

多态性是面向对象中的第三大主要特征,多态性是在继承性的基础上扩展出来的概念,也就是可以实现父子之间的相互转换处理。

在Java中多态性的有两种实现的模式:

  • 方法多态性
    • 方法重载
    • 方法重写
  • 对象多态性 --父子实例之间的转换处理,有两种模式:
    • 对象向上转型: 父类 父类实例 = 子类实例 --自动完成转换
    • 对象向下转型: 子类 子类实例 = (子类) 父类实例 --强制完成转换

在实际的转型上,大部分的情况都是 对象的向上转型 ,只有极小部分是 对象向下转型 还有一部分是String类型,String类型一般不转型

2、对象向上转型

public class JavaDemo{
	public static void main(String [] args){	
		Message message= new DatabaseMessage();
		message.fun();
	}
}

class Message{
	public void fun(){
		System.out.println("***111***") ;
	}
}

class DatabaseMessage extends Message{
	public void fun() {
		System.out.println("嘿嘿嘿") ;
	}
}

对象向上转型的应用,在调用方法的时候传递 new 的实例化参数

public class JavaDemo{
	public static void main(String [] args){	
		into(new DatabaseMessage()) ;
		into(new WebMessage()) ;
	}
	public static void into(Message message){
		message.fun() ;
	}
}

class Message{
	public void fun(){
		System.out.println("原型") ;
	}
}

class DatabaseMessage extends Message{
	public void fun() {
		System.out.println("对象向上转型一") ;
	}
}

class WebMessage extends Message{
	public void fun(){
		System.out.println("对象向上转型二") ;
	}
}

转型的主要特点在于可以使用参数统一进行设计。
不使用重载的方法来完成实现的原因:主要是为了在满足要求的同时,还保留可维护性,如果使用重载,则同一个方法就需要被连续调用,不是和维护。

对象向上转型 明确接收或返回参数的统一性

向上转型,被子类覆写的方法或者属性,将按照子类所覆写的实现,没有被子类覆写的方法或者属性按照父类的实现,
值得注意的是,向上转型后的实例对象既是父类的实例,又是子类的实例,但是方法或者属性一旦被子类所覆写,那么实例化的对象实现的就是子类的,而不是父类的
同时,实例不能调用子类自己的属性和方法,但可以调用父类自己的属性和方法

3、对象向下转型

public class JavaDemo{
	public static void main(String [] args){	
		System.out.println("平常状态下的超人---一个普通人") ;
		Person person = new SuperMan() ; 	//向上转型
		person.print() ;

        System.out.println("超能力状态下的超人---一个会喷火的人") ;
        SuperMan man = (SuperMan) person ;	//向下转型
        System.out.println(man.fly()) ;
        System.out.println(man.fire()) ;
    }
}

class Person{
	public void print(){
		System.out.println("吃饭、睡觉") ;
	}
}

class SuperMan extends Person{
	public String fly() {
		return "我可以飞" ;
	}
	public String fire(){
		return "我可以喷火" ;
	}
}

向上转型描述的是一些公共的特征,向下转型描述的是子类自己特殊的定义环境,但是需要明确的是,向下转型并不是一件安全的事情,因为在进行向下转型之前一定要首先发生向上转型
只要是发生 对象向下转型之前一定要首先发生向上转型,两个任何关系的实例入伙要发生强制转换,就会出现异常,因此向下转型并不是一个安全的事情

4、instanceof关键字

通过分析可以发现向下转型本是一件存在有安全隐患的操作,所以为了保证 对象向下转型 的正确性,往往需要在进行转型之前进行判断,判断某个实例是否是某个类的对象

public class JavaDemo{
	public static void main(String [] args){	
		Person person = new Person() ; 	//向上转型
		System.out.println(person instanceof Person) ;	//true
		System.out.println(person instanceof SuperMan) ;	//false
	}
}

class Person{
	public void print(){
		System.out.println("吃饭、睡觉") ;
	}
}

class SuperMan extends Person{
	public String fly() {
		return "我可以飞" ;
	}
	public String fire(){
		return "我可以喷火" ;
	}
}

在进行转型之前,可以利用instanceof关键字先进行判断

public class JavaDemo{
	public static void main(String [] args){	
		Person person = new SuperMan() ; 	//向上转型
        if(person instanceof SuperMan){
            SuperMan man = (SuperMan) person ;
            System.out.println(man.fly()) ;	
            System.out.println(man.fire()) ;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyRedScarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值