当前位置: 首页 > news >正文

Java——面向对象进阶(二)

在这里插入图片描述

前言:
多态,包,final关键字,权限修饰符和代码块


文章目录

  • 一、多态
    • 1.1 概念
    • 1.2 多态存在条件
    • 1.3 多态中调用成员的特点
    • 1.4 instanceof关键字
  • 二、包
  • 三、权限修饰符
  • 四、final 关键字
    • 4.1 修饰类
    • 4.2 修饰方法
    • 4.3 修饰变量
  • 五、代码块
    • 5.1 局部代码块
    • 5.2 静态代码块
    • 5.3 构造代码块

一、多态

1.1 概念

首先我们要了解一下多态性和多态,这是两个不同的概念,多态性包括很多,例如运行时多态,编译时多态性等,而多态是具体的多态性实现。面向对象中的多态指的是运行时多态性的实现。

运行时多态: 方法的重写是运行时多态性的一种体现。同类型的对象,表现出不同的形态,即子类可以重写父类的方法,通过父类引用指向子类对象时,调用子类的方法实现。

1.2 多态存在条件

多态有以下的存在条件:

  1. 子类必须继承自同一个父类或者实现同一个接口
  2. 有方法重写
  3. 父类类型的引用指向子类对象。

1.3 多态中调用成员的特点

特点:

  • 变量调用:静态绑定(早期绑定),这意味着,即使引用类型是父类类型,访问属性时仍然使用父类中定义的变量。如果父类中没有这个变量,会编译失败。

    class Animal {String name = "Animal";void makeSound() {System.out.println("Animal makes a sound");}
    }class Dog extends Animal {String name = "Dog";@Overridevoid makeSound() {System.out.println("Dog barks");}
    }public class Main {public static void main(String[] args) {Animal myDog = new Dog();System.out.println(myDog.name); // 输出:AnimalmyDog.makeSound(); // 输出:Dog barks}
    }
    
  • 方法调用:动态绑定(后期绑定),方法调用在运行时而不是在编译时决定,这意味这调用的方法要看实际对象的类型。调用的方法一定要是重写的方法。

    class Animal {void makeSound() {System.out.println("Animal makes a sound");}
    }class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Dog barks");}
    }class Cat extends Animal {@Overridevoid makeSound() {System.out.println("Cat meows");}
    }public class Main {public static void main(String[] args) {//父类类型的引用指向子类对象Animal myDog = new Dog();Animal myCat = new Cat();myDog.makeSound(); // 输出:Dog barksmyCat.makeSound(); // 输出:Cat meows}
    }
    

1.4 instanceof关键字

instanceof 关键字是 Java 中用于测试对象是否为某个特定类或其子类的实例的重要工具。它返回一个布尔值,指示对象是否是指定类或接口的一个实例。instanceof 关键字常用于安全地进行向下转型(将父类引用转换为子类引用)之前的类型检查。

instanceof 的语法

object instanceof ClassName

其中,object 是要进行检查的对象,ClassName 是要检查的类或接口。

class Animal {
}class Dog extends Animal {
}public class Main {public static void main(String[] args) {Animal myAnimal = new Dog();// 检查 myAnimal 是否是 Dog 类的实例if (myAnimal instanceof Dog) {System.out.println("myAnimal 是 Dog 类的一个实例");} else {System.out.println("myAnimal 不是 Dog 类的一个实例");}// 检查 myAnimal 是否是 Animal 类的实例if (myAnimal instanceof Animal) {System.out.println("myAnimal 是 Animal 一个的实例");} else {System.out.println("myAnimal 不是 Animal 一个的实例");}}
}

输出

myAnimal 是 Dog 类的一个实例
myAnimal 是 Animal 一个的实例

除此之外,JDK14提出了新特性,

object instanceof ClassName newObject

首先判断对象 object 存储的数据是不是 ClassName 类型,如果是,则返回true,并转换为 ClassName 类型的newObject 对象。


二、包

包(package) 是用于组织类和接口的一种机制。包提供了一种命名空间管理功能,可以避免命名冲突,并且有助于组织大型项目的代码结构。使用包还可以控制访问权限,限制某些类和接口只能在同一个包中访问。操作如下:
在这里插入图片描述

  1. 在类中声明包

    package com.example.myapp;
    
  2. 导入包
    使用 import 关键字导入其他包中的类或接口。

    import com.example.myapp.User;
    

    如果要导入整个包,可以使用通配符 *:

    import com.example.myapp.*;
    

在不同包下使用相同类:

//使用全类名的形式即可。
//全类名:包名 + 类名
//拷贝全类名的快捷键:选中类名crtl + shift + alt + c 或者用鼠标点copy,再点击copy Reference
com.example.demo1.Student s1 = new com.example.demo1.Student();
com.example.demo2.Student s2 = new com.example.demo2.Student();

三、权限修饰符

​ 在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限。

  • public:公共的,所有地方都可以访问。

  • protected:本类 ,本包,其他包中的子类都可以访问。

  • 默认(没有修饰符):本类 ,本包可以访问。注意:默认是空着不写,不是default

  • private:私有的,当前类可以访问。

类内部同一包不同包中的子类不同包的无关类
public++++
protected+++
默认++
private+

四、final 关键字

使用final 关键字,表示修饰的内容不可变。

  • final 变量:值初始化后不可改变,即有且仅能被赋值一次。
  • final 方法:不能被子类重写。
  • final 类:不能被继承。

4.1 修饰类

final 类不能被继承,确保类的完整性。

public final class FinalClass {// 类内容
}// 编译错误,无法继承 final 类
// public class SubClass extends FinalClass {
// }

4.2 修饰方法

final 方法不能被子类重写,保证方法行为不被修改。

public class ParentClass {public final void finalMethod() {System.out.println("This method cannot be overridden");}
}public class ChildClass extends ParentClass {// 编译错误,无法重写 final 方法// public void finalMethod() {//     System.out.println("Trying to override");// }
}

4.3 修饰变量

  1. 局部变量
    必须在使用前初始化。

    public void myMethod() {final int localVar;localVar = 10;//localVar = 20; 编译错误,无法修改 final 变量
    }
    
  2. 成员变量
    必须在声明时或构造器中初始化。

    public class MyClass {final int CONSTANT = 10;final int anotherConstant;public MyClass(int value) {this.anotherConstant = value;}public void method() {// CONSTANT = 20; // 编译错误,无法修改 final 变量}
    }
    

注意:final 修饰不同类型时的区别

  1. final 修饰基本数据类型(包括intcharfloatboolean
    当 final 修饰基本数据类型变量时,该变量的值在初始化后不可更改。

    public class FinalExample {public static void main(String[] args) {final int x = 10;// x = 20; // 编译错误,无法修改 final 变量的值System.out.println("Final primitive value: " + x);}
    }
    
  2. final 修饰引用数据类型
    当 final 修饰引用数据类型变量时,该变量的引用在初始化后不可更改,但引用的对象的内容可以更改。

    public class FinalReferenceExample {public static void main(String[] args) {final StringBuilder sb = new StringBuilder("Hello");// sb = new StringBuilder("World"); // 编译错误,无法更改 final 引用// 可以修改对象的内容sb.append(" World");System.out.println("Final reference value: " + sb.toString());}
    }
    

五、代码块

在 Java 中,代码块(也称为块)是一组被大括号 {} 包围的语句。代码块分为以下几种类型:构造代码块、静态代码块、局部代码块。每种类型的代码块在程序执行中的作用和执行时机各不相同。

5.1 局部代码块

局部代码块是定义在方法中的一组语句,用于限制变量的作用范围。

public class LocalCodeBlockExample {public static void main(String[] args) {// 局部代码块{int x = 30;System.out.println("Local code block: x = " + x);}// System.out.println(x); // 编译错误,x 作用范围仅限于局部代码块}
}

5.2 静态代码块

静态初始化块在类加载时执行一次,用于初始化静态变量。静态初始化块在类加载时执行,而不是在创建实例时执行。

public class StaticInitializationBlockExample {private static int x;// 静态初始化块static {x = 20;System.out.println("Static initialization block: x = " + x);}public StaticInitializationBlockExample() {System.out.println("Constructor: x = " + x);}public static void main(String[] args) {StaticInitializationBlockExample example = new StaticInitializationBlockExample();}
}
//运行结果
//Static initialization block: x = 20
//Constructor: x = 20

5.3 构造代码块

构造块在每次创建类的实例时执行。它可以用来初始化实例变量。

public class InstanceInitializationBlockExample {private int x;// 实例初始化块{x = 10;System.out.println("Instance initialization block: x = " + x);}public InstanceInitializationBlockExample() {System.out.println("Constructor: x = " + x);}public static void main(String[] args) {InstanceInitializationBlockExample example = new InstanceInitializationBlockExample();}
}
//运行结果
//Instance initialization block: x = 10
//Constructor: x = 10

在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

相关文章:

Java——面向对象进阶(二)

前言: 多态,包,final关键字,权限修饰符和代码块 文章目录 一、多态1.1 概念1.2 多态存在条件1.3 多态中调用成员的特点1.4 instanceof关键字 二、包三、权限修饰符四、final 关键字4.1 修饰类4.2 修饰方法4.3 修饰变量 五、代码块…...

49.Python-web框架-Django解决多语言redirect时把post改为get的问题

目录 1.背景 2.思路 3.寻找 Find and Replace 4.再次运行程序,POST来了 5.小结 1.背景 昨天在练习一个Django功能时,把form的method设置为POST,但是实际提交时,一直是GET方法。最后发现这是与多语言相关,django前面…...

【数据结构】【版本1.1】【线性时代】——单链表

快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、顺序表的问题二、链表的概念三、单链表的模拟实现3.1 定义3.2 打印3.3 创建新节点3.4 头插3.5 尾插3…...

【计算机毕业设计】258基于微信小程序的课堂点名系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…...

common.js和es6中模块引入的区别

common.js CommonJS 是一种模块系统,主要用于 Node.js 环境。它使用 require 函数来引入模块,并使用 module.exports 来导出模块。 语法: 导出模块: // moduleA.js const name Jo; module.exports name;// 或者导出一个对象…...

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…...

《思考总结》

思考总结 ==标题==:卷积操作的作用1. **特征提取**2. **参数共享**3. **降维和数据压缩**4. **提升计算效率**5. **平滑和去噪**卷积操作示例输入图像卷积核卷积过程总结==标题==:上卷积什么是上卷积(反卷积/转置卷积)上卷积的作用上卷积的实现1. **最近邻插值(Nearest Ne…...

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…...

Linux-centos7 nvm使用

NVM下载使用 文件夹创建拉取nvm包在~/.bashrc的末尾&#xff0c;添加如下语句验证nvm是否安装成功 文件夹创建 mkdir /root/home/software/拉取nvm包 cd /root/home/software/ wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.38.0.tar.gz tar xvzf v0.38.0.tar.g…...

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了&#xff0c;也能够执行代码了&#xff0c;但是代码错了该如何调试呢&#xff1f;Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序&#xff1a; 但是我们尝试…...

Redis宣布商用后,Redis国产化替代方案有那些?

一、背景 Redis作为使用最为广泛的开源缓存中间件&#xff0c;现已成为IT开发中必不可少的核心组件。官方修改协议印证了“开源”不意味着“无偿使用”&#xff0c;相关限制或将对基于开源Redis提供中间件产品的厂商&#xff0c;及提供Redis服务的云厂商产生一定影响。 二、国…...

Go API

Go语言提供了大量的标准库&#xff0c;因此 google 公司也为这些标准库提供了相应的API文档&#xff0c;用于告诉开发者如何使用这些标准库&#xff0c;以及标准库包含的方法。官方位置&#xff1a;https://golang.org Golang中文网在线标准库文档: https://studygolang.com/p…...

基于STM32的简易智能家居设计(嘉立创支持)

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…...

【YOLOv5/v7改进系列】改进池化层为RT-DETR的AIFI

一、导言 Real-Time DEtection TRansformer&#xff08;RT-DETR&#xff09;&#xff0c;是一种实时端到端目标检测器&#xff0c;克服了Non-Maximum Suppression&#xff08;NMS&#xff09;对速度和准确性的影响。通过设计高效的混合编码器和不确定性最小化查询选择&#xf…...

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…...

淘宝/1688获得店铺的所有商品(商品列表)

通过以下步骤&#xff0c;可以获得淘宝或1688店铺的所有商品。请注意&#xff0c;具体步骤可能会因为平台的更新而有所改变&#xff0c;可以根据实际情况进行操作。 更多API调用展示以及获取Key和secret请移步 返回数据格式&#xff1a; {"user": null,"ite…...

【MySQL】锁机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …...

LangChain入门学习笔记(一)——Hello World

什么是LangChain LangChain是一个开源&#xff08;github repo&#xff09;的大语言模型应用开发框架&#xff0c;提供了一整套的工具、方法和接口去帮助程序员构建基于大语言模型的端到端应用。LangChain是长链&#xff08;long chain&#xff09;的意思&#xff0c;它的一个…...

[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人

ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模&#xff0c;是静态的&…...

java:使用JSqlParser给sql语句增加tenant_id和deleted条件

# 示例代码 【pom.xml】 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.4.3.1</version> </dependency>【MyJSqlParserTest.java】 package com.chz.myJSqlParser;pu…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...