Java类单继承且不可继承final类;私有成员存在但不可见;@Override是编译期契约,防止重写失效;多态仅适用于非static、非final、非private的实例方法,调用由运行时类型决定。

子类继承父类时,extends 关键字的使用限制
Java 中一个类只能单继承,即只能用 extends 指定一个直接父类。试图写成 class A extends B, C 会直接编译失败,报错:error: class A inherits from multiple classes(实际错误信息为 error: '{' expected 或更明确的 multiple inheritance not allowed)。
如果需要复用多个类型的行为,应改用 implements 实现接口。接口可多实现,例如:class Dog implements Runnable, Comparable 是合法的。
-
final类不能被继承,声明为final class Utils后,任何extends Utils都会编译报错 - 构造方法不会被继承,子类必须显式调用
super(...)(或隐式调用无参super()),否则编译器会插入默认无参调用——若父类没无参构造器,就会报constructor X in class Y cannot be applied to given types - 私有成员(
private字段/方法)虽在子类中不可见,但依然存在于子类对象内存布局中;只是无法通过this.xxx或super.xxx直接访问
@Override 注解不是可选的“装饰”,而是编译期契约
重写父类方法时加不加 @Override 看似没区别,但漏写可能导致严重隐患:比如父类方法签名后期修改(如参数从 int 改为 long),子类未同步更新,又没加 @Override,编译器不会报错,结果变成定义了一个新方法,而非重写——多态调用时依旧执行父类逻辑,行为悄然偏离预期。
此外,@Override 还能防止拼写错误,例如把 toString() 错写成 toStirng(),不加注解时编译通过但毫无作用;加上后立即报 method does not override or implement a method from a supertype。
立即学习“Java免费学习笔记(深入)”;
- 仅适用于实例方法(含抽象方法实现),不能用于
static方法——静态方法“重写”实为隐藏(hiding),加@Override会编译失败 - 不能用于构造方法、字段、局部变量
- 接口默认方法(
default)和静态方法(static)被实现类重写时,也必须加@Override
多态调用的实际分派机制:编译时类型 vs 运行时类型
变量声明类型(编译时类型)决定**能调用哪些方法**,而实际指向的对象类型(运行时类型)决定**执行哪个版本的方法**。这是理解多态行为的关键分水岭。
淘宝互刷平台刷信誉源码主要特性:1、系统采用国内著名CMS内核做为基础模块化开发,继承CMS原有强大功能之外,同时拓展任务模块、快递单模块、会员模块、信用评价模块等多个相关模块,支持生成HTML静态和动态ASP,有效的提高了系统的性能,不仅减轻服务器的负载提高搜索收录率,增加网站收录。2、系统主要由淘宝任务、天猫任务、京东任务、阿里任务、拼多多任务、收藏任务、流量任务、快递单生成与查询系统、信用评
Animal a = new Dog(); a.eat(); // ✅ 编译通过(Animal 有 eat()),运行时调用 Dog.eat() a.bark(); // ❌ 编译失败:Animal 类没有 bark() 方法,哪怕 a 实际是 Dog
常见误解是认为“只要对象是子类,就能调用子类特有方法”——错。必须通过子类引用或向下转型才能访问:
- 安全做法:先用
instanceof判断,再(Dog) a强转(注意空指针风险) - 更现代写法:用
if (a instanceof Dog dog)(Java 14+ 模式匹配),此时dog是已转换的局部变量 - 字段访问不具多态性:若
Animal.name和Dog.name都存在,a.name永远取Animal.name的值,与运行时类型无关
多态与 static / final / private 方法的关系
这三类方法在 Java 中都不参与动态绑定,即不支持多态。它们的调用目标在编译期就完全确定。
例如:
class Animal {
static void sleep() { System.out.println("Animal sleep"); }
final void breathe() { System.out.println("Animal breathe"); }
private void hunt() { System.out.println("Animal hunt"); }
}
class Dog extends Animal {
static void sleep() { System.out.println("Dog sleep"); }
final void breathe() { System.out.println("Dog breathe"); } // 编译错误!final 方法不能重写
private void hunt() { System.out.println("Dog hunt"); } // ✅ 合法,但这是新方法,与父类 hunt() 无关
}
-
static方法属于类,调用看的是引用的**编译时类型**:Animal a = new Dog(); a.sleep();输出Animal sleep -
final方法禁止重写,因此不存在“选择哪个版本”的问题;子类中同名方法会被编译器拒绝(除非是重载) -
private方法隐式具有final语义,且对子类不可见,子类里写的同名方法本质上是全新方法,跟父类毫无关系
真正参与多态的,只有非 static、非 final、非 private 的实例方法——而且前提是它们在继承链中被正确定义和重写。









