跳转到主内容
极星编程网:以代码为星,赴技术山海!

在Java里extends关键字如何使用_Java类继承语法说明

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

相关文章