news 2026/6/18 17:03:26

类与对象(一)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
类与对象(一)

1. 面向对象的初步认知(简略阅读即可)

1.1 什么是面向对象

Java是一门非常优秀的面向对象编程语言,在Java的世界中一切皆为对象(如果没有,那就new一个🐶),面向对象是解决问题的⼀种思想,主要依靠对象之间的交互完成⼀件事情。用面向对象的思想来设计程序,更符合人们对事物的认知,对于大型程序的设计,拓展以及维护都非常友好。

1.2 面向对象与面向过程

在程序设计范式的发展历程中,面向过程与 面向对象( 是两种具有代表性的思想体系,它们反映了人类对问题建模方式的根本差异

1.2.1 面向过程:以“动作”为中心的编程范式

面向过程编程强调将问题分解为一系列步骤函数,程序围绕“如何做”展开。其核心特征包括:

  • 数据与操作分离:数据通常以全局变量或结构体形式存在,而处理数据的逻辑封装在函数中;
  • 自顶向下设计:从整体任务出发,逐步细化为子任务,最终落实为函数调用链;
  • 流程驱动:程序执行依赖明确的控制流(如顺序、分支、循环),典型语言如 C语言。

优势:逻辑清晰、执行效率高,适合算法密集型或资源受限场景(如嵌入式系统)。
局限:随着系统规模扩大,函数间耦合度升高,维护困难;难以复用和扩展;对现实世界复杂关系的建模能力较弱。

1.2.2 面向对象:以“事物”为中心的建模思想

面向对象编程则将现实世界中的实体抽象为对象,每个对象是数据(属性)与行为(方法)的统一体。其四大支柱为:
封装:隐藏内部实现细节,仅暴露必要接口,增强安全性与模块化;
继承:子类可复用父类属性与方法,支持层次化设计,减少重复代码;
多态:同一操作作用于不同对象可产生不同行为,提升灵活性与可扩展性;
抽象:通过接口或抽象类定义通用契约,聚焦核心行为而非具体实现。

注:在本篇中主要介绍封装。

优势:高度契合人类认知习惯(“万物皆对象”),便于大型项目协作开发;代码复用性强、可维护性高;天然支持模块化、组件化架构。
局限:过度设计可能导致性能开销增加;初学者易陷入“为OOP而OOP”的误区;对简单任务可能显得冗余。

1.2.3 关键比对与适用场景

维度面向过程面向对象
核心关注点“怎么做”(过程/步骤)“是什么”(实体/对象)
数据与逻辑关系分离封装于一体
复用机制函数复用类/对象继承,组合,接口,多态
拓展性修改需调整多个函数通过新增类/重写方法即可
典型应用场景算法实现,系统底层,脚本工具企业级应用,GUI系统,游戏引擎,分布式服务

1.2.4 从“面向过程”到“面向对象”的思维跃迁

初学者常困惑于“为何要封装”“继承是否滥用”。本质上,这是从机械执行者向系统设计师的角色转变:
面向过程:程序员是“指令下达者”,告诉计算机每一步做什么;
面向对象:程序员是“世界构建者”,定义对象间的职责边界与协作协议。
正如《设计模式》所言:“程序不是写出来的,而是设计出来的。” 掌握 OOP 不仅是语法技能,更是培养抽象思维与系统架构能力的关键一步。

注意:面向过程和面向对象并不是一门语言,而是解决问题的方法,没有好坏之分,都有其专门的应用场景。

2. 类的定义和使用

类就是设计图,而对象就是通过设计图创建出的不同个体

2.1 简单认识类

类就是对一个实体(对象)来进行描述的,主要描述该实体(对象)具有哪些属性(外观,尺寸),那些功能(可以干啥)。

2.2 类的定义格式

在Java中定义类要用到class关键字,具体语法如下

public class Car { public String brand; // 品牌 public String type; // 类型 public String color; // 颜色 public double price; // 价格 public double weight; // 重量 public double length; // 长度 public void run() { System.out.println("正在启动"); } public void stop() { System.out.println("正在停止"); } }

采用Java语言将洗衣机类在计算机中定义完成,经过javac编译之后形成.class⽂件,在JVM的基础上
计算机就可以识别了。
注意事项

  • 类名注意采用大驼峰定义
  • 成员前写法统⼀为public,后面会详细解释
  • 此处写的方法不带 static 关键字. 后面会详细解释
  • ⼀般⼀个文件当中只定义⼀个类
  • public修饰的类必须要和文件名相同

3. 类的实例化

3.1 什么是实例化

在Java中属于数据类型中的引用数据类型。用类创建对象的过程称为类的实例化。在java中采⽤new关键字,配合类名来实例化对象

3.2 如何访问类中的成员

内存简略分布图

3.3 类和对象的再次理解

  1. 类只是⼀个模型⼀样的东西,用来对⼀个实体进行描述,限定了类有哪些成员。
  2. 类是⼀种自定义的类型,可以用来定义变量。
  3. ⼀个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
  4. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是⼀个设计,实例化出的对象才能实际存储数据,占用物理空间。

4. this关键字

4.1 为什么要有this引用

public class Date { public int year; public int month; public int day; public void setDay(int y, int m, int d){ year = y; month = m; day = d; } public void printDate(){ System.out.println(year + "/" + month + "/" + day); } public static void main(String[] args) { // 构造三个⽇期类型的对象 d1 d2 d3 Date d1 = new Date(); Date d2 = new Date(); Date d3 = new Date(); // 对d1,d2,d3的⽇期设置 d1.setDay(2020,9,15); d2.setDay(2020,9,16); d3.setDay(2020,9,17); // 打印⽇期中的内容 d1.printDate(); d2.printDate(); d3.printDate(); } }

提出两个疑问:

  1. 形参名不小心与成员变量名相同,会发生什么?
  2. 三个对象都在调⽤setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢?

4.2 this到底是什么?

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

4.3 this引用的特性

  1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引l用类型
  2. this只能在"成员方法"(非静态成员方法)中使用
  3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
  4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将
  5. 调用成员方法对象的引用传递给该成员方法,this负责来接收

5. 对象的构造及初始化

5.1如何初始化对象中的成员变量

在Java方法中定义一个变量时,一定要给变量赋值(变量初始化),否则会编译失败

此时给a一个初始值时,就可以正常运行对于对象,可以这样做:

需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。

通过上述例子发现两个问题:
1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2.局部变量必须要初始化才能使用,为什么字段声明(成员变量)之后没有给值依然可以使用?


5.2 默认初始化

对于成员变量来说,如果没有进行初始化,会有一个对应的默认值,默认值遵循如下规则:

数据类型默认值
byte0
short0
char'\u0000'
int0
long0
float0.0
double0.0
booleanfalse
引用类型null


5.3就地初始化

在声明变量时,直接给出初始值,这种方法不建议使用


5.4 构造方法初始化

5.4.1 构造方法的概念

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次

构造方法可以分为无参和有参构造方法两种,在之前的代码中,虽然我们没有写构造方法,但是Java会自动给我们提供一个无参的构造器;

5.4.2 构造方法的注意事项

  1. 名字必须与类名相同
  2. 没有返回值类型,设置为void也不行
  3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
  4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
  5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的
  6. 一旦用户定义了其他的构造方法,编译器则不再生成(“救急不救穷”)
  7. this()调用其他构造方法时,this()必须在第一行,并且注意不能形成调用闭环(即陷入死循环)
  8. 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)

6. 对象的打印

在正常情况下,我们对对象进行直接打印对象的引用会打印 类的路径名@对象的hashcode值

如果想要System.out.println(d1);默认打印的是对象中的属性值怎么做呢?

答案是:重写toString()方法

这是IDEA的快速重写方法,我们点击tostring()之后,就可以选择我们要重写的属性了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 17:03:16

AI_深度学习-2.深度学习基础概念

标签: #深度学习 #激活函数 #梯度下降 #反向传播 #过拟合 学习周期:2 天 | 核心目标:理解深度学习核心概念,掌握激活函数、梯度下降原理及过拟合应对方法 6.2 深度学习基础概念 深度学习是机器学习的一个子集,基于多层…

作者头像 李华
网站建设 2026/6/18 17:02:01

3个实战突破:彻底解决Amlogic S905L3B设备Armbian部署的核心挑战

3个实战突破:彻底解决Amlogic S905L3B设备Armbian部署的核心挑战 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l…

作者头像 李华
网站建设 2026/6/18 16:49:09

逆向实战:从零破解网易云音乐评论接口加密参数

一、写在前面:为什么选择网易云音乐? 在爬虫学习者的进阶之路上,网易云音乐是一座绕不开的“大山”。它的评论接口不仅采用了RSA + AES 混合加密,而且每次请求都必须动态生成 params 和 encSecKey 两个关键参数。更“贴心”的是,网易云在前端源码中故意放置了混淆后的 Ja…

作者头像 李华
网站建设 2026/6/18 16:44:35

昇腾多机训练中HCCL通信问题的分析与解决

作者:昇腾实战派 知识地图:https://blog.csdn.net/Lumos_Lovegood/article/details/161455142 背景概述 在大规模深度学习训练任务中,多机多卡分布式训练已成为提升训练效率的主流方式。在实际使用PyTorch框架结合昇腾CANN进行8机训练任务时…

作者头像 李华