【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.mzph.cn/news/808249.shtml

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

相关文章

“桃花庵主”是我国哪位古代名人的称号?2024年4月12日蚂蚁庄园今日答案

原文来源:蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏,用户可以通过喂养小鸡,产生鸡蛋,并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料,使用鸡饲料喂鸡之后,会可以获得鸡蛋&…

.a和.so库文件是什么?

我们在编译开源代码后,通常会生成.a和.so这两个库文件,这两个文件有什么区别?又如何使用? 在 Linux 中,.a 和 .so 文件都是库文件,但它们有一些区别: 静态库文件(.a)&am…

SSH远程登陆系统(RedHat9)

ssh的基本用法 ssh hostname/IP # 如果没有指定用什么用户进行连接,默认使用当前用户登录 ssh –l username hostname/IP ssh usernamehostname ssh usernameIP在第一次连接到服务器时,会自动记录服务器的公钥指纹信息 如果出现密钥变更导致错误可以…

L2-2 巴音布鲁克永远的土(二分+并查集)

思路:我们可以二分答案,然后判断当前答案合不合理。 对于判断答案合理,可以用并查集,看mid能否把所有检查点连进一个集合中,枚举每个结点,如何当前结点周围的四个方向可以连的话,就加进同一个集…

贪心算法|435.无重叠区间

力扣题目链接 class Solution { public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.siz…

基于 OpenHarmony 音符检测实现原理

一、音符检测的基本原理 本文基于 OpenHarmony 开源系统提供了一种音符检测的原理方法&#xff0c;结合多首音乐&#xff0c;运用了 python 和 C 两种编程环境实现了预期的检出效果。旨在为振动马达(vibrator)提供音乐节奏感的触觉效果&#xff0c;代码所在目录 .\base\sensor…

2024.4.12蚂蚁庄园今日答案:豆腐在烹调时容易碎有什么办法可以避免?

原文来源&#xff1a;蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&…

JDK版本升级后连不上MySQL数据库的问题

1. 问题描述 用户在将 JDK 版本从 8 升级到 11 后&#xff0c;发现应用无法连接到 MySQL 数据库&#xff0c;出现连接超时或连接被拒绝的错误。 例如出现如下报错信息&#xff1a; 可能原因&#xff1a; JDBC驱动版本不兼容&#xff1a; 新的 JDK 11 可能需要使用更高版本的 My…

docker一键部署GPU版ChatGLM3

一键运行 docker run --gpus all -itd --name chatglm3 -p 81:80 -p 6006:6006 -p 8888:8888 -p 7860:7860 -p 8501:8501 -p 8000:8000 --shm-size32gb registry.cn-hangzhou.aliyuncs.com/cwp-docker/chatglm3-gpu:1.0 进入容器 docker exec -it chatglm3 /bin/bash cd /…

自定义校验器

1.前端校验 <template><el-dialog:title"!dataForm.brandId ? 新增 : 修改":close-on-click-modal"false":visible.sync"visible"><el-form:model"dataForm":rules"dataRule"ref"dataForm"keyu…

Java(IO流)

IO流 用于读写文件中的数据&#xff08;可以读写文件或网络中的数据&#xff09;I&#xff1a;inputO&#xff1a;output 1.IO流的分类 1 流的方向 输入流&#xff08;读取&#xff1a;程序 -> 文件&#xff09;输出流&#xff08;写出&#xff1a;文件 -> 程序&#x…

Hello 算法10:搜索

https://www.hello-algo.com/chapter_searching/binary_search/ 二分查找法 给定一个长度为 n的数组 nums &#xff0c;元素按从小到大的顺序排列&#xff0c;数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素&#xff0c;则返回 -1 。 # 首…

海外博士后政策,这些重点你不能错过!

​ ​海外高层次人才博士后专项申报政策是针对具有较高学术造诣和研究潜力的海外学者、研究人员&#xff0c;旨在吸引他们回国从事科研工作&#xff0c;推动国内科技创新发展。该政策不仅为海外人才提供了良好的职业发展平台&#xff0c;还为他们提供了丰富的科研资源和优厚…

20240408在线给加密的PDF文件解密【打印限制】

20240408在线给加密的PDF文件解密 百度&#xff1a;PDF解密 https://smallpdf.com/cn/unlock-pdf PDF解密 未选择任何文件 或拖放PDF至此处 无文件大小限制&#xff0c;无广告水印 - 这款易于使用且免费的在线密码移除工具可为您移除恼人的PDF密码。 无需注册 数秒内解锁 PDF …

【GitHub技术全面解析及游戏开发者的应用】

GitHub技术全面解析及游戏开发者的应用 GitHub作为全球最大的开源代码托管平台&#xff0c;不仅为软件开发者提供了一个强大的工具&#xff0c;也为游戏开发者带来了前所未有的便利。在游戏开发领域&#xff0c;GitHub的技术可以帮助开发者更高效地管理代码、协作开发、分享资…

python基础语法--输入和输出

一、 输入 input() python使用input输入变量&#xff0c;input输入的变量为字符串形式&#xff0c;可以通过其他方式转换为整型或其他类型。 &#xff08;1&#xff09;单行读入已知个数的字符串或数字 读入字符串 # 单行读入字符串a,并给出一句输入提示 a input("请…

【随笔】Git 高级篇 -- 提交的技巧(下) cherry-pick commit --amend(十九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

pose_iter_116000.caffemodel 下载地址(github)

没有百度云会员&#xff0c;github上几秒就下完了 face&#xff1a;pose_iter_116000.caffemodelhttps://github.com/ihp-lab/OpenSense/blob/fefe13ccf250e4811f4f61edf0b212e4ded78d19/Interoperations/OpenPose.PInvoke/OpenPoseLib/models/face/pose_iter_116000.caffemode…

搭建网站的步骤

搭建网站的步骤 我们选择了白嫖雨云的二级域名 浏览器输入https://www.rainyun.com/z22_ 创建账号然后选择一个你喜欢的子域名我建议后缀选择ates.top的 选择自定义地址&#xff0c;类型选择cname 现在要选择记录值了&#xff0c;有a&#xff0c;aa&#xff0c;txt等 根据实际…

加速度JUSDO | 电子元器件商城行业调研及运营方案

一、行业背景与竞品分析 随着电子元器件行业的快速发展&#xff0c;线上元器件商城已成为行业交易的重要渠道。目前市场上存在多个知名的元器件商城&#xff0c;如立创、云汉芯城、贸泽商城等&#xff0c;它们都提供了丰富的元器件产品和便捷的线上交易服务。 立创商城&#x…