第13篇 继承知识点综合
1.继承
- java 只有单继承 关键字:extends
class A{}//父类 class B extends class A{}//子类B继承了A类
2.继承权限
-
相较于C++ 的public,protected, private,java对不写继承的default的定义不一样:
- c++ default = private
- Java不写则默认是 default,是一个新的权限, 所以 Java 有四种 public,protected, private,default。
-
default :包访问权限
默认访问权限没有关键字,通常被称为包访问权限 (packageaccess) (有时也称为friendly)。- 这意味着当前包中的所有其他类都可以访问那个成员。对于这个包之外的类,这个成员看上去是private 的。
- 由于一个编译单元(即一个文件)只能隶属于一个包,所以通过包访问权限,位于同一编译单元中的所有类彼此之间都是可访问的。包访问权限可以把相关类聚到一个包下,以便它们能轻易地相互访问。
3.访问调用逻辑
-
子类获取到了父类声明中的全部属性与方法(构造器除外,构造器只能被子类调用)。但是受到封装性的影响,可能不能直接调用。
-
在子类方法中访问一个变量或者方法:最先在子类局部范围找,如果没有就在子类成员范围找,最后在父类成员范围找,
如果都没有就报错(不考虑父亲的父亲之类的祖先) -
勘误
:上面这条查找关系的逻辑错误,正确情况是:子类中如果没找到,会去父类中查找,如果还是没有会一直查到 Object 类为止,还是没有才会报错。如果其中有祖先有定义了待查的变量或者方法,但是没给访问权限,会停止溯源直接报错。- 其实很好理解,因为子类继承了父类的信息,所以子孙也拥有祖先的信息才对,可以套娃式地溯源是理所应当的
- 理解是这么理解,和实际上方法和变量在JVM的继承的实现逻辑还是有一点区别的,实例对象由对象头、示例数据、对齐填充三个字段构成。对象头存了Klass指向当前类的定义(该定义存了指向父类的定义的指针),实例数据字段存的才是包括父类在内的实例变量。所以方法的溯源和变量的溯源在实际中还是有区别的。
4. Object类
Java 中所有类都会继承Object类,无论程序中有没有显式写明这种继承关系。有点像JS对象中的原型prototype的prototype即Object。
5. Super关键字
加了super 关键字后 同名 属性 或者 方法 直接直接指向 父类
class Person{ String name; } Class Man extends Person{ String name; void showName(String name){ System.out,println(name);//指向形参name System.out.println(this.name);//指向当前实例 Person 中的name System.out.println(super.name);//指向父类Person的name } }
6. this()与super()
-
定义:
-
this()是调用当前类的构造器,()内带参数就是有参构造,无参数就是无参构造
-
super()是调用父类的构造器,()内带参数就是有参构造,无参数就是无参构造
-
-
作用:
- 子类继承父类时,不会继承父类的构造器,只能通过super(形参列表)的方式调用父类指定的构造器
- 子类想要扩展构造器初始化更多的实例变量,通常可以用this(形参列表)来避免代码的重复
-
使用方式:
-
super(形参列表)必须放在构造器方法体的首行, this(形参列表) 亦是如此
- 子类构造器首行可以是 this(形参列表) 或者 super(形参列表),不写的话编译器去就默认添加 super()无参
- this(形参列表) 和 super(形参列表) 都要求放首行,所以想要显式调用,只能二选一。
-
推论
-
子类须要调用 super(形参列表),所以子类至少有一个构造器满足第一行调用了 super(形参列表)
-
子类如果有构造器首行显式调用了this(形参列表) ,则一定嵌套调用了一个带 super(形参列表)的构造器
-
-
7.多继承
- java 的类没有多继承,只有单继承
- java 的接口可以多继承
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!