继承
2022/6/3 23:20:12
本文主要是介绍继承,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
继承
语法格式
public class 子类名 extends 父类名 { }
注意事项:Java 不支持多继承 可以多层继承 (一个类不可以直接有多个父类,可以有父类的父类)
作用
让类3与类之间产生关系,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
好处
提高了代码的复用性和可维护性.
复用性:父类有的代码子类都有 (成员变量 和成员方法 不包括构造方法)
维护性:父类统一管理子类 父类修改代码所有子类都跟着改变(也是弊端)
弊端
增强了代码的耦合性(削弱了子类的独立性),子类不得不受父类影响
什么时候使用继承
继承虽好,但是要满足 is a 关系才可使用 让两个类产生关系
苹果 是 一种 水果 设计水果为父类 苹果为子类
猫 是 一种 动物 设计 动物为父类 猫为子类
经理 程序员 员工 设计 员工 为父类 经理 程序员分别继承 员工类
而 经理类 和程序员类 不应该产生继承关系
子类中成员和构造方法的使用
super关键字
- super是一个关键字,并不是一个引用,也不指向任何对象;
- super只代表当前对象内部的那一块父类型特征;
- super.xxx() 中super中不指对象 (只是一个语法糖),长得像
在子类中方法使用一个变量 (就近原则)
-
子类局部变量
-
子类成员变量
-
父类成员变量
-
如果没有就报错(不考录父类的父类)
-
Tips:
成员变量 和 局部变量重名 使用this.变量名 表示成员变量
子类成员变量和局部变量 成员变量重名 使用 super.变量名 表示 父类成员变量 在没有重名的情况下 根据变量作用域使用变量
-
子类的对象使用一个方法 (就近原则)
-
子类成员范围找
-
父类成员范围找
-
如果没有就报错(不考录父类的父类)
-
Tips:
在一个类中调用 本类的方法 实际上是this.方法名()
在子类方法名和父类重名的情况下 可以用super.方法名()
-
重写
定义:子类中出现了和父类中"一模一样"的方法声明
书写:重写时
修饰符范围 要大于等于父类
返回值类型 为父类返回值的类型 或 父类返回值的类型的子类
范围原因:(里氏原则) /多态时执行看右边 要保证程序能被执行到(其他类其他包中可能不能够被取到)
使用场景:父类方法不能满足子类的要求
Tips:用 @Override 注解 可帮助我们检查重写方法声明的正确性
子类不能重写父类private修饰的方法 访问不到
构造方法
-
子类中的所有构造方法 默认访问父类中的无参构造方法
即子类所有构造方法第一行默认有一个super()
-
为什么?
子类除了继承父类数据,子类可能使用父类的数据 所以在子类初始化之前,要完成对父类数据的初始化
-
在显示调用 super(参数列表)后 java 将不在提供super()
-
super(参数列表)只能放在第一行
扩展:
-
继承时的内存图
-
this和super 都能调用构造方法 都需要书写在构造方法的第一行(要先初始化在使用)
-
this和和super 只能存在一个 1.只有一个第一行 2.无论this在前还是super在前 都会对父类进行两次初始化
-
new 关键字
https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
-
创建一个对象
Apple apple = new Apple()
三个过程:
- 声明Declaration:将变量名称与对象类型关联的变量声明。
- 实例化Instantiating :new关键字是一个java运算符,它用来创建对象。
- 初始化Initialization:new运算符,随后调用构造函数,初始化新创建的对象。
-
实例化
new运算符实例化一个类对象,通过给这个对象分配内存并返回一个指向该内存的引用。new运算符也调用了对象的构造函数。
注意:“实例化一个类的对象”的意思就是“创建对象”。创建对象时,你正在创造一个类的“实例”,因而“实例化”一个类的对象。
new运算符需要一个单一的,后缀参数,需要调用构造函数。构造函数的名称提供了需要实例化类的名称。
new运算符返回它所创建的对象的引用。此引用通常被分配给一个合适的类型的变量,如:Point originone =new Point(23,94);
由new运算符返回的引用可以不需要被赋值给变量。它也可以直接使用在一个表达式中。例如: int height = new Rectangle().height;
当Java语法层面使用new关键字创建一个Java对象时,JVM首先会检查相对应的类是否已经成功经历加载、解析和初始化等步骤;当类完成装载步骤之后,就已经完全确定出创建对象实例时所需的内存空间大小,才能对其进行内存分配,以存储所生成的对象实例。
实例化之后,进行初始化
-
修饰符
权限修饰符
是否可以访问(使用) 、作用域 该表针对成员变量来说的
修饰符 | 同一个类中 | 包中无关类 | 非同包有继承关系 | 非同包无继承 |
---|---|---|---|---|
private | Y | |||
default(不写) | Y | Y | ||
protected | Y | Y | Y | |
public | Y | Y | Y | Y |
状态修饰符
final
final:表示最终 可以修饰 成员变量 ,成员方法,类
-
- 修饰类 表示类是最终类,不能被继承
- 修饰方法 表示是最终方法,不能被重写
- 修饰基本数据类型变量
- 成员变量 表示常量,不能被再次被赋值 常量全部大写 词与词之间" _ "连接
- 局部变量 表示 数据值不能改变
- 修饰引用数据类型变量 表示地址值不能改变 地址值中的内容可以改变
static
static:表示静态的意思,可以修饰成员方法,成员变量
-
特点:
- 被类的所有对象共享 这也是判断是否使用该关键字的标准
- 静态的成员随类加载 比构造函数作用的时期早
-
怎么调用: 直接 类名.变量名 /直接类名.方法名()
-
静态成员和非静态成员 访问规则:静态成员方法只能访问静态成员
-
使用场景:工具类
工具类特点:
- 没有成员变量
- 所有成员变量 用 静态化
- 构造方法私有化 不能 new 对象
这篇关于继承的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26消息中间件源码剖析教程
- 2024-11-26JAVA语音识别项目资料的收集与应用
- 2024-11-26Java语音识别项目资料:入门级教程与实战指南
- 2024-11-26SpringAI:Java 开发的智能新利器
- 2024-11-26Java云原生资料:新手入门教程与实战指南
- 2024-11-26JAVA云原生资料入门教程
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程