曦曦xixi
Java后端
·04-27 23:24
Day 5 ✅ 今天做了:继续复习 1.面向过程vs面向对象 ①面向过程定义: 以“过程/步骤”为核心,将程序视为一系列按顺序执行的操作步骤,数据与操作分离(先定义数据,再写操作函数) ②面向过程的缺陷: 1.数据与操作分离 → 导致代码混乱、易错(如数组分散存储学生信息) 2.业务逻辑分散 → 修改需求需大改多处代码 3.扩展困难 → 添加新功能需重写大量代码 ③面向对象定义: 以“对象”为核心,将程序视为相互协作的对象集合,数据与操作封装在对象中(把现实世界的事物抽象为对象,对象包含属性和行为) ④面向对象优点: 1.可维护:数据与行为绑定 2.易拓展:通过继承等方式拓展(下面会讲) 3.映射关系清晰:数据与数据之间关联清晰,不需要特地辨识(如人为辨别张三的name和socre) 4.更符合人脑思维的对象之间的交互来解决问题而不是流程解决问题 4.团队协作低效 → 依赖全局数据结构,易冲突) ———————————————————————— 2.类和对象的定义 ①类是对象的模板,定义了对象的属性和行为,类由员变量员方法组成 ②对象是按照类创建的具体示例,根据同一个类可以创建多个对象 —————————————————————————— 3.成员变量: 定义:即对象的属性/特征 语法:修饰符 数据类型 变量名; 访问:对象名.属性名 变量作用域:java按定义只有两种作用域:1.局部变量2.成员变量 ①就近原则:局部变量和成员变量重名时,优先使 ②this 区分:this.变量名 → 强制访问成员变量 —————————————————————————— 4.对象创建流程(举例Dog dog = new Dog()) ①1.声明引用 Dog dog; 操作:在栈内存中,开辟一个小空间,创建局部变量 dog; 初始值:null(空引用,代表还没有指向任何对象); 此时:堆中没有任何对象,只有栈里的一个空引用 ②2.创建对象 new Dog() 1.类加载 检查 Dog 类是否已加载到方法区: 未加载 → 读取 Dog.class 文件,将类的结构(成员变量、构造方法、普通方法)存入方法区; 已加载 → 直接复用方法区的类信息。 2.分配堆内存 在堆内存中开辟一块连续空间,创建 Dog 对象实例: 给对象的成员变量分配空间,执行默认初始化(比如 int=0,String=null); 执行 Dog() 构造方法,完成显式初始化; 3.生成内存地址 给堆中的这个对象分配一个唯一的十六进制地址(比如 0x112233) ③3.赋值引用 dog = 堆对象地址 —————————————————————————— 5.成员方法:定义、方法调用、方法重载、方法递归调用 ①定义:即对象的行为或功能 语法:修饰符 返回值类型 方法名(参数列表) { 方法体; return 返回值; // 无返回值写void } 注意:1.调用带参方法,要对应参数列表传入可兼容数值 2.一个方法只能有一个返回值,类型可以是任意 ②方法调用 格式:对象名.方法名(参数可选) 内存分析: 每次方法调用,jvm都会创建一个独立的栈帧空间(方法执行最小的数据单元) 栈帧:局部变量表+操作数栈+动态链接+方法返回地址 调用步骤: 1.程序启动:JVM 加载MethodDemo类,找到入口main()方法 2.main 栈帧入栈:JVM 为main方法创建栈帧,压入虚拟机栈(栈底),开始执行 main 方法 3.暂停 main,准备调用 add:执行到demo.add(10,20),main 方法暂停执行 4.创建 add 栈帧:JVM 为add方法创建新栈帧 5.参数传递(值传递):把实参10、20复制到 add 栈帧的局部变量表 6.add 栈帧入栈:成为栈顶,JVM 开始执行 add 方法的代码 7.add 方法执行完毕:计算结果30,准备返回 8.返回值传递:把30交给 main 栈帧的局部变量result 9.add 栈帧出栈:add 方法执行结束,栈帧销毁,内存释放 10.恢复 main 执行:回到 main 方法的暂停处,继续执行打印代码 11.main 栈帧出栈:main 方法结束,线程终止 不同的方法调用:1.静态方法调用2.实例方法调用3.构造调用 调用返回:正常返回,栈帧出栈;异常返回,异常上抛 ③方法重载 定义:在同一个类中,允许定义多个方法名相同,但参数列表不同的方法 规则:1.参数个数不同;2.参数类型不同;3.参数顺序不同(类型不同时有效) 底层原理:编译器根据方法名 + 参数列表唯一识别方法,调用时自动匹配对应参数的方法 **可变参数** 定义:允许方法接收0 个、1 个或多个 ** 同类型的参数; 规则:1.一个方法最多只能有 1 个可变参数 2.可变参数必须放在参数列表的最后一位 3.调用时可传:0 个值、1 个值、多个值、直接传数组 语法:语法: 访问修饰符 返回类型 方法名(数据类型... 形参名) { } 本质:可变参数在方法内部,就是一个数组 ④方法递归调用 定义:自己调用自己 满足递归前提条件:1.必须有调用停止的条件(无法停止导致栈帧溢出)2.每次调用都必须向递归头靠近(问题规模不断缩小) 经典问题:1.递归求阶乘 n! 2.递归求斐波那契数列 —————————————————————————— 6.构造器 定义:特殊的构造方法-创建对象的专用方法,new关键字创建对象时自动调用,用于初始化成员变量 规则:1.方法名 必须和类名完全一致(大小写敏感)2.没有返回值,不能写 void;3.一个类可以有多个构造器(重载) ———————————————————————————————————————————— 7.this关键字 定义:调用当前对象自己 用途:1.this.成员变量:区分成员变量和局部变量重名 2.this.成员方法:调用本类的其他成员方法 3.this():调用本类的其他构造器(必须写在构造器第一行) —————————————————————————————— 📚 今日总结:面向过程vs面向对象、类和对象的定义、成员变量、对象创建流程、成员方法、构造器、this关键字
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP