黑马Java零基础视频教程精华部分_10_面向对象进阶(2)

news2024/9/22 1:29:39

系列文章目录


文章目录

  • 系列文章目录
  • 一、多态
    • 1、什么是多态?
    • 2、多态的表现形式
    • 3、多态的前提
    • 4、多态的好处
    • 5、多态调用成员的特点
    • 6、多态的优势和弊端
    • 7、引用数据类型的类型转换
  • 二、包
    • 1、什么是包?
    • 2、包名的规则
    • 3、使用其他类的规则
  • 三、final 最终的,不可变的
  • 四、权限修饰符
    • 1、权限修饰符分类
    • 2、权限修饰符的使用规则
  • 五、代码块
    • 1、局部代码块:提前结束变量的生命周期
    • 2、构造代码块:创建本类对象时优先于构造方法执行,可以把多个构造方法中重复的地方放在构造代码块中。
    • 3、静态代码块


一、多态

1、什么是多态?

同类型的对象,表现出不同的形态。

2、多态的表现形式

在这里插入图片描述

3、多态的前提

  1. 有继承/实现关系
  2. 有父类引用指向子类对象
  3. 有方法重写

4、多态的好处

使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。
多态示例,如下图所示:学生,老师,管理员三各类都是Person的子类
在这里插入图片描述

5、多态调用成员的特点

变量调用:编译看左边,运行也看左边。
方法调用:编译看左边,运行看右边。
代码示例如下所示,注意看注释:

public class Test {
    public static void main(String[] args) {
        //创建对象(多态方式)
        //Fu f = new Zi();
        Animal a = new Dog();
        //调用成员变量:编译看左边,运行也看左边
        //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个变量,如果有,编译成功,如果没有编译失败。
        //运行也看左边:java运行代码的时候,实际获取的就是左边父类中成员变量的值
        System.out.println(a.name);//动物

        //调用成员方法:编译看左边,运行看右边
        //编译看左边:javac编译代码的时候,会看左边的父类中有没有这个方法,如果有,编译成功,如果没有编译失败。
        //运行看右边:java运行代码的时候,实际上运行的是子类中的方法。
        a.show();///输出“Dog --- show方法”

        //理解:
        //Animal a = new Dog();
        //现在用a去调用变量和方法的呀?是的
        //而a是Animal类型的,所以默认都会从Animal这个类中去找
        //成员变量:在子类的对象中,会把父类的成员变量也继承下来。父:name  子:name
        //成员方法:如果子类对方法进行了重写,那么在虚方法表中是会把父类的方法进行覆盖的。
    }
}


class Animal{
    String name = "动物";

   public void show(){
        System.out.println("Animal --- show方法");
    }
}

class Dog extends Animal{
    String name = "狗";

    @Override
    public void show() {
        System.out.println("Dog --- show方法");
    }

}

class Cat extends Animal{
    String name = "猫";

   @Override
    public void show() {
        System.out.println("Cat --- show方法");
    }
}

内存图示意如下:为什么是左边或者右边是固定的,此图只是帮助理解记忆。在一个类存在父类时,在方法区都是先加载父类的字节码文件,再加载子类的字节码文件(.class文件)。所谓看左边就是在定义时(Animal a = new Dog())看a的左边是哪个类,然后找该类中是否存在或者使用其成员变量或者方法,编译时就是看有没有其成员变量或者方法,而运行时就是使用其成员变量或者方法。
在这里插入图片描述

6、多态的优势和弊端

优势:方法中,使用父类型作为参数,可以接收所有子类对象
弊端:不能使用子类的特有功能,此时需要使用强制类型转换,代码如下所示,注意理解注释:

public class Test {
    public static void main(String[] args) {
        //创建对象
        Animal a = new Dog();
        //编译看左边,运行看右边
        a.eat();

        //多态的弊端
        //不能调用子类的特有功能
        //报错的原因?
        //当调用成员方法的时候,编译看左边,运行看右边
        //那么在编译的时候会先检查左边的父类中有没有这个方法,如果没有直接报错。
        //a.lookHome();


        //解决方案:
        //变回子类类型就可以了
        //细节:转换的时候不能瞎转,如果转成其他类的类型,就会报错
        //Cat c = (Cat) a;
        //c.catchMouse();

        /*if(a instanceof Dog){
            Dog d = (Dog) a;
            d.lookHome();
        }else if(a instanceof Cat){
            Cat c = (Cat) a;
            c.catchMouse();
        }else{
            System.out.println("没有这个类型,无法转换");
        }*/

        //新特性
        //先判断a是否为Dog类型,如果是,则强转成Dog类型,转换之后变量名为d
        //如果不是,则不强转,结果直接是false
        if(a instanceof Dog d){
            d.lookHome();
        }else if(a instanceof Cat c){
            c.catchMouse();
        }else{
            System.out.println("没有这个类型,无法转换");
        }

    }
}

class Animal{
    public void eat(){
        System.out.println("动物在吃东西");
    }
}

class Dog extends Animal{
    @Override
    public void eat() {
        System.out.println("狗吃骨头");
    }

    public void lookHome(){
        System.out.println("狗看家");
    }
}

class Cat extends Animal{
    @Override
    public void eat() {
        System.out.println("猫吃小鱼干");
    }

    public void catchMouse(){
        System.out.println("猫抓老鼠");
    }
}

7、引用数据类型的类型转换

对于引用数据类型,在父类和子类的继承层次关系中,沿着子类向父类转换是向上转型,是自动转换的;沿着父类向子类转型是向下转型,必须使用强制类型转换。

二、包

1、什么是包?

包就是文件夹。用来管理各种不同功能的Iava类,方便后期代码维护。

2、包名的规则

公司域名反写+包的作用需要全部英文小写,见名知意。com.itheima.domain就是放一些实体类。比如com.itheima.domain.Student这才是类真正的名。
在这里插入图片描述
上图可以用导包简化如下所示:
在这里插入图片描述

3、使用其他类的规则

  1. 使用同一个包中的类时,不需要导包。
  2. 使用包中的类时,不需要导包。
  3. java.lang 其他情况都需要导包
  4. 如果同时使用两个包中的同名类,需要用全类名

三、final 最终的,不可变的

1.final修饰方法:最终方法,不能被重写
2.final修饰类:最终类,不能被继承
3.final修饰变量:是常量,不能被修改。基本数据类型:变量的值不能修改引用数据类型:地址值不能修改,内部的属性值可以修改。
final使用示例如下:增加代码可阅读性。
在这里插入图片描述

四、权限修饰符

权限修饰符:是用来控制一个成员能够被访问的范围的。
可以修饰成员变量,方法,构造方法,内部类,

1、权限修饰符分类

如下图所示,打对号表示可以使用。
在这里插入图片描述
其中同一个包中的其他类和不同包下的无关类的意思是要创建一个对象,然后用它来调用权限修饰符修饰的变量或者方法。

2、权限修饰符的使用规则

实际开发中,一般只用private和public。成员变量私有方法公开。特例:如果方法中的代码是抽取其他方法中共性代码,这个方法一般也私有。

五、代码块

1、局部代码块:提前结束变量的生命周期

在这里插入图片描述

2、构造代码块:创建本类对象时优先于构造方法执行,可以把多个构造方法中重复的地方放在构造代码块中。

在这里插入图片描述
缺点:不够灵活,我有时候不想运行构造代码块中的代码,但无法让构造代码块不执行。比如有三个构造函数,其中只有两个我想执行构造代码块中的内容,这种情况我们不能在设置构造代码块,因为那样三个构造函数一定都会使得构造代码块被执行,我们需要如下图所示,我们把重复的语句不再放在构造代码块中,而是放在一个构造函数中,当调用其他构造函数创建对象时,我们通过构造函数调用其他包含重复代码的构造函数即可。
在这里插入图片描述

3、静态代码块

格式:static{}
特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发只执行一次,也就是你创建多余一个对象只会执行一次(也就是内存中只会有一份,避免了被多次调用时候,存多份相同数据在内存中,占用内存的漏洞)。如下图所示。
作用:

  1. 初始化静态变量:‌静态代码块可以用于初始化类中的静态变量。‌在类加载时,‌静态代码块执行,‌可以对静态变量进行赋初值操作。‌
  2. 执行一次性初始化操作:‌静态代码块在类加载时只执行一次,‌因此非常适合执行一次性的初始化操作,‌如读取配置文件、‌建立数据库连接等。‌
  3. 预加载资源:‌静态代码块可以在类加载时预加载一些资源,‌如常用的数据,‌以提高程序的性能。‌

在这里插入图片描述

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

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

相关文章

文件包含漏洞Tomato靶机渗透_详解

一、导入靶机 将下载好的靶机拖入到VMware中,填写靶机机名称(随便起一个)和路径 虚拟机设置里修改网络状态为NAT模式 二、信息收集 1、主机发现 用御剑扫描工具扫描虚拟机的NAT网段,发现靶机的IP是192.168.204.141 2、端口扫描 用御剑端口扫描扫描全…

完全免费的 TTS 文字转语音来了!

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 完全免费的 TTS 文字转语音来了! 再也不用被国内外各种语音合成割韭菜了。 试了下,确实是不限次数,不限语种,完全免费.输出视频如下: 效果就…

springboot干部考核系统-计算机毕业设计源码74229

摘要 随着我国社会经济的快速发展,对干部队伍的素质要求越来越高,如何科学、公正、准确地评价干部的工作绩效,激励干部发挥出更大的工作潜能,成为了当务之急。近年来,计算机技术和网络技术的飞速发展,为干部…

Minetest大师:1.0.21版本发布

下载Minetest大师v1.0.21 1、简介 Minetest大师,一款致力于Minetest的游戏盒子 可加Q群-:123117246,了解或获取最新版本 2、增加了大量的基础功能 资源中心与ContentDB同步,增加资源搜索、安装功能 增加在线服务器列表&#…

Python 爬虫入门(五):使用 lxml 解析网页

Python 爬虫入门(五):使用 lxml 解析网页 前言1. lxml 简介1.1 什么是 lxml?1.2 为什么选择 lxml?1.3 安装 lxml 2. lxml 基础2.1 解析 HTML/XML2.2 XPath 表达式2.3 使用 XPath 提取数据 3. 深入解析3.1 处理命名空间…

HarmonyOS应用开发者高级认证题目(7月新版,答案解析,持续更新)

HarmonyOS应用开发者高级认证题目(7月新版,答案&解析,持续更新) 单选 1.ArkTS支持以下哪些函数 A.Object.getOwnPropertySymbols(); B.Object.isExtensible(); C.Object.isPrototypeOf(); D.Object.keys(); 答案&#xff1…

《数据结构》(C语言版)第1章 绪论(下)

第1章 绪论 1.3 抽象数据类型的表示与实现1.4 算法与算法分析 1.3 抽象数据类型的表示与实现 数据类型 数据类型是一组性质相同的值的集合, 以及定义于这个集合上的一组运算的总称。 抽象数据类型(ADTs: Abstract Data Types) 更高层次的数据抽象。由用户定义,用…

反贿赂体系认证:企业诚信经营的护航者

在当今商业环境中,企业不仅要追求经济效益,更要坚守诚信经营的原则。反贿赂体系认证作为现代企业合规管理的重要手段,不仅提升了企业的道德形象,还为其市场竞争力注入了强劲动力。以下是反贿赂体系认证对企业的多方面益处。 首先&…

SpringBoot集成RocketMQ消息队列

RocketMQ简介 RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域&#xff0c…

AUTOSAR实战教程-最通俗的讲标定协议XCP初入门

XCP是什么 XCP是什么?我们开发过程中是不是经常用串口打印出一些变量的值供自己发现问题? XCP的作用1 跟上述串口看数据类似,只不过用一组更为严格的格式规定基于CAN/ETH/FLR进行数据的观测。 XCP作用2 比串口打印数据更强大的是,XCP可以通过变量地址对变量值进行改写!…

使用 Stripe 订阅和 Firestore 集成构建大型 Streamlit 应用程序

将创意转化为软件产品的能力是一项值得学习的技能。在这篇博客中,我将描述需要做些什么,以及如何将各个部分组合在一起以创建一款无需启动成本但具有订阅模式和 Firestore 集成的软件产品。 欢迎来到雲闪世界。 无论您是数据科学家、数据工程师还是从事其…

EasyAR_稠密空间图

EasyAR稠密空间图 1.稠密空间图 EasyAR稠密空间地图利用RGB相机图像对周围环境进行三维稠密重建,得到稠密的点云地图和网格地图。利用稠密空间地图让虚拟物体更好的融入真实环境之中,用以实现真实物体和虚拟物体正确遮挡、碰撞等AR应用。 2.在Unity中的…

深度学习入门——卷积神经网络

本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于深度学习的方法几乎都以CNN为基础。本章将详细介绍CNN的结构,并用Python实…

从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

Polars 与 matplotlib 配合得很好。 在matplotlib中,你可以直接使用polars的数据进行绘制图形,而无需把polars的dataframe转为pandas的dataframe: import polars as pl import matplotlib.pyplot as plt# 创建一个polars DataFrame df_pl …

5 道互联网大厂面试遇到的场景题

1.外卖单子只能被一个骑手接单 这是一个典型的分布式锁问题。可以采用以下几种方案: 基于Redis的分布式锁: 使用Redis的SETNX命令尝试获取锁设置合理的锁超时时间,防止死锁使用Lua脚本保证原子性操作考虑Redis集群环境下的一致性问题 基于Zookeeper的分布式锁: 创建临时顺…

openEuler系统合并home分区到root分区

为了支持国产系统底座,不受美帝卡脖子,加入openEuler,想把业务全部移植到openEuler系统上。在使用默认安装的情况下,会把home分区单独分配一个出来,为了方便,还是想合并到/根目录上。怎么做呢?发…

2023年码蹄杯专科组第三场初赛 解题报告 | 珂学家

前言 题解 这是2023年第三场码蹄杯职业院校算法比赛,3D眩晕(字符串hash)挺有意思的。 这个系列赛,喜欢出典题。 3D眩晕 难度: 钻石 思路: 字符串hash 这题难在容错性上,就是允许有x次修改( x ≤ 3 x \le 3 x≤3)&…

NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)

模式定理(Schema Theorem) 模式定理(Schema Theorem)是遗传算法(Genetic Algorithm, GA)的重要理论基础,由约翰霍兰德(John Holland)在1975年提出。它描述了具有特定模式…

【机器学习】回归类算法-相关性分析

一、前言 前面的几篇博客我们学习了分类算法,今天我们来了解一下回归类的算法吧。首先我们来谈谈两者有什么区别,首先是我们在之前的分类算法,这类算法可以将让我们学会如何将不同的数据划分到不同的类里面,输出的是一些离散的值。…

新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop

《AI创意商业广告设计:Adobe Fire.yPhotoshop》 本书内容 随着AI技术的出现,平面设计领域也出现了利用人工智能进行创作的程序,比如Firefly、Midjourney、 Stable Di.usion等。这些程序能够创作出高质量的设计作品。其中,Fire.y是由Adobe公司…