
一、继承概述继承是面向对象编程的三大特性之一封装、继承、多态。它允许我们基于一个已有的类父类/超类来创建一个新的类子类/派生类。子类会自动拥有父类的属性和方法同时可以定义自己特有的属性和方法或者重写父类的方法以满足新的需求。1.1 继承的作用与好处代码复用子类可以直接使用父类中已定义好的属性和方法无需重复编写。提高可维护性公共逻辑集中在父类修改时只需改动一处。建立类之间的层次关系使得代码结构更清晰更符合现实世界的逻辑如“学生”是一种“人”。1.2 继承的语法在Java中使用extends关键字来实现继承。// 父类classAnimal{Stringname;publicvoideat(){System.out.println(name正在吃东西);}}// 子类继承父类classDogextendsAnimal{publicvoidbark(){System.out.println(name汪汪叫);}}在上面的例子中Dog类通过extends Animal继承了Animal类的name属性和eat()方法。因此Dog对象可以直接使用这些成员。二、this 关键字详解this关键字代表当前对象的引用。它可以在类的实例方法或构造器中使用。2.1 this 的主要用途1. 区分成员变量与局部变量当方法的形参或局部变量与类的成员变量同名时使用this.变量名来明确指代成员变量。classPerson{privateStringname;// 成员变量publicvoidsetName(Stringname){// 局部变量形参this.namename;// 将局部变量name的值赋给成员变量this.name}publicStringgetName(){returnthis.name;// 返回当前对象的name属性}}2. 在构造器中调用其他构造器在一个构造器内部可以使用this(参数列表)来调用本类的另一个构造器。此调用必须是构造器内的第一条语句。classStudent{privateStringname;privateintage;publicStudent(){this(未知,0);// 调用本类的双参构造器}publicStudent(Stringname,intage){this.namename;this.ageage;}}3. 作为方法的返回值有时需要返回当前对象本身以支持链式调用。classCalculator{privateintvalue;publicCalculatoradd(intnum){this.valuenum;returnthis;// 返回当前Calculator对象}publicintgetValue(){returnvalue;}}// 链式调用CalculatorcalcnewCalculator();intresultcalc.add(5).add(10).getValue();// result 15三、super 关键字详解super关键字代表对父类对象的引用。它用于在子类中访问父类的成员属性、方法、构造器。3.1 super 的主要用途1. 访问父类的成员变量和方法当子类重写了父类的方法或隐藏了父类的成员变量时可以使用super.成员名来明确调用父类的版本。classAnimal{Stringtype动物;publicvoidsound(){System.out.println(动物发出声音);}}classCatextendsAnimal{Stringtype猫科动物;// 隐藏了父类的type变量Overridepublicvoidsound(){super.sound();// 调用父类的sound方法System.out.println(并且喵喵叫);}publicvoidprintType(){System.out.println(子类type: type);// 输出猫科动物System.out.println(父类type: super.type);// 输出动物}}2. 调用父类的构造器在子类的构造器中可以使用super(参数列表)来调用父类的构造器。此调用必须是子类构造器内的第一条语句。如果子类构造器没有显式调用super(...)或this(...)编译器会自动加上super()调用父类的无参构造器。classVehicle{privateStringbrand;publicVehicle(Stringbrand){this.brandbrand;System.out.println(Vehicle构造器被调用品牌brand);}}classCarextendsVehicle{privateintseats;publicCar(Stringbrand,intseats){super(brand);// 必须放在第一行调用父类有参构造器this.seatsseats;System.out.println(Car构造器被调用座位数seats);}}3.2 this 与 super 的对比特性thissuper指向对象当前类实例对象本身父类实例在子类对象中主要用途1访问本类的成员变量、方法访问父类的成员变量、方法主要用途2在本类构造器中调用其他构造器在子类构造器中调用父类构造器调用位置必须放在构造器第一行this(...)必须放在构造器第一行super(...)是否可同时存在在同一个构造器中this(...)和super(...)不能同时出现四、继承中的方法重写Override方法重写是子类对父类中允许访问的方法的实现过程进行重新编写。重写是实现多态的关键。4.1 重写的规则方法名、参数列表必须完全相同。返回类型在Java 5及以后子类重写方法的返回类型可以是父类方法返回类型的子类协变返回类型。访问权限子类方法的访问权限不能比父类方法更严格例如父类是protected子类可以是public或protected但不能是private。异常子类方法抛出的异常不能比父类方法抛出的异常更宽泛。被final、static、private修饰的方法不能被重写。4.2 Override 注解建议在重写方法上添加Override注解。这可以让编译器帮助检查该方法是否正确地重写了父类方法避免因拼写错误等原因导致意外的新方法定义。classParent{publicvoidshow(){System.out.println(Parent show);}}classChildextendsParent{Override// 加上注解编译器会检查publicvoidshow(){super.show();// 可选先调用父类逻辑System.out.println(Child show);}}五、综合示例与总结下面通过一个综合示例来巩固理解// 父类classEmployee{privateStringname;privatedoublesalary;publicEmployee(Stringname,doublesalary){this.namename;this.salarysalary;}publicvoidwork(){System.out.println(name正在工作);}publicfinalvoidgetPaid(){// final方法子类不能重写System.out.println(name领取薪水salary);}}// 子类classManagerextendsEmployee{privatedoublebonus;publicManager(Stringname,doublesalary,doublebonus){super(name,salary);// 调用父类构造器初始化name和salarythis.bonusbonus;}Overridepublicvoidwork(){super.work();// 调用父类的work方法System.out.println(并且正在管理团队);}// 不能重写 getPaid() 方法因为它是final的// 但可以新增方法publicvoidholdMeeting(){System.out.println(经理正在主持会议);}}publicclassMain{publicstaticvoidmain(String[]args){ManagermgrnewManager(张三,15000,5000);mgr.work();// 输出张三正在工作 并且正在管理团队mgr.getPaid();// 输出张三领取薪水15000.0mgr.holdMeeting();// 输出经理正在主持会议}}关键总结继承 (extends)建立“is-a”关系实现代码复用和层次化设计。this指代当前对象用于区分同名变量、调用本类构造器、支持链式调用。super指代父类对象用于访问被隐藏的父类成员、调用父类构造器。方法重写 (Override)子类重新定义父类方法的行为是实现运行时多态的基础。构造器调用链子类构造器必须直接或间接调用父类构造器且super(...)或this(...)必须位于第一行。掌握继承、this和super是理解Java面向对象编程的核心也是学习多态、抽象类、接口等高级特性的重要基础。