Java入门篇 之 多态

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

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

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

补充上条博客的知识点:

代码块的运行顺序

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是就可以强制转化,不是就不行

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

静态绑定:

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

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

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

希望对你们有所帮助

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch基础条件查询

条件查询 query:查询 match:匹配 match_all:匹配所有 #第一种 GET /shopping/_search?q名字:张三#第二种 GET /shopping/_search {"query": {"match": {"名字": "张三"}} }#全量查询 match_all G…

MIB 6.1810实验Xv6 and Unix utilities(5)find

难度:moderate Write a simple version of the UNIX find program for xv6: find all the files in a directory tree with a specific name. Your solution should be in the file user/find.c. 题目要求:实现find ,即在某个路径中,找出某…

Seaborn 回归(Regression)及矩阵(Matrix)绘图

Seaborn中的回归包括回归拟合曲线图以及回归误差图。Matrix图主要是热度图。 1. 回归及矩阵绘图API概述 seaborn中“回归”绘图函数共3个: lmplot(回归统计绘图):figure级regplot函数,绘图同regplot完全相同。(lm指lin…

动态sql行转列

动态sql行转列 介绍案例转之前转之后 注意 介绍 本篇介绍 根据 时间格式化后行转列的案例讲解动态sql案例的初学 案例 --设置一个动态变量 赋予初始值 SET sql NULL;--获取规范化后需要用到的行头列表 SELECT GROUP_CONCAT(CONCAT(--注意1MAX(IF(date ", date, "…

Prometheus+Grafana环境搭建(window)

PrometheusGrafana环境搭建 1:配置Prometheus 1.1: 下载Prometheus安装包 官方下载地址 找到对应的win版本进行下载并解压 1.2 下载Window数据采集 官方下载地址 下载以管理员运行,安装成功后在服务里会出现一个"windows_exporter"采集…

数据库Communications link failure

1.出现错误查询 Error querying , Communications link failure #Error querying database.Cause:com.mysql.cj.jdbc.exceptions.CommunicationsException:Communications link failure The last packet successfully received from the server was 10,016 milliseconds ago. …

LangChain 实现给动物取名字

mkdir langchain-llm-appcd langchain-llm-app # 用vscode 打开当前目录 code .在macOS上通过终端打开Visual Studio Code(VS Code),您可以按照以下步骤操作: 安装VS Code:首先,确保您已经在Mac上安装了Vis…

vulnhub靶场—matrix-breakout-2-morpheus靶机

一,实验环境 靶机ip:192.168.150.131攻击机ip:192.168.150.130 二,信息收集 arp-scan -l 扫描网段,寻找靶机ip 使用工具nmap进行端口扫描 nmap -A -T4 -p- 192.168.150.131 通过信息收集发现了靶机有80和81这两个…

23111709[含文档+PPT+源码等]计算机毕业设计基于Spring Boot智能无人仓库管理-进销存储

文章目录 **软件开发环境及开发工具:****功能介绍:****论文截图:****数据库:****实现:****代码片段:** 编程技术交流、源码分享、模板分享、网课教程 🐧裙:776871563 软件开发环境及…

主播职业发展指南

一、明确职业目标 1.确定长期目标:主播是一项充满挑战和机遇的工作,需要明确自己的长期职业目标。长期目标可以是成为一名知名的直播平台主播、成为一名电视节目主持人、成为一名网络红人等。2.制定短期目标:为了实现长期目标,需要制定短期目标。短期目…

基于协作mimo系统的RM编译码误码率matlab仿真,对比硬判决译码和软判决译码

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................... while(Err < TL…

Flat Ads将在杭州举办社交出海沙龙,探寻海外巨大增量空间

深圳站落幕后&#xff0c;Flat Ads社交沙龙活动迎来杭州站&#xff01;11月29日&#xff0c;Flat Ads联动Alibaba Cloud、TopOn、融云&#xff0c;开展《泛娱乐社交APP出海新风口-杭州站》&#xff0c;分享如何捕捉出海新赛道的风向标&#xff0c;并迅速实现获客增长&#xff0…

Unity——URP相机详解

2021版本URP项目下的相机&#xff0c;一般新建一个相机有如下组件 1:Render Type(渲染类型) 有Base和Overlay两种选项&#xff0c;默认是Base选项 Base:主相机使用该种渲染方式&#xff0c;负责渲染场景中的主要图形元素 Overlay&#xff08;叠加&#xff09;:使用了Oveylay的…

转变关键财务流程,实现企业数字化升级

随着世界经济环境的不断发展和变化&#xff0c;企业的运营状态也需要进行及时的优化和升级&#xff0c;从不太理想的执行状态朝着理想的价值创造状态转变。实际上&#xff0c;许多企业在财务职能方面都没有实现现代化的成熟效果&#xff0c;这意味着它们的财务规划周期更长&…

vmware17 虚拟机拷贝、备份、复制使用

可以在虚拟机运行的情况下进行拷贝 查看新安装的虚拟机位置 跳转到上一级目录 复制虚拟机 复制虚拟机整个目录 删除lck文件&#xff0c;不然开机的时候会报错 用vmware 打开新复制的虚拟机 lck文件全部删除 点击开机 开机成功

CSS特效013:背景色彩不停流动效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

CTF-PWN-堆- 【off-by-one】

文章目录 堆的off-by-one利用思路Asis CTF 2016 b00ks libc 2.31IDA源码main输入名字creat函数dele函数edit函数print函数reeditor name函数 思路exp思路 堆的off-by-one off-by-one指的是单字节缓冲区溢出&#xff08;off-by-one 是可以基于各种缓冲区的&#xff0c;比如栈、…

DataFrame.empty 与 DataFrame is None 的区别是?

请注意&#xff0c;empty 与 None 是不同的概念&#xff0c;这个要注意。不信我们试一下&#xff1a; import pandas as pddf pd.DataFrame()df ! df ! Nonedf.empty df is not None # 已经被赋值&#xff0c;为空但不为Nonea is None参考回答&#xff1a; DataFrame.empty…

windows Oracle Database 19c 卸载教程

目录 打开任务管理器 停止数据库服务 Universal Installer 卸载Oracle数据库程序 使用Oracle Installer卸载 删除注册表项 重新启动系统 打开任务管理器 ctrlShiftEsc可以快速打开任务管理器&#xff0c;找到oracle所有服务然后停止。 停止数据库服务 在开始卸载之前&a…

python趣味编程-5分钟实现一个Tic Tac Toe游戏(含源码、步骤讲解)

The Tic Tac Toe In Python是用 Python 编程语言编写的,这个Tic Tac Toe Game In Python是一个简单的基于 GUI 的策略游戏板,非常容易理解和使用。 所有的游戏规则都是一样的,就像我们玩实时井字棋一样,这是一个简单的多人游戏。 Python 中的 Tic Tac Toe 游戏:项目信息 …