深入剖析 Vue 中 computed 和 watch 的区别

Java 子类与超类通俗解析——新手也能秒懂

想象一下,你去买手机:

  • 你买了一台基础款的 iPhone(叫它“手机”)
  • 后来你又买了 iPhone 16 ProiPhone 16 Pro Max

iPhone 16 Pro 就是“子类”,iPhone 就是“超类”(也叫父类、基类、parent class)。

为什么这么说?

因为 iPhone 16 Pro 直接继承了普通 iPhone 的所有基本功能:

  • 打电话
  • 发微信
  • 上网
  • 拍照(虽然拍得更好)
  • 玩游戏

同时它还自己加了很多新东西

  • 更好的相机
  • 更强的处理器
  • 钛金属边框
  • 更大的屏幕

这就是继承的核心思想:子类拥有超类的一切,还能扩展自己独有的功能。

一、超类(Superclass / 父类 / 基类)和子类(Subclass / 子类 / 派生类)到底是什么?

叫法英文通俗理解谁是谁的“爹”
超类Superclass爸爸、老祖宗
父类Parent class爸爸
基类Base class基础模板
子类Subclass儿子、后代继承自超类
派生类Derived class从别人派生出来的同上
扩展类Extended class在别人基础上扩展出来的同上

一句话总结:
子类 = 超类 + 自己独有的东西

二、最简单的代码例子(动物世界版)

// 这是超类(父类)—— 所有动物的“爸爸”
class Animal {
    String name;           // 名字(所有动物都有)
    int age;               // 年龄(所有动物都有)

    // 所有动物都会吃东西
    void eat() {
        System.out.println(name + " 在吃东西~");
    }

    // 所有动物都会睡觉
    void sleep() {
        System.out.println(name + " 在睡觉 Zzz...");
    }
}

// 子类1:狗狗,继承了 Animal
class Dog extends Animal {
    String breed;          // 狗狗独有的:品种

    // 狗狗独有的行为
    void bark() {
        System.out.println(name + " 在汪汪叫!");
    }

    // 可以重写(覆盖)父类的方法,让它更符合狗狗
    @Override
    void eat() {
        System.out.println(name + " 在疯狂啃骨头!");
    }
}

// 子类2:猫咪,也继承了 Animal
class Cat extends Animal {
    boolean isFat;         // 猫咪独有的:是否肥宅

    void meow() {
        System.out.println(name + " 在喵喵叫~");
    }

    @Override
    void eat() {
        System.out.println(name + " 在优雅地舔猫罐头...");
    }
}

测试代码

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "旺财";
        dog.age = 3;
        dog.breed = "金毛";

        dog.eat();     // 输出:旺财 在疯狂啃骨头!
        dog.sleep();   // 输出:旺财 在睡觉 Zzz...  (继承自父类)
        dog.bark();    // 输出:旺财 在汪汪叫!

        Cat cat = new Cat();
        cat.name = "小橘";
        cat.age = 2;
        cat.isFat = true;

        cat.eat();     // 输出:小橘 在优雅地舔猫罐头...
        cat.sleep();   // 继承自父类
        cat.meow();    // 猫咪独有
    }
}

三、继承到底给了我们什么?(核心好处)

好处通俗解释代码体现
代码复用写一次,吃一辈子子类不用重复写 eat()、sleep()
统一管理改了爸爸,所有儿子都变改 Animal 的 eat() 所有动物都受影响
扩展性强想加新动物?再写一个子类就行新建 Bird extends Animal 即可
多态的基础儿子可以假装是爸爸Animal a = new Dog();
层次结构清晰像家谱一样,一目了然动物 → 哺乳动物 → 犬科 → 狗

四、继承中非常重要的几个规则(新手最容易踩坑)

  1. Java 只支持单继承
    一个儿子只能认一个爹(extends 后面只能写一个类)
    错误写法:class Dog extends Animal, Pet {} → 编译报错
  2. 子类可以访问什么?
  • public / protected → 可以直接用
  • 默认(包访问)→ 同包可以
  • private → 不能直接访问(但可以通过 public/protected 方法间接访问)
  1. 构造方法不继承
    子类构造方法会自动先调用父类的无参构造(隐式调用 super())
    如果父类没有无参构造,必须显式写 super(参数) 放在第一行
   class Animal {
       Animal(String name) { ... }
   }

   class Dog extends Animal {
       Dog() {
           super("旺财");   // 必须写在第一行!
       }
   }
  1. 方法重写(Override)
    子类可以把父类的方法“改写”成自己的版本
    记住:方法名、参数列表完全一样,返回类型尽量一致(可以是子类型)
  2. super 关键字(超级重要!)
  • super.属性/方法() → 调用父类的属性或方法
  • super() → 调用父类的构造方法(必须第一行)

五、一句话总结(背下来就秒懂)

超类(父类)是模板,子类是模板的升级版 + 个性化定制。
子类 = 超类拥有的全部(非 private) + 子类自己新增的 + 子类想改的(重写)

就像:
手机 = 基础功能
智能手机 = 手机 + 触屏 + App + 摄像头 + 指纹解锁……

现在你是不是觉得“子类”和“超类”没那么神秘了?

有任何地方没懂的,比如:

  • 多态怎么用?
  • super 和 this 区别?
  • 为什么 private 不能继承?
  • 接口和抽象类又是什么?

直接问我,我继续用最接地气的例子给你讲~

文章已创建 4466

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部