java多态核心是编译时类型决定可访问成员,运行时类型决定方法执行体;字段、static、private、final成员不参与多态,仅非static非private非final实例方法动态绑定。

Java 中多态的核心,就是编译时类型和运行时类型不一致时产生的行为差异。简单说:编译时看左边(声明类型),运行时看右边(new 出来的对象类型)。
编译时类型决定“能写什么”
编译时类型由变量声明时的类型决定,它决定了你**能访问哪些字段、能调用哪些方法**。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只能调用该类型中定义的方法(哪怕子类有同名方法但父类没声明,也不能直接调用)
- 访问实例变量时,永远取编译时类型所定义的那个字段(字段不参与多态)
- 调用静态方法或 private / final 方法,也只看编译时类型
运行时类型决定“实际执行谁”
运行时类型是 new 出来的具体对象类型,它决定了**哪个类的方法体真正被执行**(前提是该方法满足多态条件)。
- 只有非 static、非 private、非 final 的实例方法才参与动态绑定
- JVM 在运行时从对象的实际类型开始查找方法:先找子类,没有就往上找父类,直到 Object
- 如果子类重写了该方法,就执行子类版本;否则执行继承链上第一个找到的实现
典型代码一眼看懂区别
看这段经典例子:
class Animal {String name = "animal";
void speak() { System.out.println("Animal speaks"); }
}
class Dog extends Animal {
String name = "dog";
void speak() { System.out.println("Woof!"); }
}
public class Test {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a.name); // 输出 "animal"(字段看编译时类型)
a.speak(); // 输出 "Woof!"(方法看运行时类型)
}
}
常见误区提醒
- 字段访问不是多态——a.name 永远是 Animal 类里的 name,哪怕 a 实际是 Dog 对象
- static 方法调用不是多态——Animal a = new Dog(); a.staticMethod() 调用的是 Animal 的 staticMethod
- 向下转型前必须确保运行时类型匹配,否则抛 ClassCastException
- 多态的前提是存在继承或实现关系,并完成向上转型(如 Animal a = new Dog())
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










