Java继承核心要点:一文掌握精髓
写完也是肝炸了.....在Java的世界里继承Inheritance是面向对象编程OOP的三大基石之一。简单来说它允许一个类子类继承另一个类父类的属性和方法。你可以把它想象成现实生活中的“父子关系”儿子继承了父亲的姓氏和房产但儿子也可以有自己独特的一面。1️⃣.包 (Package) 的作用一. 包的核心作用1.解决重名冲突命名空间如果没有包,全中国有1000个叫“张三”的人,快递员根本不知道送给谁.但在java中:com.taobao.张三com.jd.张三只要前缀(包名)不同,名字再怎么重名,Java也能精准定位简单来说包Package 就是 Java 里的“文件夹”或“命名空间”。想象一下全世界有无数程序员在写代码。如果没有包大家都写一个 User 类Java 编译器就会疯掉。有了包你可以叫 com.companyA.User我可以叫 com.companyB.User。虽然类名一样但“地址”不同互不干扰。2.控制访问权限封装在继承中包主要涉及访问权限·如果父类和子类在同一个包子类可以访问父类中 default默认不写权限及以上的成员。·如果不在同一个包子类只能访问 public 和 protected 的成员。protected 就是专门为继承设计的它允许不同包的子类访问但拒绝非子类的外部访问。· protected 是专门为继承设计的。如果你希望某个方法只给“亲儿子”用即便儿子搬到了别的包去住但不给“外人”用那就用 protected。3. 实际开发中的规范在 Java 开发中包名通常是公司域名的反写。路径示例src/main/java/com/baidu/project/util/StringHelper.java代码声明在文件的第一行必须写上 package com.baidu.project.util;。4. 如何使用别的包(import)如果你想在自己的类里用别人包里的类你有两个选择写全称太累java.util.ArrayList list new java.util.ArrayList();导包主流在类定义前写 import java.util.ArrayList;后面直接写 ArrayList 即可。冷知识java.lang 包包含 String, System 等是默认自动导入的所以你从来不需要写 import java.lang.String。之所以要聊“包”是因为如果你把子类写在了和父类不同的包里那么父类中那些没有写修饰符default的成员子类就拿不到了。这也是为什么很多初学者发现 extends 之后还是报错的原因。2️⃣.继承的核心概念父类(Superclass/ParentClass):被继承的类,提供通用的特征子类(Subclass/Child Class):继承父类的类,可以拥有父类的所有非私有属性和方法,还能增加自己的特有功能关键字extends1.为什么要使用继承?1.代码复用:不需要在每个类里重复写相同的代码.如果多个类有共同点,就把他们提取到父类中.2.方法重写:子类可以根据需要,重新定义父类的方法,实现“青出于蓝而胜于蓝”3.多态的基础:继承是实现多态的前提2. 基本语法class 父类 { // 属性、方法 } class 子类 extends 父类 { // 新增属性、新增方法 }class Animal { String name; public void eat() { System.out.println(this.name 吃东西); } } class Dog extends Animal { // 自动拥有 name 和 eat() public void bark() { System.out.println(this.name 汪汪叫); } }使用Dog dog new Dog(); dog.name 旺财; dog.eat(); // 继承来的方法 dog.bark(); // 自己的方法结果:旺财吃东西旺财汪汪叫3. 核心特点单继承Java 一个子类只能继承一个父类不能多继承。多层继承可以 A 继承 BB 继承 C。构造方法不能继承子类必须通过super()调用父类构造。(下面讲解)私有成员private不能继承子类不能直接访问父类 private 变量 / 方法。方法重写Override子类可以重新实现父类的方法。4. super 关键字super.成员访问父类属性 / 方法super()调用父类构造方法必须在子类构造第一行class Animal { public Animal(String name) { } } class Dog extends Animal { public Dog() { super(小狗); // 必须写第一行 } }2. 为什么必须确保父类也被正确初始化这是 Java 设计的核心原则子类是基于父类的“扩展”。子类往往会用到父类的属性或方法。如果父类没有初始化那么子类在使用从父类继承来的东西时就会遇到空指针或未定义的状态。3. 调用父类构造器 (super)① 是通过 super() 关键字在子类构造方法的第一行显式地去调用父类的某个构造方法。②为了完成上面提到的“父类初始化”。如果你不写 super()编译器会默认帮你加一行隐式的 super();调用父类的无参构造。但如果父类只有带参构造你就必须手动写 super(参数)否则程序编译不通过。③ 参数还要对应是的。 super() 括号里的参数类型、个数、顺序必须和父类中定义的某个构造方法完全匹配。4. final 关键字在继承语境下final 有两个核心作用修饰类final class A {} 表示这个类是“太监类”不能被继承比如 Java 里的 String 类。修饰方法final void method() {} 表示这个方法不能被子类重写。这通常用于保护某些核心逻辑不被子类胡乱修改。5. 方法重写Override子类方法与父类方法名、参数列表、返回值一致。Override public void eat() { System.out.println(狗啃骨头); }必须加Override注解校验权限不能比父类更严格父类 public子类不能 private