《Java 核心技术卷1 基础知识》第 4 章 对象与类

java核心技术卷1基础知识整理 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar 阅读详情

曾经有人说,作为Java程序员如果没有卷过这本书,就算不上是真正的Java程序员,那么我就也来卷卷它吧。下面是我的读书摘录笔记。

《Java 核心技术卷1 基础知识》第一章 Java程序设计概述 笔记_码农UP2U的博客-优快云博客

《Java 核心技术卷1 基础知识》第二章 Java 程序设计环境 笔记_码农UP2U的博客-优快云博客

《Java 核心技术卷1 基础知识》第三章 Java 的基本程序设计结构 笔记_码农UP2U的博客-优快云博客

目录

4.1 面向对象程序设计概述

4.1.1 类

4.1.2 对象

4.1.3 识别类

4.1.4 类之间的关系

4.2 使用预定义类

4.2.1 对象与对象变量

4.2.2 Java 类库中的 LocalDate 类

4.2.3 更改器方法与访问器方法

4.3 用户自定义类

4.3.1 Employee类

4.3.2 多个源文件的使用

4.3.3 剖析 Employee 类

4.3.4 从构造器开始

4.3.5 用 var 声明局部变量

4.3.6 使用 null 引用

4.3.7 隐式参数与显式参数

4.3.8 封装的优点

4.3.9 基于类的访问权限

4.3.10 私有方法

4.3.11 final 实例字段

4.4 静态字段与静态方法

4.4.1 静态字段

4.4.2 静态常量

4.4.3 静态方法

4.4.4 工厂方法

4.4.5 main 方法

4.5 方法参数

4.6 对象构造

4.6.1 重载

4.6.2 默认字段初始化

4.6.3 无参数的构造器

4.6.4 显式字段初始化

4.6.5 参数名

4.6.6 调用另一个构造器

4.6.7 初始化快

4.6.8 对象析构与 finalize 方法

4.7 包

4.7.1 包名

4.7.2 类的导入

4.7.3 静态导入

4.7.4 在包中增加类

4.7.5 包访问

4.7.6 类路径

4.7.7 设置类路径

4.8 JAR 文件

4.8.1 创建 JAR 文件

4.8.2 清单文件

4.8.3 可执行 JAR 文件

4.8.4 多版本 JAR 文件

4.8.5 关于命令行选项说明

4.9 文档注释

4.9.1 注释的插入

4.9.2 类注释

4.9.3 方法注释

4.9.4 字段注释

4.9.5 通用注释

4.9.6 包注释

4.9.7 注释抽取

4.10 类设计技巧


4.1 面向对象程序设计概述

面向对象程序设计(object-oriented programming, OOP)

面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。

传统的结构化程序设计通过设计一系列的过程(即算法)来求解问题。一旦确定了这些过程,就要开始考虑存储数据的适当方式。这就是 Pascal 语言的设计者 Niklaus Wirth 将其著作命名为《算法 + 数据结构 = 程序》的原因。

在 Wirth 的这个书名中,算法是第一位的,数据结构是第二位的,这就明确地表述了程序员的工作方式。首先要确定如何操作数据,然后再决定如何组织数据的结构,以便于操作数据。而 OOP 却调换了这个次序,将数据放在第一位,然后再考虑操作数据的算法。

4.1.1 类

类(class)是构造对象的模板或蓝图

由类构造(construct)对象的过程称为创建类的实例(instance)

用 Java 编写的所有代码都位于某个类里面

封装(encapsulation)是处理对象的一个重要概念。从形式上看,封装就是将数据和行为组合在一个包中,并对对象的使用者隐藏具体的实现方式。对象中的数据称为实例字段(instance field),操作数据的过程称为方法(method)。作为一个类的实例,特定对象都有一组特定的实例字段值。这些值的集合就是这个对象的当前状态(state)。只要在对象上调用一个方法,它的状态就有可能发生改变。

封装的关键在于,绝对不能让类中的方法直接访问其他类的实例字段。程序只能通过对象的方法与对象数据进行交互。

可以通过扩展其他类来构建新类。

所有其他类都扩展自这个 Object 类

在扩展一个已有的类时,这个扩展后的新类具有被扩展类的全部属性和方法。你只需要在新类中提供适用于这个新类的新方法和数据字段就可以了。通过扩展一个类来建立另外一个类的过程称为继承(inheritance)

4.1.2 对象

对象的三个主要特性:

  • 对象的行为(behavior)
  • 对象的状态(state)
  • 对象的标识(identity)

4.1.3 识别类

首先从识别类开始,然后再为各个类添加方法

识别类的一个经验是在分析问题的过程中寻找名词,而方法对应着动词

对于每一个动词,都要识别出负责完成相应动作的对象

4.1.4 类之间的关系

在类之间,最常见的关系有

  • 依赖(uses-a)
  • 聚合(has-a)
  • 继承(is-a)

依赖(dependence),即“uses-a”关系,是一种 最明显的、最常见的关系。

如果一个类的方法使用或操纵另一个类的对象,我们就说一个类依赖于另一个类。

应该尽可能地将相互依赖的类减至最少。关键是,如果类 A 不知道 B 的存在,它就不会关心 B 的任何改变。用软件工程的术语来说,就是尽可能减少类之间的耦合。

聚合(aggregation),即“has-a”关系。包容关系意味着类 A 的对象包含类 B 的对象。

继承(inheritance),即“is-a”关系,表示一个更特殊的类与一个更一般的类之间的关系。如果类 A 扩展类 B,类 A 不但包含从类 B 继承的方法,还会有一些额外的功能。

UML Unified Modeling Language 统一建模语言

4.2 使用预定义类

Math 类只封装了功能,它不需要也不必隐藏数据。由于没有数据,因此也不必考虑创建对象和初始化它们的实例字段,因为根本没有实例字段。

4.2.1 对象与对象变量

要想使用对象,首先必须构造对象,并指定其初始状态。

使用构造器(constructor)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。

内置的(built-in)类型

适应性如何

设置任务就交给了类库的设计者。如果类设计得不完善,其他的程序员可以很容易地编写自己的类,以便增强或替代(replace)系统提供的类

要想构造一个 Date 对象,需要在构造器前面加上 new 操作符

new Date();

这个表达式构造了一个新对象。这个对象被初始化为当前的日期和时间。

可以对刚刚创建的对象应用一个方法。对新构造的 Date 对象应用 toString 方法

Stirng s = new Date().toString;

希望构造器可以多次使用,因此,需要将对象存在在一个变量中:

Date birthday = new Date();

对象变量 birthday ,它引用了新构造的对象

对象与对象变量之间存在着一个重要的区别

Date deadline;

定义了一个对象变量 deadline,它可以引用 Date 类型的对象。变量 deadline 不是一个对象,而且实际上它也没有引用任何对象。此时还不能在这个变量上使用任何 Date 方法。下面的语句

s = deadline.toString();

将产生编译错误。

必须首先初始化变量 deadline,这有两个选择,可以初始化这个变量,让它引用一个新构造的对象:

deadline = new Date();

也可以设置这个变量,让它引用一个已有的对象。

deadline = birthday;

现在,这两个变量都引用同一个对象。

要认识到重要的一点:对象变量并没有实际包含一个对象,它只是引用一个对象。

在 Java 中,任何对象变量的值都是对存储在另外一个地方的某个对象的引用。

Date deadline = new Date();

有两部分。表达式 new Date() 构造了一个 Date 类型的对象,它的值是对新创建对象的一个引用。这个引用存储在变量 deadline 中。

可以显式地将对象变量设置为 null,指示这个对象变量目前没有引用任何对象。

所有的 Java 对象都存储在堆中。当一个对象包含另一个对象变量时,它只是包含着另一个堆对象的指针。

在 Java 中,必须使用 clone 方法获得对象的完整副本。

4.2.2 Java 类库中的 LocalDate 类

Date 类的实例有一个状态,即特定的时间点

时间是用距离一个固定时间点的毫秒数表示的,这个时间点就是所谓的纪元(epoch),它是 UTC 时间 1970 年 1 月 1 日 00:00:00 。UTC 就是 Coordinated Universal Time (国际协调时间),与大家熟悉的 GMT (即 Greenwich Mean Time 格林尼治时间)一样,是一种实用的科学标准时间

类库设计者决定将保存时间与给时间点命名分开。所以标准 Java 类库分别包含类两个类:一个是用来表示时间点的 Date 类;另一个是用大家熟悉的日历表示法表示日期的 LocalDate 类。

不要使用构造器来构造 LocalDate 类的对象。实际上,应当使用静态工厂方法(factory method),它会代表你调用构造器。

LocalDate.now()

会构造一个新对象,表示构造这个对象时的日期

可以提供年、月、日来构造对应一个特定日期的对象:

LocalDate.of(1999,12,31)

通常我们都希望将构造的对象保存在一个对象变量中:

LocalDate newYearsEve = LocalDate.of(1999, 12, 31);

一旦有来一个 LocalDate 对象,可以用方法 getYear、getMonthValue 和 getDayOfMonth 得到年、月、日。

Date 类也有得到日、月、年的方法,分别是 getDay、getMonth 以及 getYear,不过这些方法已经废弃。

JDK 提供了 jdeprscan 工具来检查你的代码中是否使用了 Java API 已经废弃的特性

4.2.3 更改器方法与访问器方法

plusDays 方法会生成一个新的 LocalDate 对象

更改器方法(mutator method)

访问器方法(accessor method)

date = date.minusDays(today - 1);

DayOfWeek weekday = date.getDayOfWeek();

int value = weekday.getValue();

这里遵循国际管理,即周末是一周的末尾,星期一就返回 1,星期二返回 2,依此类推。星期日则返回 7。

import java.time.DayOfWeek;
import java.time.LocalDate;

public class CalendarTest
{
    public static void main(String[] args) {

        LocalDate date = LocalDate.now();
        int month = date.getMonthValue();
        int today = date.getDayOfMonth();

        date = date.minusDays(today - 1);
        DayOfWeek dayOfWeek = date.getDayOfWeek();
        int value = dayOfWeek.getValue();

        System.out.println("Mon Tue Wed Thu Fri Sat Sun");
        for (int i = 0; i < value; i ++) {
            System.out.print("   ");
        }

        while (date.getMonthValue() == month) {
            System.out.printf("%3d", date.getDayOfMonth());
            if (date.getDayOfMonth() == today) {
                System.out.print("*");
            } else {
                System.out.print(" ");
            }
            date = date.plusDays(1);
            if (date.getDayOfWeek().getValue() == 1) {
                System.out.println("");
            }
        }
    }
}

4.3 用户自定义类

主力类(workhorse class)

4.3.1 Employee类

最简单的类定义形式为:

class ClassName
{
    field1;
    field2;
    ...
    constructor1;
    constructor2;
    ...
    method1;
    method2;
    ...
}

程序清单 4-2 EmployeeTest/EmployeeTest.java

import java.time.LocalDate;

public class EmployeeTest
{
    public static void main(String[] args) {
        Employee[] staff = new Employee[3];

        staff[0] = new Employee("Carl Cracker", 75000, 1987, 12, 15);
        staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
        staff[2] = new Employee("Tony Tester", 40000, 1990, 3, 15);

        for (Employee e : staff) {
            e.raiseSalary(5);
        }

        for (Employee e : staff) {
            System.out.println("name = " + e.getName() + ", salary = " + e.getSalary() + ", hireDay = " + e.getHireDay());
        }
    }
}

class Employee
{
    private String name;
    private double salary;
    private LocalDate hireDay;

    public Employee(String n, double s, int year, int month, int day)
    {
        name = n;
        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;
    }

}

源文件名是 EmployeeTest.java,这是因为文件名必须与 public 类的名字相匹配。在一个源文件中,只能有一个公共类,但可以有任意数目的非公共类。

当编译这段代码的时候,编译器将在目录下创建两个类

Java核心技术 卷I:基础知识 第一章 Java程序设计概述 太简单了,直接略过。 1.2 Java“白皮书”的关键术语 简单性:指相对于C++简单(指针、多重继承等),但设计者也并没有试图清楚C++中所有不适当的特性 面向对象:java与C++主要不同在于多重集成,以及接口概念 网络技能 健壮性 安全性 体系结构中立 可移植性 解释性:过去Java解释器可以在任何移植了解释器的机器上执行java字节码,现在使用即使编译器将字节码再翻译成机器码 高性能 多线程 动态性 第二章 Java程序设计环境 我选择使用了JetBrainde I 阅读详情

相关推荐

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1670

非华为电脑也能用上鸿蒙生态?手把手教你给Win10/Win11装上最新华为电脑管家(附移动应用引擎开启方法)

本文详细介绍了如何在非华为品牌的Windows 10/11电脑上安装华为电脑管家并启用移动应用引擎,实现鸿蒙生态的无缝协同体验。从BIOS设置到安装步骤,再到性能优化和常见问题解决,手把手教你解锁跨设备高效工作流。

weixin_42542669的博客 4259

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

[Bug已解决] CUDA error 尽管 CUDA 可用且 GPU 受支持-通用排查 RuntimeError 解决方案

一键难忘的博客 2416

医疗AI知识库更新慢?提示工程架构师用Agentic AI自动更新的策略

我们的目标是用Agentic AI替代传统更新流程中的“重复劳动”,让医疗知识库(以知识图谱为例)能自动跟踪最新医学进展,把“更新周期从数月缩短到数天”。从PubMed/指南数据库自动抓取新文献;用提示工程从文本中提取结构化医学知识;自动校验新知识与旧知识的冲突;将通过校验的知识写入知识图谱。拆问题:先讲医疗知识库更新慢的3大根源;给方案:用Agentic AI设计4个“小助手”解决问题;讲原理:每个小助手的工作逻辑+提示工程技巧;做实战。

AI 原生应用开发的博客 1062

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

电力系统分析 | Matlab实现源荷场景生成---蒙特卡洛法场景生成启发式同步回带削减

前程算法屋的博客 813

ZYNQ Petalinux编译系统启动文件实战指南

本文提出的混合编译加速方案实测可将编译时间从45分钟缩短至18分钟,QSPI双启动方案已在工业控制领域成功应用。Xilinx官方UG1144文档(最新v2023.1版)正点原子《ZYNQ嵌入式开发实战》开源项目Meta-Petalinux(GitHub趋势项目)未来展望:随着Versal平台的普及,Petalinux将支持更多AI加速器原生驱动,值得持续关注。

QQ_778132974的博客 813

软考中级网络工程师通关指南:从学习到实战

本文是软考中级网络工程师备考实用指南,先介绍备考前准备,包括考试时间、形式、分值等基本信息,及引导读者评估自身基础以制定学习计划;再推荐官方教材、辅导书籍、在线课程平台和学习社区等优质资源。随后梳理网络协议、设备配置、安全、规划设计等重点知识,剖析企业网络故障排查与园区网络设计典型案例。还分享真题使用、解题技巧、错题本建立等习题解答方法,给出分阶段备考、时间安排与总结反思的备考计划,最后提供考场答题顺序、检查及心态调整策略,助力考生高效备考、顺利通关。

邓邓子的博客 1855

CSP - 2024 普及组初赛试题及解析

CSP - 2024 普及组初赛试题及解析

QD_Jason的博客 2911

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: PHP 扩展与 ZEND 引擎的整合
下一篇: 软考资料分享
码农UP2U
博客等级 码龄14年 6276粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农UP2U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值