在Java中创建子类是面向对象编程的核心概念之一,通过继承(Inheritance)实现代码复用和层次化设计,以下是详细步骤和关键要点:
子类创建基础步骤
-
定义父类(超类)
子类需继承一个已存在的父类,例如定义Animal
类:public class Animal { // 父类 private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + "正在吃东西"); } }
-
使用
extends
关键字创建子类
通过extends
继承父类的属性和方法:public class Dog extends Animal { // 子类 private String breed; // 子类特有属性 // 子类构造方法需调用父类构造方法 public Dog(String name, String breed) { super(name); // 调用父类构造方法 this.breed = breed; } // 子类新增方法 public void bark() { System.out.println("汪汪叫!"); } // 重写父类方法(方法覆盖) @Override public void eat() { super.eat(); // 可选:调用父类方法 System.out.println("狗狗用狗盆吃饭"); } }
关键语法规则
关键字/概念 | 作用 | 示例 |
---|---|---|
extends |
声明继承关系 | class Dog extends Animal |
super |
调用父类构造方法或成员 | super(name) |
@Override |
标注方法重写(非强制但推荐) | @Override public void eat() |
构造方法规则 | 子类构造方法必须先调用父类构造方法 | 首行写super(...) |
继承中的核心特性
-
方法重写(Override)
- 子类可重新定义父类方法(需相同方法签名)
- 使用
@Override
注解提高可读性 - 父类方法需非
private
/final
(如父类方法为final void eat()
则禁止重写)
-
访问权限控制
- 子类可访问父类
public
/protected
成员 - 父类
private
成员对子类不可见(需通过getter
/setter
访问)
- 子类可访问父类
-
单继承限制
Java不支持多继承(一个子类只能有一个直接父类),但可实现多个接口:public class Dog extends Animal implements Pet, GuardAnimal { // 实现接口方法... }
实际应用场景示例
场景:电商系统用户管理
// 父类:基础用户 class User { private String email; public User(String email) { this.email = email; } public void login() { System.out.println("用户登录"); } } // 子类1:普通客户 class Customer extends User { private int loyaltyPoints; public Customer(String email) { super(email); } @Override public void login() { super.login(); System.out.println("显示优惠券"); } } // 子类2:管理员 class Admin extends User { public Admin(String email) { super(email); } @Override public void login() { System.out.println("管理员权限验证"); } public void auditOrder() { // 子类特有方法 System.out.println("审核订单"); } }
常见错误及规避
-
构造方法未调用
super
错误提示:“Implicit super constructor is undefined”
解决:子类构造方法首行必须显式调用super(...)
-
意外隐藏父类字段
错误示例:class Parent { int value = 10; } class Child extends Parent { int value = 20; } // 字段隐藏(非重写)
建议:使用
getter
/setter
替代直接字段访问 -
破坏里氏替换原则
避免子类改变父类行为逻辑(如父类calculateArea()
应保持数学一致性)
继承设计最佳实践
-
优先使用组合而非继承
当不存在”is-a”关系时(如Car
不是Engine
的子类),用组合:class Car { private Engine engine; // 组合关系 }
-
抽象类与接口选择
- 需要代码复用 → 用抽象类(可包含具体方法)
- 需要多继承/定义行为契约 → 用接口
-
深度继承限制
继承层次不超过3层(过度继承导致代码脆弱)
权威引用说明遵循Oracle官方Java教程[1]的继承规范,设计原则参考Joshua Bloch《Effective Java》[2]第18条”组合优先于继承”,代码示例符合Java SE 17语法标准[3]。
参考资料
[1] Oracle Java Docs: Inheritance
[2] Bloch, J. Effective Java. Addison-Wesley, 2018.
[3] Java Language Specification: Chapter 8. Classes
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/35602.html