继承和多态(1)(继承部分)

继承

继承的概念 

 上文就是继承的概念。

必须记住父类也可以称为基类,超类。 子类也可以称为派生类。

继承的语法

在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:

修饰符 class 子类 extends 父类 {// ...  
}

注意:

1. 子类会将父类中的成员变量或者成员方法继承到子类中了

2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了 

在子类中访问成员变量

在子类方法中或者通过子类对象访问成员变量时:

如果访问的成员变量子类本身就有(不带继承的父类,是自己本身),优先访问子类自己本身的成员变量。

如果访问的成员变量子类中无,则访问父类继承下来的。如果父类也没有定义,则编译报错。

那么说如果访问的子类自己本身的成员变量与父类中成员变量同名,则优先访问自己的。

成员变量访问遵循就近原则,自己本身有优先自己的,如果没有则向父类继承下来的成员变量中找。  

 在子类中访问成员方法

 跟访问成员变量一样。

在子类方法中或者通过子类对象访问方法时,优先访问自己的成员方法,自己没有时, 再到父类中找,如果父类中也没有则报错。

当子类和父类有相同的成员方法时(这里的成员方法相同是指方法签名完全相同,方法重载这种只有方法名相同的不算),访问该成员方法,则优先访问子类的成员方法。

super关键字 

由于设计不好,或者因场景需要,子类和父类中可能会存在相同名称的成员,如果要在子类方法中访问父类同名成员时,该如何操作?直接访问是无法做到的。

Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。(注意只能在子类中使用)  

注意你可以将super看作是一个引用变量,跟this差不多,不过不像this一样在非静态方法中就自带this(this都隐藏起来了)。

它只能出现在非静态方法中,所以它像this一样都代表着创建出的对象的地址,只不过this是引用全部,super是引用父类部分。

 在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

【注意事项】

1. 只能在非静态方法中使用

2. 用在子类方法中,访问父类的成员变量和方法。

其他的事项在后文中介绍。

 子类构造方法

 子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。原理如下。

public class Base {public Base(){System.out.println("Base()");}
}public class Derived extends Base{public Derived(){// super();   // 注意子类构造方法中默认会调用基类的无参构造方法:super(),// 用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句,// 并且只能出现一次System.out.println("Derived()");}
}public class Test {public static void main(String[] args) {Derived d = new Derived();}
}结果打印:
Base()
Derived()

在子类构造方法中,使用super()或super(参数)能访问父类中的构造方法。

但它只能在第一行使用  ,并且 super(...)只能在子类构造方法中出现一次,还不能和this同时出现。

如果在子类的构造方法第一行没有用super调用,就会在子类构造方法第一行默认有隐含的super()调用。(当有this调用在第一行时,其super也不会出现默认的隐藏调用

当子类没有构造方法时,默认有隐含的无参数构造方法并且其内部存在super()。

当父类没有构造方法时,默认有隐含的无参数构造方法并且其内部为空语句。

对于父类的构造方法,里面隐藏的依然是this. ,并不是super  

super和this  

 super和this都可以在成员方法中用来访问成员变量和调用其他的成员函数,都可以作为构造方法的第一条语句,那他们之间有什么区别呢?

【相同点】

1. 都是Java中的关键字

2. 它们都只能在类的非静态方法中使用。在静态方法中都用不了。

3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在  

【不同点】

1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用

2. 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性

3. 在构造方法中:this(...)用于调用本类另外的构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现

4. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有  

 

再谈初始化 (跟代码块相关)

 在没继承关系时,顺序是先执行静态代码块,然后是实例代码块,然后是构造方法执行。

当有了继承关系时 

通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,且它们都是最早执行

2、然后执行父类实例代码块,再执行父类构造方法

3、紧接着执行子类的实例代码块,然后是子类构造方法

4、第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行。除此之外其他的跟第一次实例化对象一模一样。

 protected 关键字

在类和对象章节中,为了实现封装特性,Java中引入了访问限定符,主要限定:类或者类中成员能否在类外或者其他包中被访问。 

如果有时我们想要一个变量能在一个包之外去使用,但又不会像public范围那么大,这时就出现了protected这个修饰符。允许变量还能在另一个包的所属子类中去使用 

例如下面一个例子。

package cot;
public class Data1 {protected  int a=30;}
package com;
import cot.Data1;
class Date2 extends Data1 {public void a(){System.out.println(super.a);Date2 date3  =new Date2();System.out.println(date3.a);System.out.println(super.a);}public static void main(String[] args) {Date2 date2  =new Date2();Data1 date1  =new Data1();System.out.println(date2.a);date2.a();}
}

将cot包中的Data1类当作父类继承到com包中的Date2类时,因为a是protected修饰的,所以能在另一个包的所属子类中使用。

注意一个很关键的点,如果子类和父类在不同的包中,在另一个包中的子类中用父类创建一个对象,用该对象去访问被protected修饰的成员变量,是不支持的。

我们支持用子类去创建对象通过子类创建的对象去访问被protected修饰的变量,这可行。(同理当super,this代表子类创建的对象的地址时也可以访问)

而当子类和父类在同一个包时,之前在不同包时的不支持的行为到相同包后可以发生。(在同一个包中,没有特别需要注意的点)

 

这里还有一些例子 :

除此之外我们还说下private,父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了,只是直接访问不了,子类中是含有private成员变量的。

 继承方式

在java中有以下继承方式 

 必须记住java不支持多继承。

时刻牢记,我们写的类是现实事物的抽象. 而我们真正在公司中所遇到的项目往往业务比较复杂, 可能会涉及到 一系列复杂的概念, 都需要我们使用代码来表示, 所以我们真实项目中所写的类也会有很多. 类之间的关系也会 更加复杂.

但是即使如此, 我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.

如果想从语法上进行限制继承, 就可以使用final关键字

 final关键字

其有三个作用

1.修饰局部变量或者成员变量,定义完之后我们只能再给它赋一次值,在这之后它表示常量(即不能修改)

final int a = 10;
a = 20;  // 编译出错

2.修饰类:表示此类不能被继承 

3.修饰方法:表示该方法不能被重写(后序介绍)  

继承与组合 

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法 (诸如 extends 这样的关键字) , 仅仅是将一个类的实例作为另外一个类的成员变量。

 由这可知,将一个类创建的变量当作另一个类的成员变量就是我们口中的组合了。

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合,因为组合更安全,更简单,更灵活,更高效  。

这里有个讲解继承和组合的文章。 深入理解Java中的组合和继承-HollisChuang's Blog

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网易web安全工程师进阶版课程

课程介绍 《Web安全工程师(进阶)》是由“ i春秋学院联合网易安全部”出品,资深讲师团队通过精炼的教学内容、丰富的实际场景及综合项目实战,帮助学员纵向提升技能,横向拓宽视野,牢靠掌握Web安全工程师核心…

pycharm搭建新的解释器及删除处理

目录 1.创建虚拟环境 个人实际操作: 对于“继承全局站点包”: 2.创建一个新项目 3.删除操作 (1)删除解释器 (2)删除新建项目 1.创建虚拟环境 Pycharm官方文档说明网址: Configure a virt…

【机器学习】包裹式特征选择之序列前向选择法

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

向开发板上移植ip工具:交叉编译 ip工具

一. 简介 前面几篇文章学习了 CAN设备节点的创建,以及如何使能 CAN驱动。 本文学习向开发板上移植ip工具。 二. 向开发板上移植ip工具:交叉编译 ip工具 注意:在移植 ip 命令的时候必须先对根文件系统做个备份!防止操作失误导…

ffmpeg实现媒体流解码

本期主要讲解怎么将MP4媒体流的视频解码为yuv,音频解码为pcm数据;在此之前我们要先了解解复用和复用的概念; 解复用:像mp4是由音频和视频组成的(其他内容流除外);将MP4的流拆分成视频流(h264或h265等)和音频流(AAC或mp3等); 复用:就是将音频和视频打包成MP4或者fl…

Cobalt Strike -- 各种beacon

今天来讲一下cs里面的beacon 其实cs真的功能很强大,自带代理创建,自带beacon通信!!! 一张图,就能说明beacon的工作原理 1.Beacon 每当有一台机器上线之后,我们都会选择sleep时间,…

吴恩达2022机器学习专项课程(一) 3.6 可视化样例

问题预览 1.本节课主要讲的是什么? 2.不同的w和b,如何影响线性回归和等高线图? 3.一般用哪种方式,可以找到最佳的w和b? 解读 1.课程内容 设置不同的w和b,观察模型拟合数据,成本函数J的等高线…

nodejs+vue高校洗浴管理系统python-flask-django-php

高校洗浴管理系统采用数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写,使用了express框架。该系统从两个对象:由管理员和学生来对系统进行设计构建。主要功能包括:个人信息修改,对学生管理、浴室信息、浴室预约、预约…

【JavaEE初阶系列】——阻塞队列

目录 🚩阻塞队列的定义 🚩生产者消费者模型 🎈解耦性 🎈削峰填谷 🚩阻塞队列的实现 📝基础的环形队列 📝阻塞队列的形成 📝 内存可见性 📝阻塞队列代码 &#…

【深度学习】pytorch,MNIST手写数字分类

efficientnet_b0的迁移学习 import torch import torch.nn as nn import torch.optim as optim import torchvision.transforms as transforms from torchvision.datasets import MNIST from torch.utils.data import DataLoader from torchvision import models import matplo…

IntelliJ IDE 插件开发 | (七)PSI 入门及实战(实现 MyBatis 插件的跳转功能)

系列文章 IntelliJ IDE 插件开发 |(一)快速入门IntelliJ IDE 插件开发 |(二)UI 界面与数据持久化IntelliJ IDE 插件开发 |(三)消息通知与事件监听IntelliJ IDE 插件开发 |(四)来查收…

android Fragment 生命周期 方法调用顺序

文章目录 Introlog 及结论代码 Intro 界面设计:点击左侧按钮,会将右侧 青色的RightFragment 替换成 黄色的AnotherRightFragment,而这两个 Fragment 的生命周期方法都会打印日志。 所以只要看执行结果中的日志,就可以知道 Fragme…

【单例测试】Mockito实战

目录 一、项目介绍二、业务代码2.1 导入依赖2.2 entity2.3 Dao2.4 业务代码 三、单元测试3.1 生成Test方法3.2 引入测试类3. 3 测试前准备3.4 测试3.4.1 name和phone参数校验3.4.2 测试数据库访问 3.4.3 数据库反例 总结 前面我们提到了《【单元测试】一文读懂java单元测试》 简…

IDEA Android新建项目基础

title: IDEA Android基础开发 search: 2024-03-16 tags: “#JavaAndroid开发” 一、构建基本项目 在使用 IDEA 进行基础的Android 开发时,我们可以通过IDEA自带的新建项目功能进行Android应用开发基础架构的搭建,可以直接找到 File --> New --> …

基于nodejs+vue学生作业管理系统python-flask-django-php

他们不仅希望页面简单大方,还希望操作方便,可以快速锁定他们需要的线上管理方式。基于这种情况,我们需要这样一个界面简单大方、功能齐全的系统来解决用户问题,满足用户需求。 课题主要分为三大模块:即管理员模块和学生…

上位机图像处理和嵌入式模块部署(qmacvisual轮廓查找)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们说过,图像的处理流程一般都是这样的,即灰度化-》降噪-》边缘检测-》二值化-》开闭运算-》轮廓检测。虽然前面的几个…

LeetCode 面试经典150题 14.最长公共前缀

题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路: 代码: class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…

知攻善防应急靶场-Linux(2)

前言: 堕落了三个月,现在因为被找实习而困扰,着实自己能力不足,从今天开始 每天沉淀一点点 ,准备秋招 加油 注意: 本文章参考qax的网络安全应急响应和知攻善防实验室靶场,记录自己的学习过程&am…

python绘图matplotlib——使用记录1

本博文来自于网络收集,如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

flutter3_douyin:基于flutter3+dart3短视频直播实例|Flutter3.x仿抖音

flutter3-dylive 跨平台仿抖音短视频直播app实战项目。 全新原创基于flutter3.19.2dart3.3.0getx等技术开发仿抖音app实战项目。实现了类似抖音整屏丝滑式上下滑动视频、左右滑动切换页面模块,直播间进场/礼物动效,聊天等模块。 运用技术 编辑器&#x…