Java继承学习笔记

Java的继承能保证子类拥有父类的方法的同时,还能有自己的方法,然后也是研究了一下super和this的用法:

super的用法:

(1)、super关键字有两个用法:super()和super. ,super()这个用法,用于构造函数中,子类构造函数直接继承父类的构造函数功能,然后可以在super后再添加上子类独有的构造方法;
(2)、super能出现在实例方法和构造方法中:实例方法就是需要实例化对象后才能调用的方法,其存放于方法区,JVM在实例化对象的时候会去堆内存中开辟一块空间存储他。 实例方法只有在类实例化后才能被具象化,因为只有在此时方法才能知道其作用的对象。 更简单点说就是,实例化方法就是没有static修饰的方法; 构造方法就是实例化对象的时候调用的方法。这里引用一个知乎大佬的图,原文地址
在这里插入图片描述

(3)、(2)中说明super能出现的场景,自然对应的就是不能出现在什么方法中了,剩下的就是静态方法了;为什么不能出现在静态方法中呢?静态类是在类加载的时候就会初始化,static方法会存放在静态区,这个方法是属于类的,可以通过类名去访问。 但是super代表父类对象的引用,而super()表示应用父类的默认构造方法。 也就是说super存在的前提是必须有父类的对象,而在JVM加载类的时候又怎么可能存在类对象呢? 同理,this表示当前类对象的引用,那也得实例化时才有,在JVM加载类的时候是不存在的。
b)、一个不知道怎么描述的问题:
如下例子,cl_parent为父类,cl_son为子类,其中fun1和fun2为类的实例化方法,当调用子类fun1时,因为会继承父类父类fun1,但是父类fun1中又调用了fun2,那么此时是调用父类fun2还是子类fun2呢?

public class HelloWorld{
    public static void main(String[] args){
        //cl_parent cp1 = new cl_parent();
        cl_son cs1 = new cl_son();
        cs1.fun1(0, 0);
    }
}
class cl_parent {
    int num1;
    int num2;
    public cl_parent(){
        System.out.println("here is parent's construction");
    }
    void fun1(int a, int b){
        num1 = a;
        num2 = b;
        fun2();
        System.out.println("here is parent's fun1");
    }
    void fun2(){
        System.out.println("here is parent's fun2");
    }
}

class cl_son extends cl_parent{
    public cl_son(){
        System.out.println("here is son's construction");
    }
    void fun1(int a, int b){
        super.fun1(0,1);
        num1 = a;
        num2 = b;
        System.out.println("here is son's fun1");
    }
    @Override
    void fun2(){
        System.out.println("here is son's fun2");
    }

}

先直接实践下,看输出结果:

疑问1:结果是调用了子类的fun2,为什么是子类呢?
这里我找到的解释是,子类在通过super调用到父类方法时,若方法中还调用了方法,则优先选择子类重写的方法,如果使用变量则选择父类变量。 深入点的解释就是,通过super调用到父类方法后,其实栈帧还是在子类对象中,所以在父类方法中调用到其他方法时,查寻方法表的时候,查的还是子类的方法表。(感觉这里解释的还不是很清楚,应该是我还没理解到虚拟机的内部实现原理,暂时先用这个作为初步的理解吧)

疑问2:这里没有调用父类构造方法,为什么还会有父类构造方法的输出呢?
Java中规定,实例化子类对象的时候,必须调用父类的构造方法,再调用子类的构造方法,所以其实在子类的构造方法的第一行是有一个隐式的调用super()的, 我理解的应该是子类要想继承父类的方法和属性,所以必须先有一个父类,所以必须先初始化父类?具体还是有点疑问,暂时存疑吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/618790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++string 类的常用方法

string (构造函数) (1) default 构造长度为零字符的空字符串。 (2) copy 构造 str 的副本。 (3) substring 复制从字符位置 pos 开始并跨越 len 字符的 str 部分(如果任一 str 太短或 len 为 string::npos,则复制 str 的末尾…

智慧粮库/粮仓视频监管系统:AI视频智能监测保障储粮安全

智慧粮库视频监管系统是一种基于物联网、AI技术和视频监控技术的先进管理系统,主要用于对粮食储存环境进行实时监测、数据分析和预警。TSINGSEE青犀智慧粮库/粮仓视频智能管理系统方案通过部署多区域温、湿度、空气成分等多类传感器以及视频监控等设施,对…

AI漫改头像生成漫画,轻松日入1000+,操作简单好上手,互联网新项目新风口

AI漫改头像也差不多火了大半年了,一般流水的项目都活不过三个月,目前该项目至少存活了七个月了。 利用AI 软件将真人照片生成漫画形象,这看起来简单的方法,却在小红书上大伙大热。这完全是一个0成本的项目,漫画形象制作…

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中,消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列(Message Queue): 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时,系统会将生成的消息插入到消息队列中&…

报告!Golang冲上来啦!

今天又来讲Go语言,根据全球知名的编程语言排行榜TIOBE在4月份公布的最新的编程语言排名,令人瞩目的是,Go语言已经跃升至历史最高位,位列排行榜第七名,并且Go语言是前十榜单中最年轻的编程语言。这一成绩不仅彰显了Go语…

驾驭多云环境,加速AI创新丨Animbus Cloud 8.3.0 算力调度平台升级发布

大模型开启全球新一轮AI浪潮,伴随算力规模的爆发增长以及计算技术的多元创新,需要更稳定、高效、敏捷的异构计算基础设施,才能充分发挥对算力能力的重要支撑。 作为开放智能云边架构引领者,九州未来凭借多年的技术积累、实践沉淀…

Libcity 笔记:自定义模型

在/libcity/model/trajectory_loc_prediction/,我们复制一份Deepmove.py,得到DM_tst.py,我们不改变其中的机制,只动class name 然后修改相同目录下的__init__.py: 修改task_config文件: 在config/model/tra…

Matlab-粒子群优化算法实现

文章目录 一、粒子群优化算法二、相关概念和流程图三、例题实现结果 一、粒子群优化算法 粒子群优化算法起源于鸟类觅食的经验,也就是一群鸟在一个大空间内随机寻找食物,目标是找到食物最多的地方。以下是几个条件: (1) 所有的鸟都会共享自己的位置以及…

五一相亲的华为男:女方嫌弃“不像年薪百万”

上一篇:这才是作为人的生活:某大厂员工,200万存款靠利息生活 在这个看重外貌、车辆和房产的社会,相亲往往变成了一场隐秘而激烈的竞争。 作为一名985高校的硕士毕业生,拥有华为六年工作经验的我,33岁&#…

【算法系列】栈

目录 leetcode题目 一、删除字符串中的所有相邻重复项 二、比较含退格的字符串 三、基本计算器 II 四、字符串解码 五、验证栈序列 六、有效的括号 七、最小栈 八、逆波兰表达式求值 九、用栈实现队列 十、用队列实现栈 leetcode题目 一、删除字符串中的所有相邻重…

带头单链表 C++实现

节点定义 带头单链表&#xff1a;我们只需要一个结点指针指向整个链表的第一个节点&#xff0c;这样我们就可以通过next指针访问整个链表内的所有节点 template<class T> struct ListNode {T _val;ListNode* _next;ListNode(const T &val):_val(val),_next(nullptr){…

对数据进行标准化和归一化

数据的形式&#xff1a;保存在CSV中&#xff0c;第一列为姓名&#xff0c;第二列之后为特征。 标准化 输入文件的路径&#xff0c;设置保存转化后的文件路径 import pandas as pd from sklearn.preprocessing import StandardScaler# 读取CSV文件 data pd.read_csv(rC:\User…

上位机图像处理和嵌入式模块部署(树莓派4b使用的注意事项)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派系列开发板最早的时候&#xff0c;价格还是比较高的。不过由于它生态比较丰富&#xff0c;使用起来比较方便&#xff0c;所以大家都默认了它…

代码已经推送到远程,如何退回之前的提交记录

现状&#xff1a;代码已经推送到远程&#xff0c;如何退回之前的提交记录 Sourcetree工具实现 最后使用命令强制推送&#xff1a; git push origin dev --forceidea 工具实现 强行推送

google test 使用指南

目录 测试项目 calculator.h calculator.cpp test01.cpp 创建新项目 选择Google Test 选择要测试的项目 pch.cpp 加入依赖 设为启动项目 ​编辑 运行 ​编辑 关键点 测试项目 calculator.h #ifndef __CALCULATOR_H__ #define __CALCULATOR_H__#include <i…

远程调用feign的使用

在orderservice子工程中 <!--feign的远程--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>启动类加上这个注解 EnableFeignClients //自动装配…

数据结构与算法学习笔记之线性表二---顺序表的静态存储表示和实现(C++)

目录 前言 1.什么是顺序表 2.顺序表的静态存储表示 1.初始化 2.长度 3.数据元素 4.长度 5.获取元素下标 6.前驱节点 7.后继节点 8.插入 9.删除 10.遍历 11.测试代码 前言 这篇文章讲的是顺序表的两种实现方式。 1.什么是顺序表 线性表的顺序表示指的是用一组地址…

电商核心技术揭秘56: 社群营销的未来趋势与挑战

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘相关系列文章合集&#xff08;3&#xff09; 电商技术揭秘四十一&#xff1a;电商平台的营销系统浅析 电商技术揭秘四十二&#…

LeetCode100题总结

LeetCode100题总结 前言LeetCode100题总结题型梳理双指针11. 盛最多水的容器234.回文链表75.颜色分类206.反转链表142.环形链表215.三数之和 滑动窗口3. 无重复字符的最长子串209. 长度最小的子数组438. 找到字符串中所有字母异位词 广搜102. 二叉树的层序遍历200. 岛屿数量617…

ppt保存文件奇怪问题

我发现ppt中的形状保存成jpg,png和pdf时&#xff0c;格式不一样 比如 当右键单击时&#xff0c;然后选择另存为图片 png格式 jpg格式 pdf格式 感觉还是很奇怪&#xff0c;就pdf的格式比较靠谱一点