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 类和对象的再次理解
- 类只是⼀个模型⼀样的东西,用来对⼀个实体进行描述,限定了类有哪些成员。
- 类是⼀种自定义的类型,可以用来定义变量。
- ⼀个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
- 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是⼀个设计,实例化出的对象才能实际存储数据,占用物理空间。
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(); } }提出两个疑问:
- 形参名不小心与成员变量名相同,会发生什么?
- 三个对象都在调⽤setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢?
4.2 this到底是什么?
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
4.3 this引用的特性
- this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引l用类型
- this只能在"成员方法"(非静态成员方法)中使用
- 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
- this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将
- 调用成员方法对象的引用传递给该成员方法,this负责来接收
5. 对象的构造及初始化
5.1如何初始化对象中的成员变量
在Java方法中定义一个变量时,一定要给变量赋值(变量初始化),否则会编译失败
此时给a一个初始值时,就可以正常运行对于对象,可以这样做:
需要调用之前写的SetDate方法才可以将具体的日期设置到对象中。
通过上述例子发现两个问题:
1.每次对象创建好后调用SetDate方法设置具体日期,比较麻烦,那对象该如何初始化?
2.局部变量必须要初始化才能使用,为什么字段声明(成员变量)之后没有给值依然可以使用?
5.2 默认初始化
对于成员变量来说,如果没有进行初始化,会有一个对应的默认值,默认值遵循如下规则:
| 数据类型 | 默认值 |
|---|---|
| byte | 0 |
| short | 0 |
| char | '\u0000' |
| int | 0 |
| long | 0 |
| float | 0.0 |
| double | 0.0 |
| boolean | false |
| 引用类型 | null |
5.3就地初始化
在声明变量时,直接给出初始值,这种方法不建议使用
5.4 构造方法初始化
5.4.1 构造方法的概念
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法可以分为无参和有参构造方法两种,在之前的代码中,虽然我们没有写构造方法,但是Java会自动给我们提供一个无参的构造器;
5.4.2 构造方法的注意事项
- 名字必须与类名相同
- 没有返回值类型,设置为void也不行
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
- 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的
- 一旦用户定义了其他的构造方法,编译器则不再生成(“救急不救穷”)
- this()调用其他构造方法时,this()必须在第一行,并且注意不能形成调用闭环(即陷入死循环)
- 绝大多数情况下使用public来修饰,特殊场景下会被private修饰(后序讲单例模式时会遇到)
6. 对象的打印
在正常情况下,我们对对象进行直接打印对象的引用会打印 类的路径名@对象的hashcode值
如果想要System.out.println(d1);默认打印的是对象中的属性值怎么做呢?
答案是:重写toString()方法
这是IDEA的快速重写方法,我们点击tostring()之后,就可以选择我们要重写的属性了