黑马Java零基础视频教程精华部分_10_面向对象进阶(2)_多态、包、final、权限修饰符、代码块

news2025/1/22 18:47:09

系列文章目录


文章目录

  • 系列文章目录
  • 一、多态
    • 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/1978285.html

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

相关文章

通过指令深入了解Linux

1.简单介绍XShell 未来我的所有关于Linux的讲解都是提供XShell登入远程的Linux云服务器来教学的,且以centos为例。 1.1下载安装XShell xshell 下载安装时选择“home/school”为免费版本。 1.2 使用XShell登录主机 在XShell终端输入 ssh rootip ip为你所购买的…

功能实现——使用 RestTemplate 进行跨项目接口调用

目录 1.需求说明2.项目环境搭建3.代码实现3.1.使用 RestTemplate 进行调用3.1.1.项目 A3.1.2.项目 B 3.2.测试3.3.使用 JsonObject 来传递和接收 json 数据3.3.1.说明3.3.2.代码实现 3.4.其它说明3.4.1.restTemplate.exchange()3.4.2.restTemplate.postForObject()3.4.3.区别总…

【Java】Java学生成绩管理系统(源码+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Ubuntu 18.04,调整字体大小, 隐藏GNOME顶部状态栏

先安装 sudo apt-get install gnome-tweak-tool sudo apt install gnome-shell-extensions 安装后出现这个界面 这里可以调整字体大小 安装工具扩展: sudo apt-get install gnome-shell-extension-autohidetopbar 这里可以出现设置项 打开,并且…

【Altium Designer】Details Net has only one pin (Pin U1-12) 解决办法

报错图: 报错含义: Details Net has only one pin (Pin U1-12) 引脚label没接其他元器件。 解决办法1 修改报告提示,将“错误”改为“不报告”,如下图,在工程上 右键>>工程选项>>找到相应的错误标签提示…

个人主体的小程序可以变更为企业主体吗?

小程序迁移变更主体有什么作用?长期以来,由于部分小程序在注册时,主体不准确的历史原因,或者小程序的主体发生合并、分立或业务调整等现实状况,在小程序登记主体不能对应实际运营人的情况下,导致账号在认证…

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙&#xff…

【MongoDB数据库之未授权漏洞】

步骤一: 在Kali上执行以下命令搭建起MongoDB的漏洞环境.. 拉取mongo(3.6.6版本)镜像 docker pull mongo:3.6.6 启动镜像 docker run --name mongo-master -p 27017:27017 -d mongo:3.6.6 查看镜像 docker ps 步骤二:使用Nmap的插件脚本进行扫描..发现…

RIR转换Revit尺寸标注和值到Rhino指定图层中

RIR转换Revit尺寸标注和值到Rhino指定图层中 1、使用新增的Dimension Properties节点,获取尺寸标注的线和文字 2、通过elefont包的节点,将起按指定图层bake到rhino中 3、funbim v0.6.4版本节点包已更新到food4rhino,欢迎下载试用

平安养老险宿州中支参加中国特色金融文化“我在行动”演讲比赛

为积极培育和弘扬以“五要五不”为核心的中国特色金融文化,积极传播保险行业正能量,7月30日,由宿州市保险行业协会主办的培育和弘扬中国特色金融文化“我在行动”演讲比赛拉开帷幕。本次演讲比赛共有16位选手参与,平安养老保险股份…

社区检测算法(Community Detection)总结

社区检测(Community Detection) 社区检测(Community Detection)又被称为是社区发现。它是用来揭示网络聚集行为的一种技术。 社区检测算法用于评估节点组如何聚类或分区,以及它们增强或分离的趋势。 社区 社区是许多网络的属性,…

运维团队可视化大屏定制指南

在运维工作中,可视化大屏作为实时监控和数据分析的重要工具,其直观性和灵活性对于提高运维效率和决策质量至关重要。本文将结合运维行业的特点,为运维团队提供可视化大屏定制化的参考指南。 一、可视化大屏的默认配置与定制化需求 可视化大屏…

java 如何查看jar版本冲突,如何查看哪个模块依赖冲突,idea查看jar包冲突

1. idea 下载插件: 2. 如上图所示,下载Maven Helper, 注意是maven helper 不是别的 3.重启idea 4.点击pom文件,然后点击如图所示: 5. 如此即可查到,某个jar包 都有哪个模块依赖,使用的什么版本&#xff0…

由浅入深的了解进程(6)---地址空间

地址空间 进程的地址空间1、直接代码展示的现象2、基本理解3、细节问题3、1、独立性细节3、2、地址空间细节 4、问题回溯5、Linux2.6内核进程调度队列 进程的地址空间 1、直接代码展示的现象 其中当父子进程之间的g_val改变之后,为什么即使是不同的值了之后&#x…

网络通信模型

网络IO的通信原理 首先,对于TCP通信来说,每个TCP Socket的内核中都有一个发送缓冲区和一个接收缓冲区 接收缓冲区把数据缓存到内核,若应用进程一直没有调用Socket的read方法进行读取,那么该数据会一 直被缓存在接收缓冲区内。不管…

防火墙基础配置

需求: AR1可ping防火墙FW1的G0/0/0口 AR1、AR2、AR3在不同区域 AR1可访问AR2 实现: 配置各路由器的IP地址、静态路由 FW配置策略并将端口加入相关区域 防火墙代码如下: interface GigabitEthernet0/0/0undo shutdownip address 1.1.1.…

通俗易懂!495页看漫画学Python入门教程(全彩版)Git首发破万Star

前言 在编程的世界里,Python无疑是一颗璀璨的明星。从最初作为打发圣诞节闲暇时间的项目,到如今成为最受欢迎的程序设计语言之一,Python以其简洁、易学、强大的特点吸引了无数编程爱好者。然而,对于初学者来说,编程的…

高效转换,尽在掌握 —— 介绍这款免费的PDF转Word在线工具

引言 在日常工作中,我们经常会遇到需要将PDF文件转换成Word文档的情况。无论是为了编辑文档内容还是进行格式调整,一款好用的转换工具都是必不可少的。今天,我们将为大家推荐一款简单易用、功能强大的在线PDF转Word工具——AI智慧引擎&#…

浅谈KMP算法(c++)

目录 前缀函数应用【模板】KMP题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例 1 解释数据规模与约定 思路AC代码 本质不同子串数 例题讲解[NOI2014] 动物园题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路AC代码 [POI2006] OKR-Periods of …

使用 vLLM 为多个 LoRA 适配器提供服务

欢迎来到雲闪世界。使用 LoRA 适配器,我们可以针对某项任务或领域专门设计大型语言模型 (LLM)。适配器必须加载到 LLM 之上才能用于推理。对于某些应用,为用户提供多个适配器可能会很有用。例如,一个适配器可以执行函数调用,另一个…