【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 {
    @Override
    public 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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.icon 24 位位图读取

代码来源 读取格式来自:Icons | Microsoft Learn rgb打印来自:位图(BMP)文件结构分析以及使用C实现位图的读写与显示 - 简书 (jianshu.com) 位图转 icon 文件网站: w​​​​​​​在线生成透明ICO图标 - 在线工具 (toollist.net) ​​​​…

C++调用python脚本

1、在属性页配置 包含目录和库目 2、引入头文件并实现代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 // ConsoleApplication22.cpp : 此文件包含 &…

2024年第十四届 Mathorcup (B题)| 甲骨文智能识别 | 深度学习 计算机视觉 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看Mathorcup (B题)! CS团队…

AI预测福彩3D第33弹【2024年4月12日预测--第8套算法开始计算第1次测试】

今天在出预测结果之前,咱们先做一下经验总结。经过前面第7套算法8次的测试,发现了一些非常稳定的规律,这些规律可以作为杀号的条件;另一方面,存在一些冲突矛盾的规律,一旦使用,就可能会把中奖号…

【前缀合】Leetcode 和为k的子数组

题目解析 560. 和为 K 的子数组 算法讲解 前面滑动窗口里面有一道题和这个题很相似,它是求出和为k的最短子数组的长度,但是这道题不能使用滑动窗口,因为虽然找到一段子数组的和等于k,但是这道题里面存在0和负数,可能…

英伟达旗下AI估值暴增?!!

在AI初创领域中,OpenAI和Anthropic两家获得融资最多的闭源大模型公司备受瞩目,它们的投资背后分别是实力雄厚的微软和亚马逊。 资本巨头进军AI领域,所投入的不仅仅是资金,更是宝贵的云计算资源。这种全力支持的做法,无…

路线选择 | 用ZStack Cloud替代升级VMware

2024年,被博通收购后的VMware全面走向订阅模式,VMware将各产品线改为以VVEP/VVS/VVF/VCF四大基础订阅包并叠加组件的模式进订阅制服,从永久授权改为1/3/5年订阅,且订阅制后售卖规则也进行了调整。 对于用户来讲,VMwar…

C语言 函数——代码风格

目录 基本的代码规范 程序版式 对齐(Alignment)与缩进(indent) 变量的对齐规则 空行——分隔程序段落的作用 代码行内的空格——增强单行清晰度 代码行 长行拆分 标识符命名规则 标识符命名的共性规则 windows应用程序…

SpringBoot启动时banner设置

SpringBoot启动时banner设置 1.操作步骤2.各种banner图像 1.操作步骤 在application.properties文件中设置新的banner对于的文件位置,最好放在resources目录下 spring.banner.locationbanner.txt2.各种banner图像 (1)经典大佛图 具体txt文…

Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识

前言 记录时间 [2024-4-5] 在先前的文章中,笔者进行了Windows系统下YOLOv8模型的简单测试,并由此引发思考:是否能尝试将此模型运行在Linux中呢?又或者,运行在Docker中。关于Docker的学习就这么展开了。 本文便是有关D…

车载视频智能创作解决方案,影视级视频制作

当下车载视频已经不仅仅是一种记录行车过程的方式,更是展现企业品牌形象、传递文化内涵的重要媒介。传统的车载视频制作方式往往耗时耗力,效率低下,无法满足企业对于高质量、高效率的需求。针对这一痛点,美摄科技凭借其在视频智能…

算法 分割字符串为实体类

题目 String userData "10000:张三:男:1998-01-01#10001:张三:男:1998-01-01#10002:李四:女:1999-02-02#10003:王五:男:2000-03-03#10004:赵六:女:2001-04-04"; String[] usersArray userData.split("#"); // 使用Stream API将字符串数组转换为SysUser对…

SpringBoot学习之Kibana下载安装和启动(三十二)

一、简介 Kibana是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看存放在Elasticsearch中的数据。Kibana与Elasticsearch的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。 …

新版网络安全等级保护定级指南解读

网络安全等级保护工作的作用对象,主要包括基础信息网络、工业控制系统、云计算平台、物联网、使用移动互联技术的网络和大数据等。 软件开发全套资料获取进主页或者本文末个人名片直接获取。

【应急响应事件】记一次矿机木马事件

事情起因,是因为实验室有一台服务器的占用率从开机启动就是100%,很怀疑就是中了某种矿机木马,拿去挖矿了,然后经过师兄的不懈努力,终于找到了木马文件,给他命名为virus_sample 然后我就拿着样本去逆了 木马…

前端React笔记(尚硅谷)

react 尚硅谷react教程 jsx语法规则 1.定义虚拟dom时不加引号(不是字符串) 2.标签中混入js表达式时要用{} js表达式与js语句不同。 js语句是if(),for(),switch(&#x…

Python生成图片和音频验证码

captcha是pyhton的一个模块,用来生成图片和音频验证码。 安装 pip install captcha使用 from captcha.audio import AudioCaptcha from captcha.image import ImageCaptcha# 加载声音和字体 audio AudioCaptcha(voicedir/path/to/voices) image ImageCaptcha(…

Linux的环境搭建

目录 第一步:购买腾讯云轻量级云服务器 Step1:打开腾讯云 ​编辑 Step2:登录腾讯云并完成认证 Step3:选择服务器类型 Step4:选择服务器配置 第二部:下载XShell Step1:打开XShell Step2…

亚马逊云科技云从业者考证自习室招生啦!

今天小李哥安利的是亚马逊云科技国内社区User Group(UG)的最新线上活动,云从业者考证自习室(图1)。该活动将由亚马逊云科技社区技术大牛、考证大牛们,帮助大家在一个月内陪伴式学习、保姆级教学、提供免费备考课程,帮助大家在短短一个月内稳稳…

tensorflow.js 如何从 public 路径加载人脸特征点检测模型

系列文章目录 如何在前端项目中使用opencv.js | opencv.js入门如何使用tensorflow.js实现面部特征点检测tensorflow.js 如何从 public 路径加载人脸特征点检测模型tensorflow.js 如何使用opencv.js通过面部特征点估算脸部姿态并绘制示意图tensorflow.js 使用 opencv.js 将人脸…