Java面向对象特征之三:多态
创始人
2024-05-30 00:15:19
0

一:面向对象三大特征之三:多态

1.多态是什么?

同类型的对象,执行同一个行为,会表现出不同的行为特征。

比如:猫和狗都是动物类型,执行同一个行为,但是会表现出不同的行为特征;

2.多态的常见形式

父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;

例:

/*
动物类父类抽象类*/
public abstract class Animal {public abstract void run();
}
/*
狗类:子类,继承动物类*/
public class Dog extends Animal {@Overridepublic void run() {System.out.println("狗恰狗粮");}
}
/*
猫类:子类,继续动物类*/
public class Cat extends Animal {@Overridepublic void run() {System.out.println("猫恰猫粮");}
}
public class PolymorphismTest {public static void main(String[] args) {//这是之前的形式Dog d1 = new Dog();d1.run();Cat c1 = new Cat();c1.run();System.out.println("----------------");/*多态的形式为:父类类型 对象名称 = new 子类构造器;例如下 右边的狗对象 赋值 给 左边的动物对象下方狗对象只代表单种动物类型;但是动物对象代表所有的动物,属于是小范围赋值给大范围,合情合理。*/Animal d2 = new Dog();d2.run();Animal c2 = new Cat();c2.run();}
}

控制台输出结果:


3.多态中成员访问特点

方法调用:编译看左边,运行看右边;

 

如上:

1.编译阶段的时候会去到这个Animal类里找run方法 

2.找到了以后,等到运行的时候就会去Dog类里找run方法


变量调用:编译看左边,运行也看左边;(多态侧重行为多态)

  

 


4.多态的前提

需要有继承/实现关系;有父类引用指向子类对象;有方法重写。


二:多态的优势

1.优势

(1)在多态形式下,右边对象可以实现解耦合,便于扩展和维护;

没换掉之前:

 

 把🐕对象更换成🐱,run行为也会跟着改变,不需要改动代码


 (2)定义方法的时候,使用父类作为参数,该方法就可以接收这个父类的一切子类对象,体现出多态的扩展与便利;

所有动物参加赛跑比赛

public class PolymorphismTest {public static void main(String[] args) {System.out.println("---比赛开始---");Animal d1 = new Dog();go(d1);Animal c1 = new Cat();go(c1);System.out.println("吃得一样快,比赛结束,平手平手");}/*需求:所有动物可以一起参加比赛*/public static void go(Animal a){a.run();}
}

执行原理:在上列代码中,第一步会先将狗对象的地址给到a1,然后go方法再将狗对象的地址传给形参a,形参a接收到对象地址后,根据地址去访问狗对象里的run行为。


2.多态下产生的问题

多态下不能使用子类的独有功能:

因为父类是被继承的,因此继承了父类的子类会有父类的一切行为,但是父类是没有子类独有行为的。

 

三:多态下引用类型的类型转换

1.引用类型是什么?

也就是我们自己定义的:动物类、学生类、狗类猫类等等。

2.引用类型的类型转换

自动类型转换:子类对象赋值给父类类型的变量指向。

因为父类范围大,所有子类对象赋值给父类类型的变量指向➡属于:小范围赋值给大范围,因此是自动类型转换。

强制类型转换(从父到子):

子类 对象变量 = (子类)父类类型的变量;

作用:可以解决多态下的劣势,可以实现调用子类的独有行为(方法功能)。

public class Animal {/*动物通用行为:跑*/public void run(){System.out.println("动物可以跑^_^");}
}
public class Dog extends Animal{/*重写父类run方法*/@Overridepublic void run() {System.out.println("🐕跑得飞快~~");}/*狗类独有方法:看门*/public void lookDoor(){System.out.println("🐕看门");}
}
public class Cat extends Animal{@Overridepublic void run() {System.out.println("🐱跑得也很快");}public void bullyDog(){System.out.println("🐱在欺负🐕");}
}
public class PolymorphismTest {public static void main(String[] args) {System.out.println("多态下引用类型的自动类型转换:");Animal a1 = new Dog();a1.run();
//        报错,多态下不能访问子类独有功能
//        a1.lookDoor();System.out.println("------------");Animal a2 = new Cat();a2.run();
//        报错,多态下不能访问子类独有功能
//        a2.bullyDog();System.out.println("\n多态下引用类型的强制类型转换");
//        从父类类型到子类类型,大转小→必须强制类型转换Dog d = (Dog) a1;d.run();d.lookDoor();System.out.println("-------------");
//        从父类类型到子类类型,大转小→必须强制类型转换Cat c = (Cat) a2;c.run();c.bullyDog();}
}

控制台输出结果:

 注意:如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException

3.instanceof关键字 

Java建议多态下的引用类型在强制类型转换的前,使用 instanceof 关键字判断当前对象的真实类型,再进行强制类型转换。

变量名 instanceof 真实类型
判断 instanceof 左边的变量指向的对象的真实类型,是否与右边的类型或者与其子类类型一样,是则返回true,反之。
        Animal a3 = new Cat();
//        强制类型转换,编译阶段不报错的(注意:继承或者实现关系编译阶段可以强制,没有毛病),运行可能出错了
//        Dog dog = (Dog)a3;
//        java建议在强制转换前使用instanceof关键字判断当前对象的真实类型,再进行强制转换if (a3 instanceof Cat){     //判断a3指向的是不是Cat类Cat cat = (Cat)a3;      //是cat,强制转换成cat类,从父类类型到子类类型大转小,必须进行强制类型转换cat.run();              cat.bullyDog();}else if (a3 instanceof Dog){   //反之,判断a3指向是Dog则强制转换成狗类型Dog dog = (Dog) a3;dog.run();dog.lookDoor();}System.out.println("-------------");

 

 

        System.out.println("-------------");Animal a3 = new Dog();
//        强制类型转换,编译阶段不报错的(注意:继承或者实现关系编译阶段可以强制,没有毛病),运行可能出错了
//        Dog dog = (Dog)a3;
//        java建议在强制转换前使用instanceof关键字判断当前对象的真实类型,再进行强制转换if (a3 instanceof Cat){     //判断a3指向的是不是Cat类Cat cat = (Cat)a3;      //是cat,强制转换成cat类,从父类类型到子类类型大转小,必须进行强制类型转换cat.run();cat.bullyDog();}else if (a3 instanceof Dog){   //反之,判断a3指向是Dog则强制转换成狗类型Dog dog = (Dog) a3;dog.run();dog.lookDoor();}System.out.println("-------------");

 4.知识总结:

1.引用类型的类型转换,有几种方式?

自动类型转换,强制类型转换。

2.强制类型转换能解决什么问题?需要注意什么?

可以解决多态下不能访问子类独有功能的问题,强制转换后可以访问;

有继承或者实现关系的两个类型就可以进行强制转换,编译无问题;

运行时,如果发现强制转换后的类型不是对象的真实类型则会报错;

注意:Java建议强制转换前使用instanceof关键字判断一下当前对象的真实类型,再进行强制类型转换

相关内容

热门资讯

恋夜视频安卓系统Uc,恋夜视频... 亲爱的读者,你是否曾在深夜时分,被手机屏幕上跳动的视频吸引?今天,就让我带你一探究竟,揭开恋夜视频安...
鸿蒙套娃安卓系统视频,融合与创... 你知道吗?最近科技圈可是炸开了锅,因为华为的新操作系统鸿蒙OS又有了新动作。这不,他们竟然把鸿蒙套娃...
xp系统连接安卓手机问题,实用... 你有没有遇到过这样的情况:你的电脑上还运行着那个经典的XP系统,而你的安卓手机却时不时地想要和你亲密...
压缩安卓系统储存空间,高效管理... 手机里的照片越来越多,游戏也越玩越上瘾,可这安卓系统的储存空间却越来越紧张,是不是感觉像是在挤牙膏?...
安卓手游转苹果系统教程,轻松实... 你是不是也和我一样,手头有一堆安卓手游,突然之间想换换口味,体验一下苹果系统的魅力呢?别急,今天就来...
安卓原生系统锁屏暗,安卓系统锁... 亲爱的手机控们,你是否曾为安卓手机锁屏时的暗模式而感到好奇?那种在夜晚或光线不足的环境中,屏幕自动调...
安卓系统表情包下载地址,安卓系... 你是不是也和我一样,对安卓系统的表情包爱不释手?那些搞笑的、可爱的、甚至是有点小调皮的表情,总能让我...
原生安卓系统声音bug,揭秘那... 你有没有遇到过这种情况?手机里突然传来一阵奇怪的声音,让你瞬间从美梦中惊醒,或者正在专心工作时被打扰...
水果收银机安卓系统,便捷高效的... 你有没有想过,在繁忙的超市里,那些摆满新鲜水果的摊位,背后竟然隐藏着一个小小的科技秘密?没错,就是那...
安卓系统变苹果界面了吗,苹果界... 最近手机界可是炸开了锅,不少安卓用户都在议论纷纷:“安卓系统变苹果界面了吗?”这事儿可真不简单,得好...
miui操作系统与安卓系统吗,... 亲爱的读者,你是否曾在手机上看到过MIUI操作系统和安卓系统这两个名字,好奇它们之间有什么区别?今天...
安卓系统怎么卡道具界面,探究原... 手机用久了,是不是感觉安卓系统越来越卡?尤其是那个道具界面,点开就慢吞吞的,真是让人头疼。别急,今天...
安卓系统红包加速器,畅享无阻新... 你有没有发现,现在用手机抢红包简直是一场速度与激情的较量?别急,别急,让我来给你揭秘一款神器——安卓...
安卓经典版系统更新时间,从首次... 你有没有发现,最近你的安卓手机又悄悄地变了个样?没错,就是那个陪伴我们多年的经典版系统,它又来更新啦...
安卓系统开发要多久,约需1-2... 你有没有想过,自己动手开发一个安卓应用,究竟需要多长时间呢?这可是个让人好奇的问题,毕竟安卓系统开发...
原生安卓系统手机壁纸图片,探索... 亲爱的手机控们,你是否曾为寻找一款独特的壁纸而烦恼?今天,就让我带你走进原生安卓系统手机壁纸的奇幻世...
bmw安卓互联系统,智能驾驶新... 你有没有发现,现在开车已经不仅仅是驾驶那么简单了?一辆好车,还得有个好“大脑”,这样才能让你的驾驶体...
安卓手机升级系统卡吗,安卓手机... 你有没有遇到过这种情况:安卓手机升级系统后,突然感觉手机像蜗牛一样慢吞吞的,心里那个急啊!今天,就让...
无线麦克风安卓系统,轻松实现无... 你有没有想过,在一场热闹的K歌派对或者重要的演讲场合,无线麦克风简直就是救星啊!想象你手握麦克风,自...
怎么重新定制安卓系统,打造专属... 你有没有想过,你的安卓手机其实可以变得独一无二,就像是你自己的小宇宙一样?没错,就是重新定制安卓系统...