Java后端
·04-27 23:24Day 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关键字
3
1
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
