重载是编译期静态绑定,依据参数类型、数量、顺序选择方法,与对象实际类型无关;重写是运行期动态绑定,依据对象实际类型通过虚方法表跳转,要求方法签名一致且非private/static/final。

重载和重写的核心区别,就落在“谁在什么时候、依据什么做决定”上:重载是编译器在写完代码那一刻就锁死调用目标;重写是JVM在程序跑起来、看到对象真身之后才跳转到对应实现。
重载:编译期静态绑定,只看参数,不看对象
编译器只检查你传了什么类型、几个、什么顺序的实参,然后在当前类里所有同名方法中挑出唯一匹配的一个,生成固定指令。哪怕写的是 Animal a = new Dog();,调用 a.print(42),也只按 Animal 类里有没有 print(int) 来选,完全不关心右边是不是 Dog。
- 仅靠返回值不同(比如
int foo()和String foo())不能构成重载,编译直接报错 - 访问修饰符、异常声明、返回值类型,统统不参与重载判断
- private / static / final 方法可以被重载,但不能被重写
重写:运行期动态绑定,只看对象,不看引用
JVM 不认你声明的类型,只认堆里那个对象实际属于哪个类。它通过虚方法表(vtable)在运行时查表跳转。还是 Animal a = new Dog();,调用 a.speak() 时,JVM 发现 a 实际是 Dog 实例,于是执行 Dog::speak(),不是 Animal::speak()。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 必须满足签名一致(方法名 + 参数列表),返回值可协变(如父类返回
Object,子类可返回String) - private、static、final 方法不进虚方法表,无法参与动态分派,写了同名方法也只是定义新方法,不是重写
- 字段访问永远不重写——子类定义同名字段,访问的仍是引用声明类型的字段,这是静态绑定的铁律
两者共存时:先重载,再重写
一个调用语句可能同时触发两层机制。例如,父类 Animal 有 speak() 和 speak(String msg),子类 Dog 重写了 speak()。那么:
立即学习“Java免费学习笔记(深入)”;
-
a.speak()→ 先按重载规则确认调用无参版本,再按重写规则执行Dog::speak() -
a.speak("hello")→ 先按重载规则确认调用带参版本,若子类没重写该签名,则仍执行Animal::speak(String)
绑定时机不同,行为就完全不同:重载结果编译完就定死了;重写结果直到对象创建出来那一刻才揭晓。

















