Day11 --【Java全栈】方法 (下)

发布时间:2026/7/11 22:09:24
Day11 --【Java全栈】方法 (下) 全景定位先在脑子里放一张地图Java 是面向对象的语言所有代码都写在「类」里面。你可以把一个类理解成一个功能盒子每个盒子里只装两样东西属性盒子里存的数据比如用户盒子里存姓名、年龄方法盒子能做的事情比如用户盒子能修改姓名、计算年龄简单说属性是存东西的方法是干活的我们写 Java 代码绝大多数时候都是在写方法。1. 两大核心特性1.1 方法签名通俗理解就像人的身份证号是区分不同方法的唯一标识。名字参数类型不一样才是不同的方法。记忆定义JVM 区分方法的唯一标识 方法名 参数类型列表返回值、修饰符、抛出的异常都不算方法签名。❌误区参数名不影响签名。比如add(int a, int b)和add(int x, int y)是完全相同的方法不能同时存在会编译报错。1.2 方法重载Overload通俗理解同一个菜谱名“煎蛋”可以有不同版本煎1个蛋、煎2个蛋、用鸭蛋煎。你喊“煎蛋”时厨师会根据你递的原料自动选对应版本。 记忆定义同一个类中方法名相同参数列表不同就叫方法重载。和返回值、修饰符没有关系。参数列表不同只有3种合法情况参数个数不同add(int a)和add(int a, int b)参数类型不同add(int a)和add(double a)参数类型顺序不同add(int a, String b)和add(String b, int a)❌误区只改参数名、只改返回值都不算重载会直接编译报错。1.3 方法重写Override通俗理解总店有一份“珍珠奶茶”的标准菜谱父类方法分店子类觉得不够甜不改名、不改原料只调整糖量和做法做出分店版珍珠奶茶。顾客点单时拿到的是对应分店的版本。进阶理解定义父子类继承关系中子类写一个和父类方法名、参数列表完全一致的方法覆盖父类的原有逻辑这就是方法重写。它是面向对象「多态」的核心实现。重写规则两同两小一大两同方法名相同、参数列表完全相同两小返回值类型兼容基本类型必须完全一样引用类型可以是父类返回类型的子类比如父类返回Number子类返回Integer抛出的异常范围小于等于父类只针对受检异常一大子类方法的访问权限不能比父类更严格父类是public子类不能是private❌误区private方法、static方法都不能被重写子类写同名方法只是自己的新方法不是重写。2. 参数传递机制值传递通俗理解基本类型你把菜谱复印一份给朋友朋友在复印件上改你的原件完全不变。引用类型你给朋友一张仓库地址纸条复印件。朋友去仓库改了货物包装 → 仓库里的东西真变了但朋友把纸条改成另一个仓库地址 → 你手里的纸条完全不变。 记忆核心规则Java 里只有值传递没有引用传递所有参数传的都是「副本」只是不同类型的副本内容不一样基本类型参数传的是数值的副本。方法里改参数值完全不影响外面的原变量。引用类型参数传的是对象内存地址的副本。方法内修改对象的内部属性 → 会影响外面的原对象因为指向同一个内存方法内把参数重新赋值为新对象new→ 完全不影响外面的原引用改的只是副本的地址进阶补充不可变类的特殊情况String、Integer等不可变类即使是引用类型方法内“修改”也不会影响外部。本质不可变对象本身不能改方法里的“修改”其实是让形参指向了新对象属于「改指向」不是「改内容」完全符合值传递规则。public void test(String s) { s 新字符串; // 形参指向了新对象和外面的原引用无关 }3. 可变参数Varargs通俗理解就像点菜时“随便加几个小菜”你可以加0个、1个、5个后厨用一个托盘数组全部装起来给你处理。记忆语法参数类型... 参数名比如int... nums本质底层就是数组方法里可以完全当数组用3条硬规则一个方法最多只能有一个可变参数必须放在参数列表的最后一位调用时可以传0个、1个、多个也可以直接传数组进阶重载匹配优先级如果同时有「固定参数方法」和「可变参数方法」会优先匹配固定参数的可变参数是兜底的。public void method(int a) {} // 优先匹配这个 public void method(int... a) {} // 固定参数匹配不上才走这个❌误区不能和同类型数组参数构成重载比如method(int... nums)和method(int[] nums)签名相同会编译报错。4. 两类特殊方法4.1 构造方法通俗理解品牌奶茶店加盟。每开一加盟家新店new对象都要按模板装修、安装设备、招员工完成初始化。记忆作用专门用来创建、初始化对象new对象时会自动调用核心规则方法名必须和类名完全一样大小写都不能错不能写任何返回值类型连 void 都不能写写了就变成普通方法没手动写构造方法时编译器会自动生成一个无参的默认构造方法只要手动写了一个默认的就消失了构造方法可以重载用不同参数创建不同初始状态的对象进阶补充构造方法可以用private修饰作用是禁止外面new对象只能在类内部创建典型应用是单例模式。4.2 main 方法记忆作用Java 程序的唯一入口JVM 启动程序时会自动找它执行固定格式一个字都不能错public static void main(String[] args)publicJVM 要全局访问必须公开staticJVM 调用时还没创建对象必须属于类本身void入口不需要给 JVM 返回值String[] args命令行参数可以在运行程序时传字符串进去5. 静态方法 vs 实例方法通俗理解静态方法街边公共电话亭不需要有房子对象谁都能直接打实例方法你家座机必须先有房子对象才能用里面的电话维度静态方法static修饰实例方法无static归属属于类本身属于对象实例调用方式直接类名.方法名()调用必须先new对象通过对象调用能访问的内容只能直接访问静态成员不能用this/super所有成员都能直接访问加载时机类加载时就存在对象创建时才存在进阶理解为什么静态方法不能被重写二者绑定机制不同静态方法静态绑定编译期就确定看变量的声明类型实例方法动态绑定运行时才确定看对象的实际类型代码验证class Father { public static void staticMethod() { System.out.println(父类静态方法); } public void instanceMethod() { System.out.println(父类实例方法); } } class Son extends Father { public static void staticMethod() { System.out.println(子类静态方法); } Override public void instanceMethod() { System.out.println(子类实例方法); } } // 测试 Father f new Son(); f.staticMethod(); // 输出父类静态方法看声明类型Father f.instanceMethod(); // 输出子类实例方法看实际类型Son6. 方法在 JVM 中的执行过程底层原理入门阶段可跳过不影响写代码通俗理解每次做菜厨房分配一张临时操作台栈帧上面摆原料、草稿纸。菜做好后端出去操作台就清空腾给下一道菜。每次调用方法JVM 都会在虚拟机栈里创建一个「栈帧」压入栈顶栈帧包含4部分局部变量表存方法的参数、局部变量操作数栈做运算的临时空间动态链接定位方法的内存地址返回地址方法执行完回到调用方的位置方法执行完栈帧就出栈销毁内存自动释放。⚠️ 注意递归层级太深栈帧太多超过栈容量就会抛出StackOverflowError栈溢出错误。7. 方法设计最佳实践进阶理解写代码久了自然会有体会入门先了解即可通俗理解好菜谱一页纸写完步骤清晰不跳跃原料别太多容易搞混过敏原标清楚名字一看就懂。单一职责一个方法只做一件事短小精悍尽量控制在50行以内太长就拆分参数精简参数不超过5个太多就封装成对象防御式校验入口处校验参数合法性提前拦截非法数据见名知意动词开头不用拼音和不明缩写分支全覆盖有返回值的方法所有执行分支都要有return8. 核心红线汇总表复习专用坑点详细说明返回值不算方法签名不能靠返回值不同做方法重载直接编译报错private方法不能重写子类看不到父类私有方法同名只是子类自己的新方法静态方法不能重写静态绑定子类同名只是隐藏父类方法没有多态构造方法不能加返回值连void都不能加加了就变成普通方法Java只有值传递引用类型传的是地址副本重新赋值不影响外部原引用抽象方法没有方法体连大括号都不能有必须分号结尾有抽象方法的类必须是抽象类this()/super()必须在构造方法首行调用本类/父类构造方法必须放第一行二者不能同时用return之后不能写代码属于不可达代码直接编译报错静态方法不能用this/super静态方法不依赖对象this代表当前对象逻辑冲突接口方法默认public abstract不写修饰符也是公共抽象的Java 9之后才支持私有方法ps我会比较喜欢今天的这种风格本身学习对于普通人来讲就是一件不容易的事情是否容易理解还是很重要的不懂的术语结合起来去解释另外一个术语真的会打击学习者的兴趣