JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)
一、继承
继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能 ,这样产生新的类,称 派生类 。继承呈现了面向对象程序设计的层次结构, 体现了 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
(1)继承的语法
注意:1. 子类会将父类中的成员变量或者成员方法继承到子类中了2. 子类继承父类之后,要新添加自己的成员(一般是与其他子类不同的),便于区别。
继承是一种思想。对共性进行提取,减少代码的冗余,达到了代码复用的效果。
例如:
(2)父类成员的访问
1.子类中访问父类的 成员变量
1)访问子类、父类成员变量 不同名
不同名直接访问 变量名或者 this.变量名
class Base{public int a;public int b; }//派生类(子类) class Derived extends Base{public int c;public void method(){//访问从父类继承的a和ba = 1;b = 2;//访问子类自身的cc = 3;} }
2)访问 子类、父类成员变量 同名
同名的情况下:(就近原则:优先子类自己)
当子类有该成员变量,优先访问子类自己的成员变量。
当子类当中不存在该成员变量,则访问父类继承下的。如果父类也没有,则编译报错
//基类(父类) class Base{public int a = 10;public int b = 20; }//派生类(子类) class Derived extends Base{public int a = 1;public void method(){//访问从父类继承的a和bSystem.out.println("a = "+a);//1System.out.println("b = "+b);//20} }public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.method();} }
如果要访问父类的成员变量,使用 super.变量名
2.子类中访问父类的 成员方法
1)访问 子类、父类成员方法 不同名
不同名,优先在子类中找,找到则访问,否则在父类中找,找到 则访问,否则编译报错。
class Base{public void method(){System.out.println("Base:父类成员方法!");} } class Derived extends Base{public void method2(){System.out.println("Derived:子类成员方法!");}public void test(){method();method2();} } public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}}
![]()
2)访问 子类、父类成员方法 同名
同名,优先访问子类。子类没有,在父类继承的方法中找,父类没有,编译报错
class Base{public void method(){System.out.println("Base:父类成员方法!");} } class Derived extends Base{public void method(){System.out.println("Derived:子类成员方法!");}public void method2(){System.out.println("Derived:子类成员方法!");}public void test(){method();method2();} } public class Test2 {public static void main(String[] args) {Derived derived = new Derived();derived.test();}}
![]()
如果要访问父类方法,使用super.method
3.子类构造方法
子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
也就是说,子类在构造完成之前,一定要先帮助父类初始化
package demo1;class Animal{public String name;public int age;public void eat(){System.out.println(this.name+"正在吃饭~~");}public Animal(String name, int age) {this.name = name;this.age = age;}// public Animal(){
//
// }}
//继承
//extends 拓展,扩展 继承
class Dog extends Animal{// public Dog(){
// super();
// }public Dog(String name, int age){//调用父类构造方法super(name,age);//帮助初始化 子类从父类继承过来的成员,并不会 生成父类对象System.out.println("Dog调用父类构造方法");//super("小黑",3);}public void bark(){System.out.println(this.name+"旺旺叫~~");}
}
class Cat extends Animal{public void miaomiao(){System.out.println(this.name+"喵喵叫~~");}public Cat(String name, int age) {super(name, age);System.out.println("Cat调用父类构造方法");}
}
public class Test {public static void main(String[] args) {Dog dog = new Dog("小黑",3);dog.eat();dog.bark();System.out.println("==========");Cat cat = new Cat("小白",4);cat.eat();cat.miaomiao();}
}
1) 当给父类Animal提供了一个带参数的构造方法时,子类报错了
就是因为,在调用子类构造方法时,得先初始化父类变量,这样就不会报错了
2)不带参数的构造方法时,没有报错。而且之前没写构造方法的时候,也没报错
那是因为,没写的时候,默认会生成一个子类调用父类的构造方法
注意:同this一样,只能调用1次。而且必须得放在构造语句的第一行
否则会像这样报错
要向打印 ,可以放在super语句的后面
然后主函数调用写好的继承
4.super和this的小总结
共性:super.成员变量super.成员方法super()调用父类构造方法**针对当前对象的父类
this.成员变量this.成员方法this()调用父类构造方法**针对当前对象
不同:1. this 是当前对象的引用,当前对象即调用实例方法的对象, super 相当于是子类对象中从父类继承下来部分成员的引用2. 在非静态成员方法中, this 用来访问本类的方法和属性, super 用来访问父类继承下来的方法和属性3. 在构造方法中: this(...) 用于调用本类构造方法, super(...) 用于调用父类构造方法,两种调用不能同时在构造 方法中出现4. 构造方法中一定会存在 super(...) 的调用,用户没有写编译器也会增加,但是 this(...) 用户不写则没有
二、再谈初始化 - 观察代码块执行顺序
package demo1;class Animal{public String name;public int age;public void eat(){System.out.println(this.name+"正在吃饭~~");}public Animal(String name, int age) {this.name = name;this.age = age;System.out.println("父类:构造方法");}// public Animal(){
//
// }static {System.out.println("父类:静态代码块");}{System.out.println("父类:实例化代码块");}
}
//继承
//extends 拓展,扩展 继承
class Dog extends Animal{// public Dog(){
// super();
// }public Dog(String name, int age){//调用父类构造方法super(name,age);//帮助初始化 子类从父类继承过来的成员,并不会 生成父类对象System.out.println("子类:构造方法");//super("小黑",3);}public void bark(){System.out.println(this.name+"旺旺叫~~");}static {System.out.println("子类:静态代码块");}{System.out.println("子类:实例化代码块");}
}
class Cat extends Animal{public void miaomiao(){System.out.println(this.name+"喵喵叫~~");}public Cat(String name, int age) {super(name, age);System.out.println("Cat调用父类构造方法");}
}
public class Test {public static void main(String[] args) {Dog dog = new Dog("小黑",3);}}
通过分析执行结果,得出以下结论:
1、父类静态代码块 优先于 子类静态代码块执行,且是最早执行
2、父类实例代码块和父类构造方法紧接着执行
3、子类的实例代码块和子类构造方法紧接着再执行
4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行
当再实例化一个对象时,发现静态代码块没有被执行
因为静态代码块只会执行一次
三、protect 关键字
protected常用在继承中
1.protected同一包中同一类可以访问
2.protected同一包中不一类可以访问
3.protected不同一包的子类可以访问。(这个继承的类必须时public访问权限)
4.注意:不能定义类的时候加Protected、Private
Java中不能这样写,语法不支持
四、继承方式
以动物为例,可以有很多继承,橘猫可以继承中华田园猫,中华田园猫可以继承猫,猫可以继承动物,动物也可以继续继承..
但是越往后继承,代码就会越复杂。 一般我们不希望出现超过三层的继承关系.
1.继承方式 - Java中不支持多继承。
2.fifinal 关键字
fifinal关键可以用来修饰变量、成员方法以及类。当继承层次过多,不希望再继承的时候加上final, 代表当前类或者变量等,不能继承了
1)修饰变量 ,该变量就变成常量了,只能被初始化一次
![]()
只能初始化一次,这两种都可以
2)修饰方法,表示当前该方法不能被继承了
所以这里继承的时候报错了
五、继承与组合
和继承类似, 组合也是一种表达类之间关系的方式 , 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字 ), 仅仅是将一个类的实例作为另外一个类的字段。继承表示对象之间是 is-a 的关系 ,比如:狗是动物,猫是动物继承抽取共性组合表示对象之间是 has-a 的关系 ,比如:学校组合将所有类合并到一起复用
组合
class Student{}
class Teacher{}
class Classroom{}
class School{//组合,可以复用这些属性和方法public Classroom classroom;public Student[] students;//默认nullpublic Teacher[] teachers;public int a;public School(){this.students = new Student[10];this.teachers = new Teacher[10];}
}
相关文章:

JavaSE【继承和多态】(1)(重点:初始化、pretected封装、组合)
一、继承 继承 (inheritance) 机制 :是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性 的基础上进行扩展,增加新功能 ,这样产生新的类,称 派生类 。 继承呈现了面向对象程序设计的层次结…...

无涯教程-Android Studio函数
第1步-系统要求 您将很高兴知道您可以在以下两种操作系统之一上开始Android应用程序的开发- MicrosoftWindows10/8/7/Vista/2003(32或64位)MacOSX10.8.5或更高版本,最高10.9(小牛) GNOME或KDE桌面 第二点是,开发Android应用程序所需的所有工具都是开源的,可以从Web上下载。以…...

CentOS8安装mysql8.0.24
一、下载mysql安装包并解压 执行以下命令: # 创建mysql安装目录 mkdir /usr/local/mysql # 进入mysql安装目录 cd /usr/local/mysql/ # 下载mysql-8.0.24 wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz # 解压…...

Quasi-eccentricity Error Modeling and Compensation in Vision Metrology
论文:Quasi-eccentricity Error Modeling and Compensation in Vision Metrology 中文:视觉计量中准偏心误差建模与补偿 论文地址:Sci-Hub | Quasi-eccentricity error modeling and compensation in vision metrology. Measurement Scienc…...

ai智能电话机器人是人类的助手和朋友
一直以来,人工智能都是人们关注的热门话题。在以前,说到人工智能,第一想到的是“机器人”,随着人工智能的普及,AI已经渗透到我们生活的每一个角落。现在,说起人工智能,可能会想到“无人驾驶、无…...

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号
首先要安装 TortoiseSVN, 并确保TortoiseSVN的bin目录被加入到系统环境变量Path中。 1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion(&quo…...

【八股】2023秋招八股复习笔记5(计算机网络-CN)
文章目录 八股目录目录1、应用层 & HTTP一些http题HTTPS 加密原理(问过)HTTP/1.1 新特性HTTP/2.0 与 RPC(问过)GET 和 POST 比较 2、传输层 & TCPTCP三次握手 & 四次挥手(问过)为什么每次TCP 连…...

【C++】SLT——Vector详解
本片要分享的是关于STL中Vector的内容,Vector的内容于string非常相似,只要会使用string那么学习Vector时会非常流畅。 目录 1.vector介绍 2.vector的简单实用 2.1.简单的无参构造 编辑2.2.简单带参构造 2.3.迭代器区间初始化 2.4.vector的遍历 …...

企业网络安全:威胁情报解决方案
什么是威胁情报 威胁情报是网络安全的关键组成部分,可为潜在的恶意来源提供有价值的见解,这些知识可帮助组织主动识别和防止网络攻击,通过利用 STIX/TAXII 等威胁源,组织可以检测其网络中的潜在攻击,从而促进快速检测…...

为什么2G、3G、4G成功了,5G却?
你可能已经多年来一直听到关于闪电般的5G的炒作。虽然新的无线网络在美国仍然没有普及,但5G正在波士顿和西雅图到达拉斯和堪萨斯城等城市慢慢出现。随着连接速度的加快,用户的安全性和隐私保护将增加,因为无线行业试图改善3G和4G的防御。但是…...

C语言每日一练------Day(10)
本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字:自除数 除自身以外数组的乘积 💓博主csdn个人主页ÿ…...
发力服务业务,龙湖集团半程领跑赢在“智慧”
成立三十载,龙湖集团一直是房地产行业“特立独行”的存在。 一方面,龙湖在对外战略方面长期量入为出,从不背上过重的“包袱”。 不久前,一则消息引发市场关注:龙湖集团提前偿还17亿元债务,已基本全部还清…...

Kubernetes(七)修改 pod 网络(flannel 插件)
一、 提示 需要重启服务器 操作之前备份 k8s 中所有资源的 yaml 文件 如下是备份脚本,仅供参考 # 创建备份目录 test -d $3 || mkdir $3 # $1 命名空间 # $2 资源名称: sts deploy configMap svc 等 # $3 资源备份存放的目录名称for app in kubec…...

测试平台metersphere
metersphere可以做接口测试、UI测试、性能测试。 metersphere接口测试底层是jmeter,可以做API管理,快捷调试,接口用例管理,接口自动化场景执行一键选取用例范围,生成测试报告。 会用jmeter,metersphere会…...

论文笔记: One Fits All:Power General Time Series Analysis by Pretrained LM
1 intro 时间序列领域预训练模型/foundation 模型的研究还不是很多 主要挑战是缺乏大量的数据来训练用于时间序列分析的基础模型——>论文利用预训练的语言模型进行通用的时间序列分析 为各种时间序列任务提供了一个统一的框架 论文还调查了为什么从语言领域预训练的Transf…...

记录--怎么实现一个3d翻书效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇主要讨论以下两种翻书动画的实现: 第一种是整页翻转的效果: 这种整页翻转的效果主要是做rotateY的动画,并结合一些CSS的3d属性实现。 第二种折线翻转的效果&…...

(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点
文章目录 一:图像描述概述(1)图像描述(2)描述子 二:特征点(1)Moravec角点检测A:原理B:程序 (2)Harris角点检测A:原理B&…...

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发
SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发 昨天我们深入学习了MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方…...

VBA技术资料MF48:VBA_在Excel中将列号与字母转换
【分享成果,随喜正能量】除非自己的认知获得了改变和刷新,否则,人们常说的“顺应自己的内心”,顺的不过是一颗旧心,一颗惯性的,充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反,人要用…...

LeetCode-160. 相交链表
这是一道真的非常巧妙的题,题解思路如下: 如果让他们尾端队齐,那么从后面遍历就会很快找到第一个相交的点。但是逆序很麻烦。 于是有一个巧妙的思路诞生了,如果让短的先走完自己的再走长的,长的走完走短的,…...

微信小程序如何实现页面传参和页面传递多个参数
前言 只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 4 种页面方法。 下面时多个参数页面传参的方式 let loveJSON.stringify(this.data.totle);let youJSON.stringify(this.data.totleId)let csdnJSON.stringify(this.data.totleP…...

ChatGPT⼊门到精通(3):ChatGPT 原理
OpenAI在2022年11⽉份发布ChatGPT,强⼤的⽂字对话、创意写作能⼒,全球掀起了⼀ 波AI浪潮。本⽂对ChatGPT的技术原理、厉害之处、可能的落地⽅向等⽅⾯进⾏了全⾯ 的解析,看完后会对ChatGPT有更深⼊的了解。 ⼀、前⾔ 2022年11⽉30⽇&#x…...

nginx配置keepalive长连接
nginx之keepalive详解与其配置_keepalive_timeout_恒者走天下的博客-CSDN博客 为什么要有keepalive? 因为每次建立tcp都要建立三次握手,消耗时间较长,所以为了减少tcp建立连接需要的时间,就可以设置keep_alive长连接。 nginx中keep_alive对…...

Thread.enumerate方法
Thread.enumerate方法的作用是将当前线程所对应的的线程组包含的所有线程放入一个数组 参见源码注释 /*** Copies into the specified array every active thread in the current* threads thread group and its subgroups. This method simply* invokes the {@link java.lan…...

* 号靠近数据类型,和靠近变量名, 号靠近数据类型,和靠近变量名,有什么区别
文章目录 一、int* age 和 int *age,* 号靠近数据类型,和靠近变量名,有什么区别:1. int* age:2. int *age: 二、int& age 和 int &age,& 号靠近数据类型,和靠近变量名,有什么区别&a…...

为了做好农业,拼多多请来顶尖农业专家当独立董事
8月29日,拼多多发布截至6月30日的2023年第二季度业绩报告。财报显示,拼多多集团今年第二季度收入为523亿元,同比增长66%,远超市场预期。 财报发布的同时,拼多多还宣布,其董事会已聘任荷兰瓦赫宁根大学终身…...

Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】
文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写,旨在为 WEB 应用提供可扩展的高…...

Python+PIL+qrcode实现二维码自由—普通二维码+彩色二维码+logo二维码+动态二维码(附完整代码)
有时候我们需要自己制作一个二维码,然后进行打印下来,或者说在二维码中提前写上一段话比如搞笑的话,然后印在衣服上,然后穿出去玩!的🤣 那么今天我们分享一下制作二维码的几种方式: 哎&#x…...

【Spring Data JPA】JPA 常用查询函数
文章目录 前言函数查询表格 前言 函数查询的表格参考了官网的 2.7.3 版本的文档,JPA 的这种函数式查询方法改动不大,如果想知道更多的复杂查询,可以参考这篇文章 【Spring Data JPA】基于 JpaRepository 增删改查 官方文档地址 Spring Data…...

Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 在看这篇帖子前,请先看我的另一篇帖子《Visual Studio 2022的MFC框架——应用程序向导》。 当程序调用了CWinApp类的构造…...