Java入门篇 之 多态

news2024/12/23 14:36:44

本篇碎碎念:个人认为,一切都不是不学习的理由,在如今这个"内卷"的时代,唯有认真学习,掌握知识,才能把握命运

今日份励志文案:你必须拼尽全力,才有资格说运气不好

加油吧,少年,胜利的曙光就在前方!!!

补充上条博客的知识点:

代码块的运行顺序

1、父类静态代码块优先于子类静态代码块执行,且是最早执行

2、父类实例代码块和父类构造方法紧接着执行

3、子类的实例代码块和子类构造方法紧接着再执行

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行(也就是说静态代码块只执行一次

代码举例如下:


class A{
    public String name;
    public int age;
    public A(String name,int age){
        this.age=age;
        this.name=name;
        System.out.println("父类中的构造方法");

    }
    static{
        System.out.println("父类中的静态代码");
    }
    {
        System.out.println("父类中的实例代码块");
    }
}
class B extends A{
    public String color;
    public B(String name,int age,String color){
        super(name,age);
        this.color=color;
        System.out.println("子类中的构造方法");
        System.out.println("name :"+name+",age:"+age+",color:"+color);
    }
    static{
        System.out.println("子类中的静态代码");
    }
    {
        System.out.println("子类中的实例代码块");
    }
}



//main函数下的代码

    public static void main(String[] args){
        B b=new B("小红",3,"红色");
    }

public static void main(String[] args){
        B b=new B("小红",3,"红色");
        B b1=new B("小绿",4,"绿色");
    }


补上章缺失的知识点

多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特征

多态不但能改善代码的组织结构和可读性,还能够创建可扩展的程序----即无论在项目最初创建时函数在需要添加新功能时都可以"生长"的程序

多态的作用是消除类型之间的耦合关系;只要他们都是从同一基类导出而来的,多态方法调用允许一种类型表现出与其他相似类型之间的区别,这种区别是根据方法行为的不同而表示出来的,虽然这些方法都可以通过一个基类来调用

总的来说,多态就是一个对象在不同条件下的表现出的不同形式1.1向上转型

把子类对象叠给父类(父类是引用,引用了子类对象),从小范围向大范围的转换

博主个人理解:就是创建了一个子类对象,将其当成父亲对象来使用

父类类型  变量名 = new 子类类型();

例如父类是Animal,子类是Dog,

Animal animal=new Dog ()(本质还是Animal,只能调用Animal特有的)

向上转型的三种方式:

这个解释中创建了两个子类,一个是Dog,一个是Bird 

在下面理解多态时,是说两个子类中都有eat,两个eat的输出不一样,从而引出了多态的概念

同一个引用调用了同一个方法,但是因为引用的对象不一样,所表现的行为不一样

1.2.1直接赋值 

class Animal2{

    public String name;
    public int age;
    public Animal2(String name,int age){
        this.age=age;
        this.name=name;
    }

    public void print1(){
        System.out.println("父类中的狗狗名字叫:"+this.name+
                ",狗狗"+this.age+"岁");
    }
}
class Dog extends Animal2{

    public String color;
    public Dog(String name,int age,String color){
        super(name,age);
        this.color=color;
    }

    public void print(){
        System.out.println("狗狗名字叫:"+this.name+
                           ",狗狗"+this.age+"岁"+
                           ",狗狗是"+this.color);
    }
   
}


//main函数中的

public static void main(String[] args) {

        Dog dog = new Dog("小黑", 3, "黑色");
        dog.print();
        Animal2 animal = dog;
        animal.prubt1();
    }

 1.2.2通过传参


  public static void fun(Animal2 animal){
        animal.print1();
    }
    public static void main(String[] args) {
        Dog dog=new Dog("小花",2,"花色");
        fun(dog);

    }

1.2.3通过返回值,进行向上转型 

    public static Animal2 fun2(){
        return new Dog("小蓝",5,"蓝色");
    }
    public static void main(String[] args) {
        Animal2 animal2=fun2();
        animal2.print1();
    }
 

向上转型的优点:让代码实现更简单灵活

向上转型的缺陷:不能调用到子类特有的方法

重写:

方法重写的规则:

1.子类在重写父类的方法时,一般必须与父类方法原型一致:返回值类型方法名(参数列表)要完全一

2.被重写的方法返回值类型可以不同,但是必须是具有父子关系

3.访问权限不能比父类中被重写的方法的访问权限更低;例如:如果父类方法被public修饰,则子类中重写该方法就不能声明为protected

4.父类被static、private修饰的方法、构造方法都不能被重写

5.重写的方法,可以使用@Override注解来显式指定.有了这个注解能帮我们进行一些合法性校验.例如不小心将方法名字拼写错了(比如写成aet),那么此时编译器就会发现父类中没有aet方法,就会编译报错,提示无法构成重写.

注意:不可以重写父类中的对象

finnal关键字:

    3.Final还可以修饰方法(代表该方法不能重写)

//在子类中添加的
 @Override
    public void print1() {
        System.out.println("重写后父类中的狗狗名字叫:"+this.name+
                            "狗狗"+this.age);
    }



//main函数中

  public static void main(String[] args) {
        Animal2 dog = new Dog("小黑", 3, "黑色");
        dog.print1();
    }

 c

重写的快捷键

右键子类变量名选择Generate,选择Override Methods,然后选择想要重写的内容即可

重写和重载的区别:

重载:指同一个类中定义多个方法之间的关系

方法重载是一个类的多态性表现

方法重写是子类与父类的一种多态性表现

向下转型

向下转型: 将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法

但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即可向下转换

instanceof是一个关键字,这个引用是不是引用了这个XXX

例如animal1  instanceof  Bird

animal1是不是引用了Bird是就可以强制转化,不是就不行

拓展:动态绑定和静态绑定

静态绑定:

也称为前期绑定(早绑定),即在编译时,根据用户所传递实参类型就确定了具体调用那个方法。典型代表函数重载。
动态绑定:

也称为后期绑定(晚绑定),即在编译时,不能确定方法的行为,需要等到程序运行时,才能够确定具体调用那个类的方法。

如果有解释的不对或者不清晰,如果可以从评论区指出,我一定会加以修改,万分感谢

希望对你们有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1220507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务学习 | Eureka注册中心

微服务远程调用 在order-service的OrderApplication中注册RestTemplate 在查询订单信息时,需要同时返回订单用户的信息,但是由于微服务的关系,用户信息需要在用户的微服务中去查询,故需要用到上面的RestTemplate来让订单的这个微…

C语言之break continue详解

C语言之break continue 文章目录 C语言之break continue1. break 和 continue2. while语句中的break和continue2.1break和continue举例 3. for语句中的break和continue3.1break和continue举例 1. break 和 continue 循环中break和continue 在循环语句中,如果我达到…

软件开发和测试

一,敏捷软件开发 二,软件测试

【C++】多线程的学习笔记(3)——白话文版(bushi

前言 好久没有继续写博客了,原因就是去沉淀了一下偷懒了一下 现在在学网络编程,c的多线程也还在学 这一变博客就讲讲c中的Condition Variable库吧 Condition Variable的简介 官方原文解释 翻译就是 条件变量是一个对象,它能够阻止调用…

微电影分销付费短剧小程序开发

微电影系统分销管理付费软件是一款面向微电影制作公司和影视产业的付费软件,它的出现旨在帮助微电影制作公司和影视产业实现分销管理,提高产业的效率和竞争力。本文将介绍微电影系统分销管理付费软件的背景、特点和开发方法。 一、背景 微电影作…

苍穹外卖项目笔记(2)

1 Nginx 反向代理和负载均衡 1.1 概念 【Tips】可以看到前端请求地址和后端接口地址并不匹配,这里涉及到 nginx 反向代理 ,就是将前端发送的动态请求由 nginx 转发到后端服务器 使用 nginx 作反向代理的好处: 提高访问速度(在请…

腾讯云服务器新用户购买优惠多少钱?腾讯云新用户优惠信息来了!

腾讯云服务器新用户购买优惠多少钱?这是每个新手上路的人都会问到的问题。 如果你是一个刚刚接触云服务器的小白用户,不知道该如何选择合适的云服务器,那么你就来对了地方。今天我们将向你介绍腾讯云服务器新用户购买优惠活动,让…

结构体数组保存进二进制文件的简单做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近面临这样一个需求:以比较节省存储空间的存储一组坐标点到文件,要求程序能够跨平台读写这种文件。思考了一下,比较…

2023年北京市安全员-A证证模拟考试题库及北京市安全员-A证理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年北京市安全员-A证证模拟考试题库及北京市安全员-A证理论考试试题是由安全生产模拟考试一点通提供,北京市安全员-A证证模拟考试题库是根据北京市安全员-A证最新版教材,北京市安全员-A证大…

Linux基本指令及周边(第一弹)

文章目录 前言mkdir指令(重要):tree指令rmdir指令 && rm 指令(重要):touch指令ls指令pwd指令cd 指令用户家目录man指令(重要):mv指令(重要)cat指令绝…

腾讯云服务器秒杀什么时候开始?腾讯云服务器秒杀时间

腾讯云服务器秒杀什么时候开始呢?我们一起来揭晓答案! 腾讯云服务器秒杀活动即日起至2023-11-30 23:59:59,每日0点限量秒杀。这意味着,每一天的开始,你都有机会抢到心仪的服务器。秒杀活动入口:https://te…

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后,我们通过swagger knife4j可以生成一个接口文档,后端启动以后,可以生成一个接口文档,当输入地址 localhost:8101/api/v3/api-docs (这…

image图片之间的间隙消除

多个图片排列展示,水平和垂直方向的间隔如何消除 垂直方向 vertical-align 原因: vertical-align属性主要用于改变行内元素的对齐方式,行内元素默认垂直对齐方式是基线对齐(baseline) 这是因为图片属于行内元素&…

CFI(Common Flash Interface)简介

CFI定义了符合CFI规则设备的基本Query接口,包括已知或待拟定的flash Read/Write/Program/Erase控制接口。Query接口以结构体形式定义与flash设备相关的关键参数,但是CFI不会对单个flash设备厂家指定详细的指令集、状态轮询模式以及软件算法。 1.操作概要…

业务流程图用什么软件画?这10款流程图软件,好用到飞起!

业务流程图是什么? 业务流程图是一种用于表示业务过程中活动流向的图形表示方法,它使用标准化的图形元素(如箭头、椭圆、方框等)来表达一个过程中各个环节之间的关系。在这个图形表示中,每个元素都有特定的含义和功能…

【华为OD机试高分必刷题目】神奇的卡片(C++等差数列实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试高分必刷题目】神奇的卡片(C等差数列实现&a…

代码随想录算法训练营第二十五天| 216 组合总合 ||| 17 电话号码的字母组合

216 组合总和 ||| 暴力 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>newList new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {soluHelper(1,k,n,0);return res;}pr…

如何使用ONLYOFFICE来P惊悚特效图

如何使用ONLYOFFICE来P惊悚特效图 老朋友们可能会经常看见本号主又换头像了&#xff0c;各种各样精神分裂成一群人或者我和自己俩个人的头像&#xff0c;之前讲过的&#xff1a; 手把手教你如何自己一个人精神分裂成一群人https://mp.weixin.qq.com/s/yacKt7N3sZnarfMhXRNdBA…

Kafka 集群实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

Docker在Centos7下的安装

1、卸载旧版本 执行如下指令对旧版本进行卸载&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 执行完毕后&#xff0c;如果输入docker version发现do…