当前位置: 首页 > article >正文

【Java语言】继承和多态(一)

继承

       继承就是实现代码的复用;简而言之就是重复的代码作为父类(基类或超类),而不同的可以作为子类(派生类)如果子类想要继承父类的成员就一定需要extends进行修饰(如:(修饰符)+class+子类+extends+父类)

举一个例子吧:就比如学校吧,学校里面有学生、老师等,【这里就可以分三类:学校类(也可以称为父类),老师类、学生类(这两类就叫做子类)】,他们都是有名字、学号(工号)、都在教室上课、在食堂吃饭等,这些共性就属于父类中的成员,好有就是子类的特性,先说学生类:学生特有的成绩、需要考试、做作业等,老师类:老师特有的工资、需要给同学讲课、准备教学等;把这些信息转成代码就是如下:

       那现在子类就创建好了,但是又可能会出现问题啦。比如:子类和父类的成员变量、成员方法出现同名,需要怎么分辨;如果是变量的话该怎么做,方法又该怎么做?

访问父类成员 

       在子类方法中或子类对象访问成员时,先是访问自己的成员,如果自己没有在访问父类成员,如果再没有就出现编译错误。

子类和父类不存在同名

        在子类方法中或子类对象访问成员时,直接访问父类的成员。

子类和父类存在同名

       在子类方法中或子类对象访问同名的成员时,子类会优先访问自己的成员(就近原则),但是想要访问父类的同名变量就需要通过关键字super来进行访问(super后面会讲到,在这就不重复)。 

super关键字

       对于重名的成员来说,在子类中可以访问自己但是不能访问同名的父类,super就满足了子类访问父类的同名成员。 super的作用就是在子类方法中访问父类的成员,所以默认看到super就是访问父类的成员,所以想要访问变量还是方法都是super.访问。举如下例子:

super只能在非静态方法中使用,在子类方法中,访问父类的成员变量和方法。 

子类构造方法

        子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法。 意思就是,在调用子类构造方法前必须先执行父类的构造方法,因为子类对象中成员是有两部分组成的,父类继承下来的以及子类新增加的部分,将从父类继承下来的成员构造完整 ,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整 。

  •  若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用父类构造方法
  • 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。//大概意思就是要完整补充子类构造方法中的参数,且第一行需要super(父类的所有参数,无需写参数类型),不然就编译失败。
  • 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
  • super(...)只能在子类构造方法中出现一次,并且不能和this同时出现 

super和this的区别 

【相同点】

  1. 都是Java中的关键字
  2. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
  3. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在 

【不同点】

  1. this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用。(在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性)
  2. 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造方法中出现
  3. 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

继承中父类和子类代码块的顺序:父类静态代码块,子类静态代码块,父类实例代码块 ,父类构造方法,然后就是子类的实例代码块、构造方法;(且静态代码块只执行一次)

protected关键字

 父类中private成员变量虽然在子类中不能直接访问,但是也继承到子类中了

继承方式 

       继承方式有单继承,多层继承,不同类继承同一个类;在Java中支持多继承(一个类继承多个类) 。

final关键字 

       final关键可以用来修饰变量、成员方法以及类。只要被final修饰的变量都变成“常量”(就是无法改变);如果修饰的是类,那么这个类就不能被继承;如果修饰的是方法,那么表示该方法不能被重写(重写后面会提及)。 


http://www.kler.cn/a/380710.html

相关文章:

  • 专栏二十三:Python读取和分析空间数据的经验杂谈
  • QT的前景与互联网岗位发展
  • 论文《Vertical Federated Learning: Concepts, Advances, and Challenges》阅读
  • webrtc音频模块(三) windows Core Audio API及声音的播放
  • web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set
  • alertmanager告警持久化方案:alertsnitch
  • FPGA实现图像处理算法的创新点
  • Handler源码和流程分析
  • 算法: 链表题目练习
  • 前端用docker部署
  • 总是忘记CSS中的transform 和transition的区别
  • 楼梯区域分割系统:Web效果惊艳
  • 【图书管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+网站系统
  • nginx cors配置
  • 【驱动】地平线X3交叉编译工具搭建、源码下载
  • 基于航片的玉米异常情况识别赛题正在报名中 | CCF BDCI进行时
  • element-plus按需引入报错Components is not a function
  • 什么是AOP面向切面编程?怎么简单理解?
  • npm入门教程11:npm私有包和模块
  • 基于Spring Boot的志愿服务管理系统设计与实现,LW+源码+讲解
  • Chrome 130 版本开发者工具(DevTools)更新内容
  • Python学习笔记-生成器的应用与原理
  • CentOS 7 安装 ntp,自动校准系统时间
  • three.js 智慧城市扫光效果
  • Linux系统基础-多线程超详细讲解(5)_单例模式与线程池
  • Android 网易游戏面经