Java的继承只允许单继承,我个人认为这有局限。
一、基础
- 继承作用
抽取多个类重复代码,实现代码复用;建立父子类关系,为多态提供基础。
关键字:extends
Java 类只允许单继承,一个子类只能直接继承一个父类 - 基础语法
运行
// 父类
public class Animal {
public void eat(){
System.out.println("动物进食");
}
}
// 子类
public class Dog extends Animal {
public void bark(){
System.out.println("小狗吠叫");
}
}
// 测试
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承父类方法
dog.bark(); // 自身独有方法
}
}
3. 成员访问规则
public:子类可直接访问
protected:同包内、任意子类可以访问
private:子类无法直接访问。父类私有变量客观存在于子类对象,只能通过父类提供的 public/protected 方法操作。
4. super 关键字
super:代表父类对象
super.变量名:访问父类成员变量
super.方法名():调用父类成员方法
super():调用父类构造方法
硬性规则:
子类构造方法第一行默认隐藏 super (),调用父类无参构造;
父类没有无参构造,子类必须手动书写super(参数),否则编译报错。
二、中级:方法重写 Override
- 概念
子类拥有和父类方法名、参数列表一致的方法,重新实现逻辑。
java
运行
public class Animal {
public void eat(){
System.out.println("动物进食");
}
}
public class Cat extends Animal{
@Override // 注解,校验重写格式,建议永远带上
public void eat() {
System.out.println("猫咪吃鱼");
}
}
2. 重写规则
方法名、参数列表必须完全一致
返回值支持协变返回类型
重写方法访问权限不能比父类更加严格
不能重写:private、static、final修饰的方法
区分
重载 (Overload):同一个类内部,同名不同参数
重写 (Override):父子类之间
3. this 与 super 限制
this() 调用本类其他构造;super()调用父类构造
两者都必须放在构造方法第一行
this () 和 super () 不能同时写在一个构造方法中
三、进阶知识点
- final 和继承
final class 类名:类不能被继承
final 方法:方法禁止被子类重写
final 变量:常量,赋值后不可修改 - 单继承拓展方案:接口 interface
类只能单继承,但是一个类可以同时实现多个接口,弥补单继承局限。
java
运行
interface Run{}
interface Swim{}
public class Duck extends Animal implements Run, Swim{
}
3. 多态(继承核心应用)
条件:存在继承关系 + 方法重写 + 父类引用指向子类对象
java
运行
Animal animal = new Dog();
animal.eat(); // 运行执行子类重写后的方法
4. 重要坑:成员变量没有重写
成员变量只有隐藏遮蔽,不存在重写。
变量访问看引用类型;方法执行看实际对象。
java
运行
class A{
int num = 10;
}
class B extends A{
int num = 20;
}
public class Test{
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.num); //输出10
}
}
5. Object 根类
所有 Java 类默认直接或间接继承java.lang.Object
常用可重写方法:
toString():对象字符串描述
equals():对象比较
hashCode():获取哈希值
6. 对象初始化顺序(面试高频)
创建子类对象完整顺序:
父类静态代码块
子类静态代码块
父类成员变量、构造代码块
父类构造方法
子类成员变量、构造代码块
子类构造方法
四、开发规范
遵循 is-a 原则:Dog is Animal,适合使用继承;
开发通用准则:组合优先于继承;
不要单纯为了复用代码强行使用继承。
五、课后练习方向
练习父类有参构造,子类必须手动 super 传参
练习方法重写 + Override 注解
练习多态写法,理解父子类型转换
练习重写 toString ()
