JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解

简介: JavaSE 面向对象程序设计进阶 继承和方法重写 2024理论与内存详解

继承

面向对象三大特征:封装 继承 多态

封装:对象代表什么,就封装对应的数据,并提供数据对应的行为,把零散的数据变成一个整体

为什么要继承

两个类中重复的代码(数据和方法)太多,所以要继承

extend关键字

类与类之间的父子关系

让一个类和另一个类建立起继承关系

public class Student extends Person{}

student 子类 派生类

preson 父类 基类 超类

继承的好处

1.可以把子类的重复代码放入父类,提高代码的复用性

2.子类可以在父类的基础上,增加其他的功能,使子类更强大

继承怎么用

1.自己设计

2.使用别人

继承注意点

类与类存在共性 子类是父类的一种 可以考虑继承优化代码

设计继承不能全部抽用 要考虑 种类

物品的的名称 人物的名称 不能放到一个父类里面

手机的名称 零食的名称 文具的名称可以放到一个父类里面

继承的特点

1.java只支持单继承

一个子类只能继承一个、去

2.java不支持多继承

一个子类不能同时继承多个父类

3.java能支持多层继承

多层继承不是多继承

子类A可以继承父类B,父类B可以继承父类C,B是A的直接父类,C是A的间接父类

4.Object类

每一个类都直接或者间接的继承于Object(爷爷类 祖宗类)

查看当前类是否有父类,如果没有,虚拟机则会将该类继承到Object类(加一个默认继承关系)

继承练习

学会画图

从下(子类)往上(父类)

共性内容抽取

子类是父类的一种

书写代码时从上往下一个类一个类的写

一个圆圈就是一个类

写完所有类,类属于javabean

然后写main方法

再创建对象,调用类中的方法

如果访问修饰符为private而不是public

私有的成员方法,成员变量只能在本类中被使用

就无法在主类中被调用

子类到底能继承父类中的哪些内容

父类中有什么

构造方法 成员变量 成员方法

构造方法

统称为类的成员 分为非私有和private两种

父类构造方法不能被子类继承 能继承无法调用

因为public修饰的类名要与文件名一致

如果一个类中没有构造方法,虚拟机会给你一个构造方法(空参构造)

一个java文件中只写一个类

成员变量

set方法赋值 get方法获取值

成员方法

子类可以继承父类中的虚方法

继承的内存图

1.记载字节码文件时同时加载父类字节码文件

2.创建对象时 父类 子类 同时在堆内存内开辟空间 树状结构

方法出栈后 堆内存里面的垃圾(对象)会被自动清除

如果父类用中的成员变量用private修饰了 栈里面就找不到堆里面的了 相当于加了保险柜

成员变量的访问特点

就近原则:谁离我近,我就用谁

一级一级往上找

this关键字:指向本类中的成员变量

super关键字:指向父类中的成员变量

super不能链式编程

成员方法的访问特点

还是就近原则

super this 调用

和成员变量访问一样

方法重写

方法重写建立在子类和父类关系上

方法重写的本质

通过虚方法表

覆盖了虚方法中的方法

方法重写的注意事项的要求

1.重写方法的名称形参列表必须与父类中的一致

2.子类重写父类方法时,访问权限子类必须大于等于父类

3.子类重新父类方法时,返回值类型子类必须等于父类

4.重写方法尽量与父类保持一致

5.私有方法不能被重写

6.子类不能重写父类的静态方法,如果重写会报错

重写方法就是在父类的虚方法表里找方法覆盖

方法重写练习

画图法

从下往上 抽取

当父类行为不能满足子类的需求

重写时候用super。调用父类

@override注释可以检验重写是否正确

构造方法的访问特点

特点

1.父类中的构造方法不会被子类继承

2.子类中的所有构造方法默认先访问父类中的无参构造,再执行自己

为什么

1.子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据

2.子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化

怎么调用父类的构造方法

子类构造方法的第一行语句默认是super(),不写也存在,且必须在第一行

super() 访问父类的无参构造

父类中的空参构造是数据初始化

因为父类的属性都共享的被继承的

用子类构造方法中隐藏的super()去访问父类的无参构造

赋值

小结

1.子类不能继承父类的构造方法,但是可以通过super调用

2.子类构造方法的第一行,有一个默认的super()

3.默认先访问父类中无参数的构造方法,再执行自己

4.如果想要方法中父类有参构造,必须手动书写

this 是一个变量 表示当前方法调用者的地址值 局部变量

super 表示父类的存储空间

super 把属性从子类传递给父类进行赋值

目录
相关文章
|
6天前
|
存储 设计模式 Java
JavaSE 面向对象程序设计初级 2024方法变量封装javabean结合内存图详解
JavaSE 面向对象程序设计初级 2024方法变量封装javabean结合内存图详解
14 7
|
2天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
9 0
|
6天前
|
存储 Java
JavaSE 面向对象程序设计初级 静态static 包package 常量final 代码块 代码实操理论内存原理详解
JavaSE 面向对象程序设计初级 静态static 包package 常量final 代码块 代码实操理论内存原理详解
9 0
|
26天前
|
安全 编译器 C语言
【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数
【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数
|
1月前
|
存储 小程序 编译器
C语言进阶—深度剖析数据在内存中的存储
C语言进阶—深度剖析数据在内存中的存储
|
14天前
|
消息中间件 存储 Kafka
实时计算 Flink版产品使用问题之 从Kafka读取数据,并与两个仅在任务启动时读取一次的维度表进行内连接(inner join)时,如果没有匹配到的数据会被直接丢弃还是会被存储在内存中
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
17 2
|
9天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
22 5
|
9天前
|
存储 小程序 编译器
数据在内存中的存储(1)
数据在内存中的存储(1)
27 5
|
10天前
|
存储 安全 Java
SpringSecurity6从入门到实战之初始用户如何存储到内存
Spring Security 在 SpringBoot 应用中默认使用 `UserDetailsServiceAutoConfiguration` 类将用户信息存储到内存中。当classpath有`AuthenticationManager`、存在`ObjectPostProcessor`实例且无特定安全bean时,此配置生效。`inMemoryUserDetailsManager()`方法创建内存用户,通过`UserDetails`对象填充`InMemoryUserDetailsManager`的内部map。若要持久化到数据库,需自定义`UserDetailsService`接口实