您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

新手小白学JAVA 面向对象之多态

时间:2022-05-28 13:14:55  来源:  作者:XII点 Java

1. 概念

多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。

可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

比如,你的女盆友让你买点水果回来,不管买回来的是苹果还是西瓜,只要是水果就行,这个就是生活中多态的体现

再比如,小猫、小狗、小猪我们可以把他们都归纳成小动物,每种小动物都需要吃东西,所以我们可以统一设置他们都必须吃,但是每种小动物的习性不一样,那这个就可以设置成小动物自己特有的功能,多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一

2 . 特点

  1. 多态的前提1:是继承
  2. 多态的前提2:要有方法的重写
  3. 父类引用指向子类对象,如:Animal a = new Cat();
  4. 多态中,编译看左边,运行看右边
新手小白学JAVA 面向对象之多态

 

3. 练习:多态入门案例

创建包: cn.tedu.oop

创建类: TestDemo.JAVA

package cn.tedu.oop2;

/*本类用作多态的入门案例*/

public class TestDemo {

public static void mAIn(String[] args) {

//6.创建“纯纯的”对象用于测试

Animal a = new Animal();

Cat c = new Cat();

Dog d = new Dog();

a.eat();//小动物Animal吃啥都行~调用的是父类自己的功能

c.eat();//小猫爱吃小鱼干~调用的是子类重写后的功能

d.eat();//小狗爱吃肉骨头~调用的是子类重写后的功能

/*2.父类对象不可以使用子类的特有功能*/

//a.jump();//报错,Animal类里并没有这个方法

//a.run();//报错,Animal类里并没有这个方法

c.jump();//小猫Cat跳的老高啦~,子类可以调用自己的功能

d.run();//小狗Dog跑的老快啦~,子类可以调用自己的功能

//7.创建多态对象进行测试

/*3.口诀1:父类引用指向子类对象

* 解释:创建出来的子类对象的地址值,交给父类类型的引用类型变量来保存*/

Animal a2 = new Cat();//Cat类对象的地址值交给父类型变量a2来保存

Animal a3 = new Dog();//Dog类对象的地址值交给父类型变量a3来保存

//8.测试多态对象

/*4.口诀2:编译看左边,运行看右边

* 解释:必须要在父类定义这个方法,才能通过编译,把多态对象看作是父类类型

* 必须要在子类重写这个方法,才能满足多态,实际干活的是子类*/

a2.eat();//小猫爱吃小鱼干~,多态对象使用的是父类的定义,子类的方法体

}

}

/*1.多态的前提:继承+重写*/

//1.创建父类

class Animal{

//3.创建父类的普通方法

public void eat(){

System.out.println("小动物Animal吃啥都行~");

}

}

//2.1创建子类1

class Cat extends Animal{

//4.1添加重写的方法

public void eat(){

System.out.println("小猫爱吃小鱼干~");

}

//5.1添加子类的特有功能

public void jump(){

System.out.println("小猫Cat跳的老高啦~");

}

}

//2.2创建子类2

class Dog extends Animal{

//4.2添加重写的方法

@Override

public void eat(){

System.out.println("小狗爱吃肉骨头~");

}

//5.2添加子类的特有功能

public void run(){

System.out.println("小狗Dog跑的老快啦~");

}

}

4. 多态的好处

多态可以让我们不用关心某个对象到底具体是什么类型,就可以使用该对象的某些方法

提高了程序的可扩展性和可维护性

5. 多态的使用

前提:多态对象把自己看做是父类类型

  1. 成员变量: 使用的是父类的
  2. 成员方法: 由于存在重写现象,所以使用的是子类的
  3. 静态成员: 随着类的加载而加载,谁调用就返回谁的

6. 练习:多态成员使用测试

创建包: cn.tedu.oop

创建类: TestDemo2.java

package cn.tedu.oop2;

/*本类用于测试多态成员的使用情况*/

public class TestDemo2 {

public static void main(String[] args) {

//7.创建纯纯的子类对象

Dog2 d = new Dog2();

System.out.println(d.sum);//20,子类自己的属性

d.eat();//小狗爱吃肉包子,子类自己的方法

//8.创建多态对象

/*口诀1:父类引用指向子类对象*/

/*口诀2:编译(保存)看左边,运行(效果)看右边*/

Animal2 a = new Dog2();

/*多态中,成员变量使用的是父类的*/

System.out.println(a.sum);//10

/*多态中,方法的声明使用的是父类的,方法体使用的是子类的*/

a.eat();//小狗爱吃肉包子

/*多态中,调用的静态方法是父类的,因为多态对象把自己看作是父类类型

* 直接使用父类中的静态资源*/

a.play();//没有提示,玩啥都行~

Animal2.play();

}

}

//1.创建父类

class Animal2{

//3.创建父类的成员变量

int sum = 10;

//4.创建父类的普通方法

public void eat(){

System.out.println("吃啥都行~");

}

//9.1定义父类的静态方法play

public static void play(){

System.out.println("玩啥都行~");

}

}

//2.创建子类

class Dog2 extends Animal2{

//5.定义子类的成员变量

int sum = 20;

//6.重写父类的方法

@Override

public void eat(){

System.out.println("小狗爱吃肉包子");

}

//9.2创建子类的静态方法play

//@Override

/*这不是一个重写的方法,只是恰巧在两个类中出现了一模一样的两个静态方法

* 静态方法属于类资源,只有一份,不存在重写的现象

* 在哪个类里定义,就作为哪个类的资源使用*/

public static void play(){

System.out.println("小狗喜欢玩皮球~");

}

}

7 拓展

7.1 设计汽车综合案例

创建包: cn.tedu.oopexec

创建类: DesignCar.java

package cn.tedu.oop2;

/*本类用于完成汽车设计案例*/

public class DesignCar {

public static void main(String[] args) {

//9.创建一个纯纯的父类对象进行测试

Car c = new Car();

System.out.println(c.getColor());//null

c.start();

c.stop();

//c.swim();//报错,父类对象不可以调用子类的特有功能

 

//10.创建纯纯的子类对象做测试

BMW b = new BMW();

System.out.println(b.color);//五彩斑斓的黑

System.out.println(b.getColor());//null

b.start();//都让开,我的车要起飞啦~

b.stop();//唉呀妈呀熄火了~

//11.创建多态对象进行测试

Car c2 = new TSL();

//System.out.println(c2.color);

System.out.println(c2.getColor());

c2.stop();

c2.start();

//c2.swim();

}

}

//1.通过分析,抽象形成一个汽车类

class Car{

//2.定义并封装汽车类的属性--成员变量

private String brand;//品牌

private String color;//颜色

private int id;//编号

private double price;//价格

//3.定义功能

public void start(){

System.out.println("我的小车车启动啦~");

}

public void stop(){

System.out.println("唉呀妈呀熄火了~");

}

public String getBrand() {

return brand;

}

public void setBrand(String brand) {

this.brand = brand;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public double getPrice() {

return price;

}

public void setPrice(double price) {

this.price = price;

}

}

//4.创建子类

class BMW extends Car{

String color = "五彩斑斓的黑";

//5.重写父类的方法

@Override

public void start(){

System.out.println("都让开,我的车要起飞啦~");

}

}

//6.创建子类2

class TSL extends Car{

//7.重写父类的方法

@Override

public void stop(){

System.out.println("唉呀妈,怎么停不下来呢");

}

//8.添加子类的特有功能

public void swim(){

System.out.println("没想到吧,我还是个潜水艇");

}

}

7.2 多态为了统一调用标准

package cn.tedu.oop2;

public class TestFruit {

public static void main(String[] args) {

Fruit f = new Fruit();

Apple a = new Apple();

Orange o = new Orange();

get(f);

get(a);

get(o);

}

//只需要创建一个方法,就可以执行截然不同的效果

//忽略子类对象的差异统一看作父类类型

public static void get(Fruit f){

f.clean();

}

}

class Fruit{

public void clean(){

System.out.println("水果要洗洗再吃");

}

}

class Apple extends Fruit{

@Override

public void clean(){

System.out.println("苹果需要削皮");

}

}

class Orange extends Fruit{

@Override

public void clean(){

System.out.println("橙子需要剥皮");

}

}

7.3 静态变量和实例变量的区别

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

7.4 向上转型和向下转型

在JAVA中,继承是一个重要的特征,通过extends关键字,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。

那么在这个过程中就存在着多态的应用。存在着两种转型方式,分别是:向上转型和向下转型。

向上转型:可以把不同的子类对象都当作父类来看,进而屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,统一调用标准。

比如:父类Parent,子类Child

父类的引用指向子类对象:Parent p=new Child();

说明:向上转型时,子类对象当成父类对象,只能调用父类的功能,如果子类重写了父类中声明过的方法,方法体执行的就是子类重过后的功能。但是此时对象是把自己看做是父类类型的,所以其他资源使用的还是父类型的。

比如:花木兰替父从军,大家都把花木兰看做她爸,但是实际从军的是花木兰,而且,花木兰只能做她爸能做的事,在军营里是不可以化妆的。

向下转型(较少):子类的引用的指向子类对象,过程中必须要采取到强制转型。这个是之前向上造型过的子类对象仍然想执行子类的特有功能,所以需要重新恢复成子类对象

Parent p = new Child();//向上转型,此时,p是Parent类型

Child c = (Child)p;//此时,把Parent类型的p转成小类型Child

其实,相当于创建了一个子类对象一样,可以用父类的,也可以用自己的

说明:向下转型时,是为了方便使用子类的特殊方法,也就是说当子类方法做了功能拓展,就可以直接使用子类功能。

比如:花木兰打仗结束,就不需要再看做是她爸了,就可以”对镜贴花黄”了



Tags:面向对象   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
C++的面向对象编程:深入解析与理解
当我们谈论C++时,面向对象编程(OOP)是一个无法回避的话题。那么,C++的面向对象究竟是什么?为什么它如此重要?本文将从基本概念到实际应用,为您详细解析C++中的面向对象编程。一、面...【详细内容】
2024-01-03  Search: 面向对象  点击:(106)  评论:(0)  加入收藏
谈谈面向过程、面向对象、面向切面三种编程思维
面向过程、面向对象、面向切面是三种不同的编程思维,它们有各自的特点、优缺点和应用场景。下面简单介绍一下:面向过程(Procedure Oriented Programming):是一种以事件为中心的编...【详细内容】
2023-11-30  Search: 面向对象  点击:(201)  评论:(0)  加入收藏
深入了解Python类与面向对象编程
在编程世界中,面向对象编程(OOP)是一种强大的编程范式,而Python是一门优雅而强大的编程语言。本文将带你深入探讨Python中的类与面向对象,为你揭示面向对象编程的奇妙世界。类与...【详细内容】
2023-10-13  Search: 面向对象  点击:(244)  评论:(0)  加入收藏
Python面向对象详解
下面从这几个方面来详细详解python面向对象: 初识对象 成员方法 类和对象 构造方法 其它内置方法 封装 继承 类型注解 多态 综合案例一、初识对象生活中数据的组织 学校开学...【详细内容】
2022-12-29  Search: 面向对象  点击:(349)  评论:(0)  加入收藏
C风格的面向对象,以及scf编译器框架对它的支持
C风格的面向对象设计,是从Linux内核代码流行开的一种设计模式。C++并不适合编写系统内核代码,但内核里的很多模块又非常的OOP[呲牙]所以Linux之父就想出了这么一套C风格的OOP,...【详细内容】
2022-09-25  Search: 面向对象  点击:(681)  评论:(0)  加入收藏
面向对象的SOLID五大原则
前序做C语言开发的应该都知道,C是面向过程开发的,而c++是面向对象开发的。而封装、继承与多态是面向对象开发的三大特征。但你可能不知道OOD(Object-Oriented Design)还有五大...【详细内容】
2022-07-29  Search: 面向对象  点击:(438)  评论:(0)  加入收藏
ch15、面向对象编程-行为的定义和实现
Is Go an object-oriented language?Yes and no. Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy....【详细内容】
2022-07-27  Search: 面向对象  点击:(498)  评论:(0)  加入收藏
用面向对象的方式操作 JSON 甚至还能做四则运算 JSON 库
前言在之前实现的 JSON 解析器中当时只实现了将一个 JSON 字符串转换为一个 JSONObject,并没有将其映射为一个具体的 struct;如果想要获取值就需要先做断言将其转换为 map 或...【详细内容】
2022-07-05  Search: 面向对象  点击:(378)  评论:(0)  加入收藏
什么是面向对象编程?终于懂了
面向对象的编程(Object-Oriented Programming ,OOP),每当看到这个术语,我们就会把它与Java联系起来。事实上,Java普及了面向对象的编程风格,除了Java之外,还有很多OOP语言,例如,C++、C...【详细内容】
2022-06-15  Search: 面向对象  点击:(312)  评论:(0)  加入收藏
新手小白学JAVA 面向对象之多态
1. 概念多态是面向对象程序设计(OOP)的一个重要特征,指同一个实体同时具有多种形式,即同一个对象,在不同时刻,代表的对象不一样,指的是对象的多种形态。可以把不同的子类对象都当作...【详细内容】
2022-05-28  Search: 面向对象  点击:(342)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(18)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(25)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(34)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(63)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(78)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(78)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(99)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(111)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(108)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(82)  评论:(0)  加入收藏
站内最新
站内热门
站内头条