【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…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...