【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.hqwc.cn/news/586954.html

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

相关文章

YARN集群 和 MapReduce 原理及应用

YARN集群模式 本文内容需要基于 Hadoop 集群搭建完成的基础上来实现 如果没有搭建&#xff0c;请先按上一篇: <Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤> 搭建&#xff1a;https://mp.weixin.qq.com/s/zPYsUexHKsdFax2XeyRdnA 配置hadoop安装目录下的 etc…

【每日一题】894. 所有可能的真二叉树-2024.4.2

题目&#xff1a; 894. 所有可能的真二叉树 给你一个整数 n &#xff0c;请你找出所有可能含 n 个节点的 真二叉树 &#xff0c;并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val 0 。 答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的…

火鸟门户系统—旅游度假模块

旅游度假 简介 旅游度假功能为用户提供一站式旅游度假服务&#xff0c;车站、酒店民宿、门票、跟团游、货运、签证等多个方面&#xff0c;满足用户多样化的旅游需求。 功能 订单&#xff1a;提供订单预订服务&#xff0c;用户可以根据自身需求选择合适的旅行产品。酒店民宿…

Chronos: 将时间序列作为一种语言进行学习

这是一篇非常有意思的论文&#xff0c;它将时间序列分块并作为语言模型中的一个token来进行学习&#xff0c;并且得到了很好的效果。 Chronos是一个对时间序列数据的概率模型进行预训练的框架&#xff0c;它将这些值标记为与基于transformer的模型(如T5)一起使用。模型将序列的…

OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接。 一、案例简介 该程序是基于…

为何网易游戏会选择引入OceanBase数据库

本文作者&#xff1a;田维繁&#xff0c;网易游戏关系型数据库小组负责人 作为中国游戏开发领域的佼佼者&#xff0c;网易游戏始终站在网络游戏自主研发的前沿。其产品及周边产品线丰富多样&#xff0c;因此&#xff0c;为满足各种业务场景的需求&#xff0c;需要多种不同的数据…

STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用 &#x1f4d1;DWT(Data Watchpoint and Trace数据观察触发器&#xff09;描述 &#x1f4dd;DWT是属于处理器内核单元中的调试组件之一&#xff0c;由四个比较器组成。它们可配置为&#xff1a;硬件监视点或对ETM或PC采样器或数据地…

实验四 微信小程序智能手机互联网程序设计(微信程序方向)实验报告

请编写一个用户登录界面&#xff0c;提示输入用户名和密码进行登录&#xff1b; 代码 index.wxml <view class"user"> <form bindreset""> <view>用户名&#xff1a;</view><input type"text"name""/>…

为什么要选择第三方软件测试机构?CMA、CNAS第三方软件测试机构推荐

第三方软件测试机构是独立于软件开发方和软件使用方的中立机构&#xff0c;致力于对软件产品进行全面、客观、专业的测试和评估&#xff0c;为软件开发方和使用方提供全面的技术支持和服务。 一、为什么要选择第三方软件测试机构   1、专业性强&#xff1a;拥有专业的测试团…

AI论文速读 | 【综述】用于轨迹数据管理和挖掘的深度学习:综述与展望

论文标题&#xff1a;Deep Learning for Trajectory Data Management and Mining: A Survey and Beyond 作者&#xff1a;Wei Chen(陈伟), Yuxuan Liang(梁宇轩), Yuanshao Zhu, Yanchuan Chang, Kang Luo, Haomin Wen(温浩珉), Lei Li, Yanwei Yu(于彦伟), Qingsong Wen(文青…

短视频短剧小程序搭建支持抖音快手百度微信h5端源码+教程

短视频短剧小程序搭建支持抖音快手百度微信h5端源码教程 预览 https://duanju.baicaitang.cn/h5/#/ 安装 一个备案域名服务器阿里云oss 后端搭建 1、导入数据库sql 2、设置运行目录 /public 3、伪静态 location / {index index.html index.htm index.php;#主要是这一段一定要…

力扣刷题Days31-第二题-125.验证回文串(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1自己完成 2.2双指针 1&#xff0c;题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你…