【Java核心技术】第4章 对象与类
1 面向对象

2 自定义类
形式:
class ClassName
{
field // 字段
constructor // 构造器(构造函数)
method // 方法
}
如:
class Employee
{private String name;private double salary;private LocalDate hireDay;public Employee(String n, double s, int year, int month, int day) // Employee 的构造器{name = n; //注意不是 String name = n;salary = s; // 注意不是 double salary = s;hireDay = LocalDate.Of(year, month, day); }public String getName(){return name;}public double getSalary(){return salary;}public LocalDate getHireDay(){return hireDay;}public void raiseSalary(double byPercent){double raise = salary * byPercent / 100;salary += raise;}
raiseSalary 方法有两个参数,第一个参数称为隐式参数,是 Employee 类型的对象 第二个参数是显式参数 byPercent
在每一个方法中,关键字 this 指示隐式参数:
事实上,关键字 this 的作用:
-
指示隐式参数的作用
-
调用同类其他构造器
public void raiseSalary(double byPercent){double raise = this.salary * byPercent / 100;this.salary += raise;}
这样将实例字段和局部变量区分开来
注:参数变量会 遮蔽 同名的实例字段,用 this 可以标识出实例字段
2.1 final实例字段
将字段定义为 final,这样的字段必须在构造对象时初始化,且以后 不能再修改 这个字段(修饰不可变类的字段)
class Employee
{private final name;
}
2.2 static实例字段
如果有100个 Employee 类对象,则有100个 id 实例字段,但是只有一个静态字段 nextId
class Employee
{private static int nextId = 1;private int id;
}
2.3 静态方法
静态方法是 不操作 对象的方法
调用一个静态方法,需要使用 类名.方法名() 的形式来调用
两种情况下可以使用静态方法:
-
方法不需要访问对象状态,因为它需要的所有参数都通过显式参数提供(例如 Math.pow)
-
方法只需要访问类的静态字段
关于静态方法,可以在不创建类的实例的情况下被调用,比如 Math 类,Math 类没有构造器,所有的方法都是静态方法
适合使用静态方法的类:
-
工具类,如 Math 类
-
常量类,如 Math.PI
-
工厂方法,如 LocalDate 类
-
全局配置类
2.4 工厂方法
例如 LocalDate 和 NumberFormat 类使用静态 工厂方法 构造对象
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println("currencyFormatter.format(x)"); // prints $0.10
System.out.println("percentFormatter.format(x)"); // prints 10%
NumberFormat 类不使用构造器来创建对象的原因:
-
无法为构造器命名(构造器的名字要和类相同,但是希望有两个不同的名字)
-
无法改变所构造对象的类型(工厂方法返回 DecimalFormat 类的对象,继承自 NumberFormat)
2.5 方法参数
在程序设计语言中,关于参数传递到方法的两种形式:
-
按值调用(call by value):表示方法接收的是值
-
按引用调用(call by reference):表示方法接收的是变量的位置
在 Java 中 总是 使用 按值调用,方法不能修改传递给他的任何参数变量的内容
Java 对于方法参数:
-
方法不能修改基本数据类型的参数
-
方法可以改变对象参数的状态
-
方法不能让一个对象参数引用一个新对象
2.6 重载 (overload) 和 覆盖 (override)
有些类有多个构造器,例如:
var messages_1 = new SrtingBuilder();
var messages_2 = new SrtingBuilder("hello!");
重载 (overload):多个方法有相同的方法名,但有不同的参数
Java 允许重载任何方法,要完整地描述一个方法,需要指定 方法名 和 参数类型,这叫做方法的 签名
例如 String 类有4个 indexOf 的方法:
indexOf(int)indexOf(int, int)indexOf(String)indexOf(String, int)
但是返回类型不是签名的一部分,即不能有两个有相同名字和相同参数类型却有不同的返回类型的方法
Java 不支持运算符重载
覆盖(override):子类方法实现,覆盖了父类方法
class Parent {public void someMethod() {// 父类方法实现}
}
class Child extends Parent {@Overridepublic void someMethod() {// 子类方法实现,覆盖了父类方法}
}
2.7 参数名
1.在编写很小的构造器时,对参数的命名:(尽量不要这样写)
public Employee(String n, double s)
{name = n;salary = s;
}
2.对于单个字母的参数名影响可读性,所以在每个参数前加上"a":
public Employee(String aName, double aSalary)
{name = aName;salary = aSalary;
}
3.因为参数变量会 遮蔽 同名的实例字段,所以可以用 this 来标识实例字段:
public Employee(String name, double salary)
{this.name = name;this.salary = salary;
}
2.8 调用另一个构造器
如果构造器的 第一个语句 形如 this(...),这个构造器将调用同类的另一个构造器:
public Employee(double s)
{// calls Employee(String, double)this("Employee #" + nexId, s);nextId++;
}
这样可以提高代码的重用性
2.9 初始化块
初始化实例字段的方法:
-
在构造器中设置值
-
在声明中赋值
-
初始化块
初始化块:在一个类的声明中,可以包含任意的代码块,构造这个类的对象时候,这些块就会执行
class Employee
{private static int nextId;
private int id;private String name;private double salary;
{id = nextId;nextId++;}
public Employee(String name, double salary){this.name = name;this.salary = salary;}
public Employee(){name = "";salary = 0;}
}
无论使用哪个构造器构造对象,id 字段会在对象初始化块中初始化
当调用一个构造器时,按照如下顺序进行:
-
如果构造器第一行调用了另一个构造器,则基于所提供的参数执行第二个构造器
-
否则, a) 所有实例字段初始化为默认值(0, false 或 null) b) 按照在类声明中出现的顺序,执行所有字段初始化方法和初始化块
-
执行构造器主体代码
还有一种静态初始化块:
private static Random generator = new Random();
static
{nextId = generator.nextInt(10000);
}
3 包
3.1 静态导入
导入包的时候加上static,就可以不用前缀使用静态方法和静态字段
import static java.lang.Math.*;
public class StaticImport {public static void main(String[] args) {int radius = 5;double area = PI * pow(5, 2);System.out.println(area);}
}
相关文章:
【Java核心技术】第4章 对象与类
1 面向对象 2 自定义类 形式: class ClassName { field // 字段 constructor // 构造器(构造函数) method // 方法 } 如: class Employee {private String name;private double salary;private LocalDate hireDay;public Emp…...
【LeetCode】回溯算法类题目详解
所有题目均来自于LeetCode,刷题代码使用的Python3版本 回溯算法 回溯算法是一种搜索的方法,在二叉树总结当中,经常使用到递归去解决相关的问题,在二叉树的所有路径问题中,我们就使用到了回溯算法来找到所有的路径。 …...
java实现请求缓冲合并
业务背景: 我们对外提供了一个rest接口给第三方业务进行调用,但是由于第三方框架限制,导致会发送大量相似无效请求,例如:接口入参json包含两个字段,createBy和receiverList,完整的入参json示例…...
分布式锁的原子性问题
4.6 分布式锁的原子性问题 更为极端的误删逻辑说明: 线程1现在持有锁之后,在执行业务逻辑过程中,他正准备删除锁,而且已经走到了条件判断的过程中,比如他已经拿到了当前这把锁确实是属于他自己的,正准备删…...
从零自制docker-8-【构建实现run命令的容器】
文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…...
2024.03.31 校招 实习 内推 面经
绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 -小米SU7上市24小时,大定达88898台;小鹏汽车正式进入德国市场;地平线递交港股上市申请 自动驾驶一周资讯 -小米SU7上市24小时&…...
邦芒职场:塑造职场人气王的秘诀
在职场中,有些人总能吸引众人的目光,成为团队的焦点;而有些人却常常默默无闻,难以融入。那么,如何在职场中脱颖而出,成为一个受欢迎的人呢?下面,让我们来探讨一下塑造职场人气王的秘…...
滤波器网络变压器的作用
网络变压器的作用主要包括以下几点: 1. 信号传输:网络变压器可以将PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并且通过电磁场的转换耦合到不同电平的连接网线的另外一端以达到传输数据的目的。 2. 电气电压隔离:…...
Python —— 简述
Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…...
使用Rust加速Python程序,让代码飞起来
作为一种解释型语言,Python在开发速度和灵活性方面具有明显的优势,但在性能方面却不如编译型语言如C或Rust。对于性能要求苛刻的应用程序,如果纯粹使用Python编写可能会运行缓慢,影响用户体验。因此,如何利用Rust来加速…...
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(八)- 向量整数算术指令
1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...
Qt Designer在布局中调整控件垂直伸展或者水平伸展之后控件没有变化
QtDesigner设置垂直伸展 在Qt Designer中,要对网格布局中的每一个网格设置垂直伸展,可以按照以下步骤操作: 1.打开Qt Designer并打开你的UI文件。 2.确保你的布局是一个网格布局(QGridLayout)。 3.选中你想要设置垂直…...
微信公众号粉丝迁移费用是多少?
公众号迁移后原来内容还在么?通过公众号迁移,可以实现这些目的:主体变更、开通留言功能、多号合并、订阅号升级为服务号、服务号转为订阅号。公众号迁移流程:①申请公证;②提交迁移申请;③第三方审核&#…...
基于Vue3 中后台管理系统框架
基于Vue3 中后台管理系统框架 文章目录 基于Vue3 中后台管理系统框架一、特点二、源码下载地址 一款开箱即用的 Vue 中后台管理系统框架,支持多款 UI 组件库,兼容PC、移动端。vue-admin, vue-element-admin, vue后台, 后台系统, 后台框架, 管理后台, 管理…...
Agent调研--19类Agent框架对比
代理(Agent)指能自主感知环境并采取行动实现目标的智能体,即AI作为一个人或一个组织的代表,进行某种特定行为和交易,降低一个人或组织的工作复杂程度,减少工作量和沟通成本。 背景 目前,我们在探…...
蓝桥杯-求阶乘
问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…...
计算两个日期之间相差的天数的四种方法
计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数。 public static void main(String[] args) {DateFormat dft new SimpleDateFormat("yyyy-MM-dd");t…...
【leetcode面试经典150题】42. 有效的字母异位词(C++)
【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…...
Windows 2003 R2与Windows 2022建立域信任报错:本地安全机构无法跟域控制器获得RPC连接。请检查名称是否可以解析,服务器是否可用。
在Windows Server 2003 R2与Windows Server 2022之间建立域信任时遇到“本地安全机构无法与域控制器获得RPC连接”的错误,可能是由于以下几种原因: DNS 解析问题: 确保源域和目标域的DNS配置正确,能够互相解析对方的域名和IP地址。…...
UE5、CesiumForUnreal实现加载建筑轮廓GeoJson数据生成白模功能
1.实现目标 在UE5.3中,通过加载本地建筑边界轮廓面GeoJson数据,获取底面轮廓和楼高数据,拉伸生成白模,并支持点选高亮。为防止阻塞Game线程,使用了异步任务进行优化,GIF动图如下所示: 其中建筑数量:128871,顶点索引数量:6695748,三角面数量:2231916,顶点数量:165…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
