extends只能用于类继承,不能修饰接口或方法;它表示子类单继承父类,接口继承用implements,Java不支持多类继承,final类不可被继承,子类构造器必须调用父类构造器。
extends 只能用于类继承,不能修饰接口或方法
Java 中
是类与类之间建立单继承关系的唯一关键字,它明确表示“子类扩展父类”。你不能用它去实现接口(该用
),也不能用它修饰字段、方法或局部变量——编译器会直接报错
或
。
常见误写:
一个类最多只能有一个直接父类(
后只能跟一个类名)
如果类没写
,默认隐式继承
类不能被
,否则编译失败:
子类构造器必须显式或隐式调用父类构造器
只要用了
,子类所有构造器的第一行(哪怕没写)都必须是
或
。如果父类没有无参构造器,而子类构造器又没显式调用
,编译就会失败:
。
示例:
立即学习
“
Java免费学习笔记(深入)
”;
若父类只有有参构造器,子类每个构造器都得显式写
必须是构造器第一句;放在第二句会报
不写
也不写
时,编译器自动插入
—— 所以父类必须存在无参构造器
继承后无法访问父类 private 成员,但可调用 public/protected 方法
子类通过
获得的是父类的“可见接口”,不是全部代码拷贝。
字段和方法在子类中不可见,连编译都过不去;但
和
成员可直接使用(除非被子类同名成员隐藏)。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
典型混淆点:
成员不会被继承,子类里查不到、不能重写、也不能反射直接访问(除非设
,但那是另一回事)
子类定义了同名
方法,并不叫“重写
方法”——因为父类那个根本不可见,这只是个全新方法
字段永远不被重写(只有方法才谈重写),子类同名字段只是隐藏(hiding),不是覆盖
泛型类继承需注意类型擦除与桥接方法
带泛型的父类被继承时,子类是否保留泛型、如何指定类型参数,直接影响方法签名和多态行为。Java 在编译期擦除泛型,但会生成桥接方法(bridge methods)来保证多态调用正确性——这点容易在重写泛型方法时出问题。
例如:
子类若写
(原始类型),虽然能编译,但失去类型安全,且无法重写
的具体版本
若父类方法签名含泛型类型(如
),子类重写时不能改类型参数名或约束,否则视为新方法而非重写
IDE 或
可看到桥接方法,它们对开发者透明,但调试时可能困惑“为什么断点进了两个同名方法”
子类能否访问父类成员、构造器怎么联动、泛型如何传递——这些不是靠记住
写在哪行,而是取决于它触发的那套继承契约。最容易忽略的是:父类构造器调用规则和
的“不可继承性”,这两点一旦出错,往往报错信息不直观,需要回溯到继承链起点看声明。
extendsimplementsillegal start of typeunexpected tokeninterface B extends A {} // ❌ 错!接口继承接口应使用 extends,但这里 A 若是类就非法;若 A 是接口,语法虽对,但语义不符本题场景(本题聚焦类继承)
class C extends void method() {} // ❌ 完全语法错误
class D extends E, F {} // ❌ Java 不支持多类继承extendsextendsjava.lang.Objectfinalextendscannot inherit from final 'X'extendssuper(...)this(...)super(…)constructor X in class Y cannot be applied to given typesclass Parent {
Parent(String name) { /* 仅此有参构造 */ }
}
class Child extends Parent {
Child() {
// ❌ 编译错误:找不到合适的 super()
// ✅ 必须补上:super("default");
}
}super(...)super()call to super must be first statementsuper(...)this(...)super()extendsprivateprotectedpublicclass A {
private int x = 10;
protected void print() { System.out.println(x); }
}
class B extends A {
void test() {
// System.out.println(x); // ❌ 编译错误:x has private access in A
print(); // ✅ OK,protected 方法可继承并调用
}
}privatesetAccessible(true)publicprivateclass Box {
T value;
void set(T v) { value = v; }
}
class StringBox extends Box {
@Override
void set(String v) { super.set(v); } // ✅ 正确重写
// 编译器会自动生成 bridge 方法:void set(Object o) { set((String)o); }
} class StringBox extends Boxset(T) U convert(U input)javap -cextendsprivate