【JavaSE】解密 继承和多态(下)

前言

紧接着上篇 解密继承和多态(上)~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

protected关键字

在同一包下同一类可以访问

代码理解

在同一包下不同类可以访问

代码理解

在不同包下的子类可以访问

代码理解

再谈访问权限问题

final关键字

final修饰变量

final修饰类

组合

代码举例

多态

动态绑定

发生条件

向上转型

代码理解

直接赋值

方法传参

作为返回值 

向下转型

父类和子类 方法的重写

要求

注意

@Override

与代码重载的区别

代码理解


protected关键字

接下来我们谈谈protected关键字

在同一包下同一类可以访问

代码理解

如下的代码,用protected修饰c,在同一个包demo1下的同一类Test1下,func方法可以成功访问c

package demo1;public class Test1 {public int a;protected int c=99;public void func(){System.out.println(c);}
}

在同一包下不同类可以访问

在同一个包demo1下面再建一个类TestProtected1

代码理解

调用Test1产生实例化对象test1,可以通过对象test1访问Test1类下的成员c

package demo1;public class TestProtected1 {public static void main(String[] args) {Test1 test1=new Test1();System.out.println(test1.c);}
}

在不同包下的子类可以访问

被protected修饰,不管同不同包,只要是子类就都可以 通过super 访问

代码理解

新创建另外一个包demo2,再在下面创建一个类Test2

在Test2类中可以通过super成功访问不同包demo2下Test1类中被protected修饰的c

前提:被继承的类是用public修饰的,在代码中体现就是Test被public修饰了才行

(其中类的权限 只有 两种:一个是用public修饰的,另一个是不用public修饰的)

package demo2;import demo1.Test1;//要先导包
//继承Test1
public class Test2 extends Test1 {public void test(){System.out.println(super.c);}public static void main(String[] args) {
//        System.out.println(super.c);//会报错,因为main方法中有static修饰,不能用super}
}

再谈访问权限问题

在上一篇我们讲解了private和public的范围,他们是访问权限的两个极端

  • private只能在同一包的同一类下访问
  • public是 不管是否同包 不管是否同类 都能被访问

我们可以用下图总结

这里的default不是关键字,表示的是在成员变量前不加任何public、private等关键字

Java不支持多继承

final关键字

final修饰变量

final int SIZE=10;表示SIZE变成常量(不能被修改)

final修饰类

final用于控制继承,被final修饰的类 表示 当前类不可以被继承,此时这个类称为密封类

组合

组合是代码层面的一种写法,是has-a的关系(例如 汽车中的零部件组合成了一辆汽车),仅仅是将一个类的示例作为另一个类的成员变量

代码举例

老师类和学生类组合成了学校类

class Teacher{}
class Student{}
class School{private Teacher[] teachers;private Student[] students;
}

多态

同一件事不同的对象上产生的效果是不一样

代码理解

当Animal引用的对象不一样(animal1和animal2),调用eat方法,表现出的行为不一样时(Animal1吃狗粮,Animal2吃鸟粮),这就叫做 多态。

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;}
}
class Dog extends Animal{//Alt键 加上 Enter键快速生成子类构造方法public Dog(String name, int age) {super(name, age);}@Override//注解  用于帮助检查方法重写是否正确,若重写的方法有问题,他就会报错public void eat(){System.out.println(this.name+"正在吃狗粮~");//与父类的eat形成 方法的重写}public void bark(){System.out.println(this.name+" 正在汪汪汪~");}
}
class Bird extends Animal{public Bird(String name, int age) {super(name, age);}public void qiqi(){System.out.println(this.name+" 正在吱吱吱~");}public void eat(){System.out.println(this.name+"正在吃鸟粮~");//与父类的eat形成 方法的重写}
}public class Test {public static void func(Animal animal){}public static Animal func2(){return new Dog("旺财",3);}public static void main(String[] args) {
/*        Dog dog=new Dog();Animal animal=dog;//向上转型*/Animal animal1=new Dog("旺财",3);//向上转型animal1.eat();Animal animal2=new Bird("小蜂",1);animal2.eat();//animal1.bark();//会报错,因为Animal中没有bark方法,通过父类引用只能访问父类自己的有的}
}

实现多态的前提是动态绑定~

动态绑定

编译的是父类方法,但是调用的是子类方法

代码理解

编译用的父类Animal中的eat方法,但结果是调用的是子类eat方法

        Animal animal1=new Dog("旺财",3);//向上转型animal1.eat();

 代码结果

发生条件

父类引用子类对象【向上转型】

通过父类引用 调用重写的方法【方法的重写】

向上转型

实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型()

  • 优点:让代码实现更简单灵活。
  • 缺陷:不能调用到子类特有的方法。

发生向上转型的时机有三种,通过以下代码加以理解

代码理解
直接赋值
    public static void main(String[] args) {
/*        Dog dog=new Dog();Animal animal=dog;//向上转型*/Animal animal1=new Dog("旺财",3);//向上转型}
方法传参
    public static void func(Animal animal){}
作为返回值 
    public static Animal func2(){return new Dog("旺财",3);}

向下转型

        Animal animal1=new Dog("旺财",3);//向上转型Dog dog=(Dog)animal1;//向下转型 要将对象animal1强转成Dog类,否则会报错//因为 不是所有的动物都是狗
父类和子类 方法的重写

重写又叫覆盖、覆写

要求
  • 方法名相同
  • 方法的参数列表相同(个数、顺序、类型)
  • 方法返回值相同
注意
  • 静态方法 不能 被重写
  • 被private修饰的 不能 被重写
  • 被final修饰的 不能 被重写
  • 如果方法被重写,子类的访问权限要 大于等于 父类的权限
@Override

修饰该方法,说明该方法是重写的

与代码重载的区别

代码理解
    
//父类Animal中的eat方法public void eat(){System.out.println(this.name+" 正在吃~");}//子类Dog中的eat方法public void eat(){System.out.println(this.name+"正在吃狗粮~");//与父类的eat形成 方法的重写}

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

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

相关文章

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

Octavia Venture 成立,打造数十亿美元规模的 AI 价值体系

​随着 OpenAI 相继发布 ChatGPT、Sora 等 AIGC 大模型后,AI 赛道的发展迎来了一轮又一轮的热潮,这也让极具想象力的 AI 赛道涌入大量资金,比如英伟达股票市值短时间内从 1 万亿美元暴涨至 2 万亿美元,就是最好的佐证。当然&#…

Linux ssh免密登录配置

步骤 在本地机器上生成公钥和私钥对。将本地公钥复制到远程机器的~/.ssh/authorized_keys文件中。 实现1 在服务器上生成SSH密钥对 ssh-keygen -t rsa -f /home/id_rsa1ssh-keygen: 这是一个用于生成、管理和转换 SSH 密钥的 OpenSSH 工具。-t rsa: 用于指定要生成的密钥类…

Python学习:面相对象

面向对象 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实…

【AI绘画/作图】风景背景类关键词模板参考

因为ds官网被墙,所以翻了IDE的源码整理了下stablestudio里的官方模板,顺便每个模板生成了一份…不知道怎么写关键词的可以参考 Stunning sunset over a futuristic city, with towering skyscrapers and flying vehicles, golden hour lighting and dramatic cloud…

yolov7代码 | model.named_models

文章目录 前言1. print(model)2. print(model.named_models)2.1 print(name)2.2 print(module)2.3 print(f"{name}:: {module}") 3. hasattr(module, weight) 前言 了解model.named_models,为剪枝做准备。 剪枝有一些层如果你不想剪掉,那就用…

实现恒功率控制丨极海APM32F035高压灌溉水泵参考方案

直流无刷电机用途广泛,具有高效节能、使用寿命长、运行可靠无电火花、结构简单易维护等性能优势,在办公设备、智能家居、消费家电、工业设备、医疗设备等领域已规模化落地。随着智能化技术与成本的持续优化,BLDC应用将进一步提升在各行业的渗…

OpenAI官宣,ChatGPT免登录使用

昨天,就在愚人节当天,OpenAI突然宣布ChatGPT3.5向所有人开放,意思是即使没有注册OpenAI的账号,也能体验ChatGPT,就像浏览器一样,联接即可使用。 消息一出,OpenAI的官网直接被大量的用户挤挂了。…

axios 封装 http 请求详解

前言 Axios 是一个基于 Promise 的 HTTP 库,它的概念及使用方法本文不过多赘述,请参考:axios传送门 本文重点讲述下在项目中是如何利用 axios 封装 http 请求。 一、预设全局变量 在 /const/preset.js 中配置预先设置一些全局变量 window.…

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网,点击你想要下载的视频,然后点击免费下载,我们点击免费试用按钮,可以看到非常贵,需要80美金一个月,用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡,就可以白嫖一个…

配mmdetection

1. 安装conda 链接后面补上 2. 装pytorch,版本别装错了 Start Locally | PyTorch用这里面的命令 nvcc --version看cuda版本(实验室服务器是11.0,可以用这个11.8的 ) 检查torch和cuda版本的命令: import torch # …

C语言:二叉树的构建

目录 一、二叉树的存储 1.1 顺序存储 1.2 链式存储 二、二叉树的顺序结构及实现 2.1堆的概念及结构 2.2堆的构建 2.3堆的插入 2.4堆顶的删除 2.5堆的完整代码 三、二叉树的链式结构及实现 3.1链式二叉树的构建 3.2链式二叉树的遍历 3.2.1前序遍历 …

鸿蒙原OS开发实例:【ArkTS类库单次I/O任务开发】

Promise和async/await提供异步并发能力,适用于单次I/O任务的场景开发,本文以使用异步进行单次文件写入为例来提供指导。 实现单次I/O任务逻辑。 import fs from ohos.file.fs; import common from ohos.app.ability.common;async function write(data:…

深入解析大数据体系中的ETL工作原理及常见组件

** 引言 关联阅读博客文章:探讨在大数据体系中API的通信机制与工作原理 关联阅读博客文章:深入理解HDFS工作原理:大数据存储和容错性机制解析 ** 在当今数字化时代,大数据处理已经成为了企业成功的重要组成部分。而在大数据处…

OpenHarmony实战:小型系统 STM32MP1 芯片移植案例

本文章基于意法半导体 STM32MP157 芯片的小熊派 BearPi-HM Micro 开发板,进行小型带屏开发板的移植,实现了 ace_engine_lite、arkui_ui_lite、aafwk_lite、appexecfwk_lite、HDF 等部件基于 OpenHarmony LiteOS-A 内核的适配。移植架构上采用 Board 与 S…

shopee虾皮怎么分析竞品?这些技巧能帮你提升出单量90%+

“竞品分析”长久以来都是运营所纠结的核心问题,没有分析出对标竞品怎么增长销量,却被其他竞品给町上了,导致自身销量不增反减。这种情况我们是无法直观从自身的店铺及商品本身去找到原因的,本质的问题在竞品身上。我们无法控制有…

基于RDMA的云服务能力实践与探索

01 背景 随着基于大数据大模型构建的数据系统越来越有商业价值,机器学习的玩家也越来越多,数据量越来越大。为解决海量数据在服务器之间的同步效率问题,RDMA(Remote Direct Memory Access) 技术逐渐走进了网络技术人员的视野。RDMA为什么…

鸿鹄工程项目管理系统源码:Spring Boot带来的快速开发与部署体验

随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

蓝桥杯单片机速成6-DS1302

目录 一、电路图 二、底层驱动 三、实际应用 四、时序 一、电路图 上图是寄存器地址定义,时分秒,年月日等等 DS1302有自己的时钟线SCLK,不会跟单总线一样因为没有自己的时钟线而导致温度读不出来 CH:时钟静止,置1时…

2024最新软件测试【测试理论+ 抓包与网络协议】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …