首页 / JAVA / JAVA面向对象的本质之一:多态
JAVA面向对象的本质之一:多态
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA面向对象的本质之一:多态,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2941字,纯文字阅读大概需要5分钟。
内容图文
![JAVA面向对象的本质之一:多态](/upload/InfoBanner/zyjiaocheng/621/a3addcda58cb433c8006538f46d130fb.jpg)
JAVA面向对象的本质之一:多态
一、什么是多态
多态是继封装、继承之后,面向对象的第三大特性。
多态是具有表现多种形态的能力的特征。更专业的说法:同一个实现接口,使用不同的实例而执行不同的操作,例如一个榨汁机,你将什么水果放进去,它就榨出什么水果,将苹果放进去,它就榨苹果汁,放草莓它就榨草莓汁,即出现的不同的形态
注:多态只是一种概念,并非具体实现方法(继承是多态的前提)
二、怎么实现多态:
1.子类到父类的转换(向上转型)
定义格式:父类类型 变量名=new 子类类型();
? 错误格式:子类类型 变量名=new 父类类型();[子类类型无法自动转换到父类类型,就好比double可以接收int类型的数值,但int无法接收double类型的数值一样,需要显示转换(强行转换)]---->正确格式:子类类型 变量名=(子类类型)new 父类类型();(向下转型)
以动物为案例
父类:Animal动物类
public class Animal {
public void eat(){
System.out.println("动物在吃");
}
}
子类:Cat猫类
public class Cat extends Animal {
public void eat(){
System.out.println("猫在吃鱼");
}
//抓鱼
public void catchFish(){
System.out.println("猫抓鱼");
}
}
子类:Dog狗类
public class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void housekeeping(){
System.out.println("狗看家");
}
}
如果测试类中
Animal animal=new Dog();
animal.eat();
那将会调用Dog类重写的eat()方法,而不是Animal类的eat()方法;[这类似与赋值,将new Dog()赋值给Animal,由animal去点出Animal和Dog共有的方法]
注:animal只能访问父类的eat()方法,无法调用Dog的housekeeping()方法
2.父类到子类的转换(向下转型)
问题来了,如果猫吃完鱼后想再抓几条鱼怎么办,Animal animal=new Cat();又无法调用猫特有的抓鱼方法
public void s(){
Animal animal=new Cat();
animal.eat();
Cat animal1=(Cat)new Animal();
animal1.catchFish();
}
上面提到,当向上转型发生后,将无法调用子类特有的方法。但是当需要调用子类特有的方法时,可以通过将父类再强转为子类来实现
3.使用父类作为方法形参实现多态
有个问题,如果主人要给这些宠物喂食,那就不得不分别写两个eat()方法给猫和狗喂食,如果由很多只不一样的宠物呢,这就违背了Java的面向对象的思想,以下代码可以解决问题
public class Master {
public void feed(Animal a){
a.eat();
}
}
测试类中
public static void main(String[] args) {
Dog dog=new Dog();
Master master=new Master();
master.feed(dog);
}
需要喂食什么动物就给什么对象
4.使用父类作为方法返回值类型实现多态
public class Master {
public Animal1 adopt(){
Animal1 animal=new Cat();
return animal;
}
public static void main(String[] args) {
Animal a= master.adopt();
Cat animal=(Cat) a;
animal.catchFish();
}
三、instanceof运算符
上面的Cat animal1=(Cat)new Animal();类似于C#的as(强行转换)
那么instanceo就类似于C#的is(判断类型)
语法
boolean 变量名=对象 instanceo 类或接口
问题:如果主人想猫吃完鱼就去抓鱼,狗吃完骨头就去看家,怎么实现?以猫为例
public class Master {
Animal a=new Animal();
a.eat();//猫和狗共有的方法
if(a instanceo Cat){
Cat animal=(Cat) a;
animal.catchFish();
}eles{
Dog animal1=(Dog) a;
animal.catchFish();
}
}
该运算符用来判断一个对象是否属于一个类或一个接口,返回类型为boolean类型。在强转类型转换前通过instanceo 运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
内容总结
以上是互联网集市为您收集整理的JAVA面向对象的本质之一:多态全部内容,希望文章能够帮你解决JAVA面向对象的本质之一:多态所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。