类与对象(一) 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(); // 对d1d2d3的⽇期设置 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 默认初始化对于成员变量来说如果没有进行初始化会有一个对应的默认值默认值遵循如下规则数据类型默认值byte0short0char\u0000int0long0float0.0double0.0booleanfalse引用类型null5.3就地初始化在声明变量时直接给出初始值这种方法不建议使用5.4 构造方法初始化5.4.1 构造方法的概念构造方法(也称为构造器是一个特殊的成员方法名字必须与类名相同在创建对象时由编译器自动调用并且在整个对象的生命周期内只调用一次。构造方法可以分为无参和有参构造方法两种在之前的代码中虽然我们没有写构造方法但是Java会自动给我们提供一个无参的构造器5.4.2 构造方法的注意事项名字必须与类名相同没有返回值类型设置为void也不行创建对象时由编译器自动调用并且在对象的生命周期内只调用一次(相当于人的出生每个人只能出生一次)构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)如果用户没有显式定义编译器会生成一份默认的构造方法生成的默认构造方法一定是无参的一旦用户定义了其他的构造方法编译器则不再生成“救急不救穷”this()调用其他构造方法时this()必须在第一行并且注意不能形成调用闭环即陷入死循环绝大多数情况下使用public来修饰特殊场景下会被private修饰(后序讲单例模式时会遇到)6. 对象的打印在正常情况下我们对对象进行直接打印对象的引用会打印 类的路径名对象的hashcode值如果想要System.out.println(d1);默认打印的是对象中的属性值怎么做呢答案是重写toString()方法这是IDEA的快速重写方法我们点击tostring()之后就可以选择我们要重写的属性了