Java 面向对象
一、Java 8 增强的包装类
Java是面向对象的编程语言,但它也包含了8种基本数据类型,这8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备对象的特性。(没有成员变量、方法可以被调用)。Java之所以提供这8种数据类型,主要是为了照顾程序员的传统习惯。
基本数据类型的限制:
所有的引用类型的变量都继承了Object类,都可以当成Object类型变量使用。但基本数据类型的变量就不可以。
解决办法:
为了解决8种基本数据类型不能当成Object类型变量使用的问题,Java提供了包装类的概念,为8种基本数据类型发呢别定义了相应的引用类型。
对应关系:
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
自动装箱:
可以把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量。
自动拆箱:
允许直接把包装类对象赋给一个对应的基本类型变量。
public class AutoBoxingUnboxing {public static void main(String[] args) {//自动装箱://直接把一个基本类型变量赋给Integer对象Integer inObj = 5;//直接把一个boolean类型变量献给一个Object类型的变量Object boolObj = true;//自动拆箱:直接把一个Integer对象赋值给int类型的变量int a = inObj;if (boolObj instanceof Boolean) {//先把Object对象强制类型转换为Boolean类型,再赋给boolean对象boolean b = (Boolean)boolObj;System.out.println(b);}}
}
字符串类型——> int 类型:
String str = "123";int b = Integer.parseInt(str);int c = new Integer(str);System.out.println("b="+b);System.out.println("c="+c);
int 类型——> String类型
String s = String.valueOf(b);System.out.println(s.getClass());
//或者直接和空串相连String ss = c + "";System.out.println(ss.getClass());
注意问题:
这是因为在 -128~127之间的数字,同 一个整数自动装箱成Integer实例时,引用的是cache数组的同一个数组元素,所以它们全都相等。而不在这个范围内的,每次自动装箱的时候都会新创建一个Integer实例,所以两个会不相等。
Integer ia = 2;Integer ib = 2;System.out.println(ia == ib); //trueInteger ic = 128;Integer id = 128;System.out.println(ic == id); //false
二、处理对象
1. 打印对象和 toString 方法
对于一个Person对象 p,使用这两种方式效果一样:
System.out.println(p);
System.out.println(p.toString());
Object类提供的 toString() 方法总是返回该对象实现类的“类名+@+hashCode”。
2. == 和 equals方法
== :如果两个变量是基本类型变量,且都是数值类型,只要两个变量的值相等,就返回true。 但是对于两个引用类型变量,只有它们指向同一个对象时,==判断才会返回true。
equals:equals() 方法是Object 类提供的一个实例方法,因此所有引用变量都可以调用该方法来判断是否与其他引用变量相等,但是使用这个方法判断两个对象相等的标准与使用==运算符没有区别,同样要求引用变量指向同一个对象才会返回true。更多情况我们都选择重写equals方法。
注意:String类已经重写了equals()方法。
例如:
public boolean equals(Object obj) {if (this == obj) {return true;}if (obj != null && obj.getClass() == Person.class) {Person personObj = (Person)obj;if (this.getId().equals(personObj.getId())) {return true;}}return false;}
三、final修饰符
final关键字可用于修饰类、变量和方法。final修饰变量时,表示该变量一旦获得初始值就不可被改变。
1. final成员变量
成员变量随类初始化或对象初始化而初始化的,final修饰的成员变量必须由程序员显式地指定初始值。
2. final局部变量
系统不会对局部变量进行初始化,局部变量必须由程序员显式初始化,因此使用final修饰局部变量时,既可以在定义时指定默认值,也可以不指定默认值。
3. final修饰基本类型变量和引用类型变量的区别
final修饰基本类型变量时,不能对基本类型变量重新赋值,但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但是这个对象完全可以发生改变。
4. final类
final类不能有子类,Java.lang.Math就是一个final类。
四、抽象类
当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体。但是有的类只知道其子类应该包含什么样的方法,但不知道具体内容,这就是抽象类。抽象方法是只有方法的定义,没有具体实现的方法。
1. 抽象方法和抽象类
抽象方法和抽象类必须用 abstract 修饰。规则如下:
- 抽象方法不能有方法体
- 抽象类不能被实例化,不能new
- 抽象类可以包含成员变量、方法、构造器、初始化块、内部类5种成分。抽象类的构造器不能创建实例,主要是用于被其子类调用
- 含有抽象方法的类只能被定义为抽象类
当使用 static 修饰一个方法时,表明这个方法属于该类本身,即通过类就可以调用该方法。static和abstract不能同时修饰某个方法,但是它们可以同时修饰内部类。
abstract 修饰的方法不能被定义为private,因为它需要被重写。
2. 抽象类的作用
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。
如果编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法留给其子类实现,这就是一种模板模式,模板模式也是十分常见且简单的设计模式之一。
五、Java 8 改进的接口
抽象类是从多个类种抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类”——接口,接口里不能包含普通方法,接口里的所有方法都是抽象方法,Java8对接口进行了改进,允许在接口种定义默认方法,默认方法可以提供方法实现。
接口里不能包含构造器和初始化块定义,接口里可以包含成员变量(只能是静态常量),方法(只能是抽象方法、类方法或默认方法)、内部类(包含内部接口、枚举)定义。
在接口里下面两行代码含义一样:
int MAX_SIZE = 50;
public static final int MAX_SIZE = 50;
1. 接口的继承
interface interfaceC extends interfaceA, interfaceB{}
2. 接口的作用
-
定义变量,也可用于进行强制类型转换
-
调用接口种定义的常量
-
被其他类发现
实现接口:
修饰符 class 类名 extends 父类 implements 接口1,接口2{}
3. 接口和抽象类
接口和抽象类很像,他们都具有如下特征:
- 接口和抽象类都不能被实例化,他们都位于继承树的顶端,用于被其他类实现和继承
- 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
接口和抽象类的区别:
- 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作
- 接口里不能包含初始化块,抽象类可以包含
六、内部类
大部分时候,类被定义为一个独立的程序单元,在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类。
1. 内部类作用
-
内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包种的其他类访问该类。如Cow类和CowLeg类,CowLeg只有在Cow类里面才有意义,所以可以把他定义在Cow里面当作内部类。
-
内部类成员可以直接访问外部类的私有数据,因为内部类被当作其外部类成员。
-
匿名内部类适合用于创建那些仅需要一次使用的类。
2. 非静态内部类
定义内部类:
public class OuterClass {private class interClass{}
}
如果外部类需要访问非静态内部类的成员,则必须显示创建非静态内部类对象来调用访问其实例成员。
3. 静态内部类
如果用static修饰一个内部类,则这个内部类就属于外部类本身,而不属于外部类的某个对象。因此用static修饰的内部类被称为类内部类。
static的作用是把类的成员变成类相关,而不是实例相关。即static修饰的成员属于整个类,而不属于单个对象。
4. 局部内部类
如果把一个内部类放在方法里定义,则这个内部类就是一个局部内部类,局部内部内仅在方法里有效。
5. 匿名内部类
匿名内部类适合创建那种只需要一次使用的类,创建匿名内部类时会创建以恶该类的实例,这个类定义立即消失,匿名内部类不能重复使用。
示例:
public interface MyInterface {void doSomething();
}public class MyClass {public static void main(String[] args) {// 创建一个实现MyInterface接口的匿名内部类MyInterface myInterface = new MyInterface() {@Overridepublic void doSomething() {System.out.println("Doing something...");}};// 调用doSomething方法myInterface.doSomething();}
}
在上述示例中,我们定义了一个接口MyInterface和一个类MyClass。在MyClass中的main方法中,我们使用匿名内部类创建了一个实现MyInterface接口的对象。在这个匿名内部类中,我们重写了MyInterface中的doSomething方法,当调用myInterface.doSomething()时,它将输出Doing something...。
匿名内部类必须继承一个父类,或实现一个接口,但最多只能继承一个父类,或实现一个接口。
6. 枚举类
在某些情况下,一个类的对象是有限而且固定的,比如季节类,它只有四个对象。这种实例有限而且固定的类,在Java里被称为枚举类。
定义一个季节的枚举类:
public enum Season {SPRING,SUMMER,AUTUMN,WINTER
}
使用枚举类:
public class Main {public static void main(String[] args) {Season currentSeason = Season.SPRING;System.out.println("当前季节是:" + currentSeason);switch (currentSeason) {case SPRING:System.out.println("现在是春天");break;case SUMMER:System.out.println("现在是夏天");break;case AUTUMN:System.out.println("现在是秋天");break;case WINTER:System.out.println("现在是冬天");break;}}
}
输出:
当前季节是:SPRING
现在是春天
7. 对象与垃圾回收
Java垃圾回收时Java语言的重要功能之一。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下特征:
- 垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(如数据库连接、网络和IO)
- 程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候进行。当对象永久性的失去引用后,系统就会在合适的时候回收它所占的内存。
- 在垃圾回收机制回收任何对象之前,总会先调用它的finalize() 方法。
强制垃圾回收:
在Java中,我们不能确保垃圾回收器什么时候会执行,因为这是由JVM自行管理的。但是,我们可以通过调用System.gc()或者Runtime.getRuntime().gc()方法来提示垃圾回收器尽快执行垃圾回收操作。
需要注意的是,虽然调用System.gc()或者Runtime.getRuntime().gc()方法可以请求垃圾回收器进行垃圾回收操作,但是它们不能保证垃圾回收器一定会执行。这是因为JVM在进行垃圾回收时有可能会优化执行时间,避免过多频繁的垃圾回收操作,因此,这些方法调用只能作为提示,而不能作为强制垃圾回收的手段。
同时,需要注意的是,在实际应用中,应该避免频繁地调用垃圾回收操作,因为这会占用系统资源,影响程序的性能。通常情况下,我们可以通过优化程序代码、避免创建过多无用的对象等方式来减少垃圾回收的执行次数,提高程序的性能。
相关文章:
Java 面向对象
一、Java 8 增强的包装类 Java是面向对象的编程语言,但它也包含了8种基本数据类型,这8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备对象的特性。(没有成员变量、方法可以被调用)。Java之所以提…...
五、传输层
(一)TCP传输控制协议 可靠的、面向连接的字节流服务,全双工,有端口寻址功能 1、TCP的三种机制 1.使用序号对分段的数据进行标记,便于调整数据包 2.TCP使用确认、校验和和定时器系统提供可靠性 3.TCP使用可变大小的…...
Thinkphp 6.0一对一关联查询
本节课我们来了解关联模型中,一对一关联查询的使用方法。 一.hasOne 模式 1. hasOne 模式,适合主表关联附表,具体设置方式如下: hasOne(关联模型,[外键,主键]); return $this->hasOne(Profile::class,user_id, id); 关联模型&…...
基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路
wx供重浩:创享日记 对话框发送:单片机打铃 获取完整无水印论文报告说明(含源码程序、电路原理图和仿真图) 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…...
算法详解-双指针算法的魅力-一种简单而高效的编程思想
文章目录双指针简介快慢指针快慢指针介绍快慢指针例题快慢指针优缺点:对撞指针对撞指针介绍:对撞指针例题对撞指针优缺点:更新中——未完总结更多宝藏双指针简介 😎🥳😎🤠😮&#x…...
网页审查元素
在讲解爬虫内容之前,我们需要先学习一项写爬虫的必备技能:审查元素(如果已掌握,可跳过此部分内容)。1、审查元素在浏览器的地址栏输入URL地址,在网页处右键单击,找到检查。(不同浏览器的叫法不同…...
gpt2 adapter finetune
1. 安装依赖: pip install -U adapter-transformers pip install datasets 2.训练代码: from datasets import load_dataset from transformers import AutoModelForCausalLM from transformers import GPT2Tokenizer from transformers import Adap…...
Day14_文件操作
一、数据存储 1.1 计算机数据存储 计算机内存分为运行内存和硬盘两种:保存在运行内存中的数据在程序运行结束后会自动释放,保存在硬盘中的数据会一直存在(除非手动删除或者硬盘损坏) 1)打开文件 open(文件路径, 文件打开方式‘r’, encod…...
leetcode 轮转数组 189
题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2…...
Leetcode.1849 将字符串拆分为递减的连续值
题目链接 Leetcode.1849 将字符串拆分为递减的连续值 Rating : 1747 题目描述 给你一个仅由数字组成的字符串 s。 请你判断能否将 s拆分成 两个或者多个 非空子字符串 ,使子字符串的 数值 按 降序 排列,且每两个 相邻子字符串 的数值之 差 …...
Android布局层级过深为什么会对性能有影响?为什么Compose没有布局嵌套问题?
做过布局性能优化的同学都知道,为了优化界面加载速度,要尽可能的减少布局的层级。这主要是因为布局层级的增加,可能会导致测量时间呈指数级增长。 而Compose却没有这个问题,它从根本上解决了布局层级对布局性能的影响: Compose界…...
【UR机械臂CB3 网络课程 】
【UR机械臂CB3 网络课程 】1. 前言2. 概览:特色与术语2.1 机器人组成2.1.1控制柜2.1.2 UR 机器人手臂2.2 接通机器人电源2.3 移动机械臂3. 机器人如何工作3.1 选择臂端工具3.2 输入有关臂端工具的信息3.3 连接外部装置3.4 机器人编程4. 设置工具4.1 末端执行器配置4.2 工具中心…...
dp-统计字典序元音字符串的数目
给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。 字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i1] 相同或在 s[i1] 之前。 示例 1: 输入&…...
LFM雷达实现及USRP验证【章节3:连续雷达测距测速】
第一章介绍了在相对速度为0时候的雷达测距原理 目录 1. LFM测速 1.1 雷达测速原理 1.2 Chrip信号测速 2. LFM测速代码实现 参数设置 仿真图像 matlab源码 代码分析 第一章介绍了在相对速度为0时候的雷达测距原理,第二章介绍了基于LFM的雷达测距原理及其实现…...
COLMAP多视角视图数据可视化
这篇博文主要介绍多视角三维重建的实用工具COLMAP。为了让读者更快确定此文是否为自己想找的内容,我先用简单几句话来描述此文做的事情: 假设我们针对一个物体(人)采集了多个(假设60个)视角的照片ÿ…...
2023年全国最新高校辅导员精选真题及答案36
百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 92.校园文化形成与发展的主要影响因素有() A.学校的领导与管理活…...
ThreeJS-全屏和退出全屏、自适应大小(五)
下载新得组件 npm install gsap -S 新引入 import gsap from gsap //动画控制 代码: <template> <div id"three_div"> </div> </template> <script> import * as THREE from "three"; import {OrbitControls } f…...
等级保护2.0要求及所需设备清单
等级保护的工作流程包括定级、备案、建设整改、等级测评,核心思想在于建立“可信、可控、可管”的安全防护体系,使得系统能够按照预期运行,免受信息安全攻击和破坏。 三级等保要求及所需设备 三级等级保护指标项: 物理访问控制…...
【大数据之Hadoop】六、HDFS之NameNode、Secondary NameNode和DataNode的内部工作原理
NN和2NN的内部工作原理 对于NameNode的存放位置: 内存中:好处:计算快 坏处:可靠性差,断电后元数据会丢失 磁盘中:好处:可靠性搞 坏处:计算慢 内存磁盘中:效率低 所以设…...
小黑子—Java从入门到入土过程:第四章
Java零基础入门4.0Java系列第四章1. 顺序结构2. if语句3. switch 语句3.1 default的位置和省略3.2 case 穿透3.3 switch 新特性 (jdk12开始)4. for 循环5. while 循环6.do...while 循环7. 无限循环8. 跳转控制语句9. 练习9.1 逢七过9.2 平方根9.3 求质数…...
数据库原理及应用(四)——SQL语句(2)SQL基础查询以及常见运算符
一、SELECT语句基础 数据库查询是数据库的核心操作,SELECT 语句用于从数据库中选取数据。 SELECT [ALL/DISTINCT] <列名>,<列名>...FROM <表名或视图名>,<表名或视图名>[WHERE <条件表达式>][GROUP BY <列名1> [HAVING <条…...
(算法基础)Floyd算法
适用情景Floyd算法适用于多源汇最短路,也就是他问你比如说从3号点到6号点的最短路距离,比如说从7号点到20号点的最短路距离,而不是单源最短路(从1号点到n号点的最短路距离)。在这个算法当中允许负权边的存在。但在求最…...
SQL语法:浅析select之七大子句
Mysql版本:8.0.26 可视化客户端:sql yog 目录一、七大子句顺序二、演示2.1 from语句2.2 on子句2.3 where子句2.4 group by子句2.4.1 WITHROLLUP,加在group by后面2.4.2 是否可以按照多个字段分组统计?2.4.3 分组统计时,…...
中国人民大学与加拿大女王大学金融硕士——去有光的地方,并成为自己的光
光是我们日常生活中一个重要的元素,试想一下如果没有光,世界将陷入一片昏暗。人生路亦是如此,我们从追逐光、靠近光、直到自己成为光。人民大学与加拿大女王大学金融硕士项目是你人生路上的一束光吗 渴望想要成为一个更好的人,就…...
Python数据结构与算法篇(五)-- 二分查找与二分答案
1 二分法介绍 1.1 定义 二分查找又称折半查找、二分搜索、折半搜索等,是一种在静态查找表中查找特定元素的算法。 所谓静态查找表,即只能对表内的元素做查找和读取操作,不允许插入或删除元素。 使用二分查找算法,必须保证查找表中…...
小游戏也要讲信用
当下,小游戏鱼龙混杂,官方为能更好地保护用户、开发者以及平台的权益,近日宣布7月1日起试行小游戏主体信用分机制。 主体信用分是什么呢?简单来说,这是针对小游戏主体下所有小游戏帐号行为,对开发者进行评…...
贪心算法11
1. 贪心算法的概念 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法没有固定的算法框架,算法设计的关键是贪心…...
【并发编程】JUC并发编程(彻底搞懂JUC)
文章目录一、背景二、什么是JUC?三、JUC框架结构四、JUC框架概述五、JUC中常用类汇总六、相关名词进程和线程进程线程创建线程的几种常见的方式并发和并行用户线程和守护线程七、synchronized 作用范围:八、Lock锁(重点)什么是 Lock锁类型Lock接口lock()…...
Compose 动画 (七) : 高可定制性的动画 Animatable
1. Animatable和animateDpAsState的区别是什么 Animatable是Android Compose动画的底层API,如果我们查看源码,可以发现animateDpAsState内部是调用的animateValueAsState,而animateValueAsState内部调用的是Animatable animateDpAsState比A…...
vue3组件传值
1.父向子传值 父组件 引入子组件 import Son from ./components/Son.vue 设置响应式数据 const num ref(99) 绑定到子组件 <Son :num"num"></Son> 子组件 引入defineProps import { defineProps } from vue; 生成实例接收数据 type设置接收类…...
云服务器的作用/站内seo是什么意思
需求:日志记录 需要记录当前用户访问的每个接口对应的前端页面功能信息声明一个注解 Documented Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) public interface LogRecord {/*** 接口功能信息*/String value() default ""; }定义…...
自己做的视频网站上传电影/推广链接点击器
2019独角兽企业重金招聘Python工程师标准>>> #情景描述 以Mysql作为数据库的JavaWeb项目,对于Mysql中的Time,Date,DateTime类型,Java的对应类型都是Date。Java程序在存储和读取相应字段的数据的时候,有时候…...
武汉做网站的大公司有哪些/seo公司是做什么的
Page({data: {product: {name: ,price: ,stock: 1,state: true},files: []},handleChangeStock({detail}) {this.setData({[product.stock]: detail.value})} });...
那个做我女朋友的网站/互联网营销师报名入口官网
排除其他原因后,可能是这样的 因为keras在训练时会一次占用完所有的内存,因此会修改源代码如下 但是在微调训练时总会报OOM错误,因此需要将之前分配的显存空间注释 系统中自带python环境,其位置在这里: 源码地址&…...
主流网站编程语言/怎么搜索关键词
软件介绍MIHTool 是前端工程师在iOS设备上调试和优化页面的得力助手.功能特性:iPad版1.内嵌 Web inspector(类似于 Chrome DevTool 或 FireBug):有 Elements,Resources,Network,Timeline,Console 面板.2.远程打开Web inspector调试:在电脑(window,mac,linux,仅需装有…...
企业品牌网站建设怎么做/百度关键词相关性优化软件
-----------------------往期----------------------------- vuex - 学习日记 vuex - 辅助函数学习 vuex - 常用命令学习及用法整理 vuex - 项目结构目录及一些简单配置 -----------------------正文----------------------------- 首先,目录结构依然如下࿱…...