【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 的作用:

  1. 指示隐式参数的作用

  2. 调用同类其他构造器

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 对于方法参数:

  1. 方法不能修改基本数据类型的参数

  2. 方法可以改变对象参数的状态

  3. 方法不能让一个对象参数引用一个新对象

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 字段会在对象初始化块中初始化

当调用一个构造器时,按照如下顺序进行:

  1. 如果构造器第一行调用了另一个构造器,则基于所提供的参数执行第二个构造器

  2. 否则, a) 所有实例字段初始化为默认值(0, false 或 null) b) 按照在类声明中出现的顺序,执行所有字段初始化方法和初始化块

  3. 执行构造器主体代码

还有一种静态初始化块:

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);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/305901.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

easyExcel - 按模板导出

目录 前言一、情景介绍二、文档介绍2.1 读取模板2.2 填充模板 三、代码示例3.1 案例一:工资表3.2 案例二:报价单 四、我所遇到的问题 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如…

2024 年 3 月 Web3 游戏报告:市场趋势与投资动态

作者:stellafootprint.network 数据来源:Footprint Analytics GameFi Research 2024 年 3 月,比特币不断刷新纪录,成功跨越了月中的低谷。受益于宏观经济的积极态势,整个加密货币市场表现突出。与此同时&#xff0c…

实体抽取全解析:技术与实战

目录 一、前言二、实体抽取技术概览基于规则的实体抽取基于统计的实体抽取基于深度学习的实体抽取 三、实体抽取的发展历程早期的实体抽取方法基于规则和词典的方法基于特征的机器学习方法 深度学习时代的实体抽取从传统模型到神经网络序列标注模型的兴起预训练语言模型的革命 …

Java设计模式之创建型模式(二)原型模式

原型模式 1、原型模式1-1、应用场景1-2、举个 软栗子1-3、举个 硬栗子1-4、举个实务栗子1-5、代码重构 学习原型模式的目的:原型模式的目的在于通过复制现有的实例来创建新的对象,以避免通过构造函数创建对象时可能带来的性能开销,同时可以控…

2024mathorcup数学建模A 题思路分析-移动通信网络中 PCI 规划问题

# 1 赛题 A 题 移动通信网络中 PCI 规划问题 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖 小区编号进行合理配置,以避免 PCI 冲突、 PCI 混淆以及 PCI 模 3 干扰等 现象。 PCI 规划对于减少物理层的小区间互相干扰(ICI),增…

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例问题:达梦数据库在使用disql登录时,显示“未连接”。 指定了IP和端口号还是连接异常。 […

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle,终于不需要Oracle的什么安装包了,直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子,测试了一下,发现很方便。使用的场景是:VS2022中EFcore6。经过测试,同 Navicat Premium 16比…

【C++进阶】C++异常详解

C异常 一,传统处理错误方式二,C处理的方式三,异常的概念四,异常的使用4.1 异常和捕获的匹配原则4.2 函数调用链中异常栈展开匹配原则4.3 异常的重新抛出(异常安全问题)4.4 RAII思想在异常中的作用 五&#…

标定系列——Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译(二十)

Ubuntu18.04下opencv-4.5.3与opencv_contrib-4.5.3源码编译 说明下载安装步骤1.更新2.安装必要的依赖包3.下载源码包并解压4.终端运行如下命令5.添加配置路径6.验证安装是否成功 说明 Ubuntu18.04下对opencv-4.5.3与opencv_contrib-4.5.3源码编译 下载 CSDN下载 安装步骤 …

手写ArrrayList

需求 自定义的MyArrayList import java.util.Arrays; import java.util.Objects;public class MyArrayList<E> {private Object[] elementData ; // 存储元素的数组private int size; // 记录 的元素个数private static final int DEFAULT_CAPACITY 10; // 默认容量// …

提升编程效率的秘密武器:IntelliJ IDEA

IntelliJ IDEA的基本介绍 正如一个故事的开头&#xff0c;我们从一个名字开始 - IntelliJ IDEA。这是一个在程序员中广受欢迎的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由捷克公司JetBrains开发。它的名字听起来有些复杂&#xff0c;但实际上&#xff0c;它的功能…

蓝桥杯备考day4

1.1 二分查找模板 bool check(int x) {// 进行某些操作 } // 二分查找函数 int binarySearch() {int l 1, r n; // 初始化左右边界while (r - l > 1) // 当右边界与左边界相差大于1时{int mid (l r) >> 1; // 取中间位置if (check(mid)) // 如果满足条件r mid; …

第十一届蓝桥杯大赛第二场省赛试题 CC++ 研究生组-七段码

#include<iostream> using namespace std; const int N 10, M 7; int e[N][N] {0}, f[N], open[N];//e[i][j]表示i和j之间是否连通&#xff1b;f[i]表示结点i的父节点&#xff1b;open[i] 1表示结点i打开&#xff0c;0表示关闭 long long ans 0;int find(int x){if(…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

AMD Tensile 简介与示例

按照知其然&#xff0c;再知其所以然的认知次序进行 1&#xff0c;下载代码 git clone --recursive https://github.com/ROCm/Tensile.git 2&#xff0c;安装 Tensile cd Tensile mkdir build cd build ../Tensile/bin/Tensile ../Tensile/Configs/rocblas_dgemm_nn_asm_full…

微信小程序(六)定位搜索

一、引言 作者上一章讲了微信小程序的地图实现微信小程序&#xff08;五&#xff09;地图-CSDN博客&#xff0c;但是还有一个功能是和地图紧密结合的&#xff0c;那就是位置搜索定位&#xff0c;这里作者讲讲实现和原理&#xff0c;包括城市筛选。 二、定位搜索实现 1、位置搜…

mysql查看数据库表容量大小

【推荐】单表行数超过 500 万行或者单表容量超过 2GB&#xff0c;才推荐进行分库分表。 说明&#xff1a;如果预计三年后的数据量根本达不到这个级别&#xff0c;请不要在创建表时就分库分表。 1. 查询所有数据库记录数和容量 SELECTtable_schema AS 数据库,SUM(table_rows) …

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

目录 一.准备工作 二.编写各个组件的页面结构 三.实现初始任务列表的渲染 四.新增任务 五.删除任务 六.展示未完成条数 七.切换状态-筛选数据 八.待办事项&#xff08;全&#xff09;代码 一.准备工作 在开发“ToDoList”案例之前&#xff0c;需要先完成一些准备工作&a…

图像处理与视觉感知---期末复习重点(7)

文章目录 一、图像压缩1.1 三种冗余1.2 模型1.3 信息测量 二、无误差压缩2.1 哈夫曼编码2.1.1 步骤2.1.2 例题 2.2 算术编码 三、变换编码 一、图像压缩 1.1 三种冗余 1. 三种基本的是数据冗余为&#xff1a;编码冗余、像素间冗余、心理视觉冗余。 2. 编码冗余&#xff1a;如果…

蓝桥杯——玩具蛇

题目 小蓝有—条玩具蛇&#xff0c;一共有16节&#xff0c;上面标着数字1至16。每—节都是一个正方形的形状。相邻的两节可以成直线或者成90度角。 小蓝还有一个44的方格盒子&#xff0c;用于存放玩具蛇&#xff0c;盒子的方格上依次标着字母A到Р共16个字母。 小蓝可以折叠自…