【Java】面向对象之多态篇♥

简介: 一、前言二、什么是多态?三、多态的实现条件四、多态的访问特点 4.1为什么两个有区别呢?五、多态的优点和缺点?六、为什么要分开建包

一、前言


🥁前面我们了解和学习了继承的使用,现在我们来学习三大面向对象之一的多态。


多态使java面向对象丰富起来,所以学好多态十分重要。


二、什么是多态?


🥁这个问题其实是显然的,从字面上看,也是多种状态,其实没错,多态就是在


不同情况表现出来的不同状况,叫多态。


比方说我们可以说,🍉是水果,也可以说,🍉是🍉 ((华强买🍉🤭)


🐂是动物,也可以说,🐂是🐂(有人可能会问这是什么🐂🐎)


💸这里西瓜和牛有两种不同状态,这个就是多态。


三、多态的实现条件


🌤①有(继承/实现)关系


🌤②有方法重写


🌤③有(父类/接口)引用指向(子类/实现)对象


解读:💸①有(继承/实现)关系(说明这里有子类父类或者接口的实现)


        💸② 有方法的重写(重写抽象方法,或者重写父类中的方法)  


       💸 ③有(父类/接口)引用指向(子类/实现)对象(说明有父类/接口 对象名= new 子类/实现 )


四、多态的访问特点


🐟成员方法编译看左边,执行看右边


🐟成员变量编译看左边,执行看左边


解读:所谓编译看左边,就是在语法问题上,看new的左边(父类或者接口)


有没有此方法或者变量, 如果有则编译通过,反之则不通过


 ② 执行就是最终结果看,比如,在方法中执行时看右边就是看new的右边,


就是说 对象调用的时候,子类和父类都有此方法时,以子类中的方法为结果。


接口我们这篇未涉及到,所以这次我们用继承的方式类实现多态。


1.我们建一个service包放Animal类:


package service;
public class Animal {
    public String name="动物";
    public void eat(){
        System.out.println("动物吃东西");
    }
    public void sleep(){
        System.out.println("动物要💤");
    }
}

2.再servic包下建一个impl包,包下放Cat类。


因为我们要继承Animal类,而Animal在与之不再 同一个包所以需要导包(导包就是


告诉程序我要用的这个在哪里)


package service.impl;
import service.Animal;//导包
public class Cat extends Animal {
    public String name="猫";
    @Override
    public void eat() {//重写父类的方法
        System.out.println("🐱吃🐟");
    }
    public void play(){
        System.out.println("🐱玩毛球");
    }
}


3.我们在建一个controller包,在里面建一个动物测试类


import service.Animal;//导包
import service.impl.Cat;
public class AnimalController {
    public static void main(String[] args) {
           //多态创建对象
        Animal a=new Cat();//父类引用指子类对象
        a.eat();
        a.sleep();
        System.out.println("名字:"+a.name);
    }
}


4.弄完之后我们程序一运行之后如图:


微信图片_20220105185217.png


看结果,可以知道,方法的编译看做左边,执行看右边,成员的编译看做左边,


执行看左边也就是,在方法中,以子类方法为主,在变量上,以父类的变量为主。


当父类有该方法,而子类没有该方法时,此时,结果时父类的方法。


4.1为什么两个有区别呢?


其实主要的原因时方法有重写,而成员变量则没重写(变量不能重写)


五、多态的优点和缺点?


🗡多态的优点:是提高了扩展性,子类可以在父类的基础上进行扩展。


🗡 多态的缺点:就是不能访问子类的中的成员变量和成员方法。


解决方法:后期涉及


其实只要通过继承,实现时,子类所含有的方法是最多的,此时我们通过子类


创建对象,就可以访问所有成员(非子类的私有成员除外)如图:


import service.Animal;
import service.impl.Cat;
public class AnimalController {
    public static void main(String[] args) {
        Cat c=new Cat();//通过子类创建对象
        c.eat();
        c.sleep();
        c.play();
        System.out.println("名字:"+c.name);
    }
}


微信图片_20220105185316.png


六、为什么要分开建包


🗡有人不解,在同一个包下建就不用导包了,就没那么麻烦了,确实这话一点问题


都没有,但是我们要养成这种开建包的好习惯,以便于在代码很多的时候,便于


排查错误。因为写代码向来都是写时一时爽,找bug时满脸苦。为了防止这种情况


我们要养成分开建包的好习惯。


目录
相关文章
|
2月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
138 1
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
111 0
|
3月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
4月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
6月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
164 0
|
8月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
7月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
302 0
|
10月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
533 15
|
11月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
130 1
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
123 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
下一篇
oss云网关配置