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

news2024/10/7 18:25:11

前言

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

欢迎关注个人主页:逸狼


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

如有错误,欢迎指出~



目录

前言

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.coloradmin.cn/o/1563724.html

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

相关文章

【性能测试】接口测试各知识第1篇:接口测试,学习目标【附代码文档】

接口测试完整教程(附代码资料)主要内容讲述:接口测试,学习目标学习目标,2. 接口测试课程大纲,3. 接口学完样品,4. 学完课程,学到什么,5. 参考:,1. 理解接口的概念。学习目标,RESTFUL1. 理解接口的概念,2.什么是接口测试…

ZYNQ学习之Ubuntu下Linux文件系统、用户权限与磁盘管理

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Linux 文件系统 1.1 Linux 文件系统简介以及类型 操作系统的基本功能之一就是文件管…

JS详解-fetch核心语法

document.querySelector(.btn).addEventListener(click,async () > {const p new URLSearchParams({pname:浙江省,cname:杭州市})//1、如何请求&#xff1f;默认为get&#xff0c;参数1 url地址&#xff0c;返回promiseconst res await fetch(http://hmajax.itheima.net/…

AI提速 OpenAI 新模型GPT-5今年上线?

这两天&#xff0c;有关OpenAI新模型 GPT-5的消息又多了起来。有知情人士称&#xff0c;OpenAI将在今年年中的某个时候发布GPT-5&#xff0c;很可能是在今年夏天期间。OpenAI CEO 萨姆奥特曼在一次播客采访中透露“GPT-5的智能水平得到提升”。 有趣的是&#xff0c;播客的主理…

JavaScript库,编写$()和getElementsByClassName()方法

背景: JavaScript库是一组预先编写好的JavaScript代码集合&#xff0c;旨在简化常见的网页开发任务。这些库通常包含了许多函数和方法&#xff0c;可以帮助开发人员处理各种任务&#xff0c;比如DOM操作、事件处理、动画效果、AJAX请求等等。使用JavaScript库可以节省开发时间…

如何借助AI工具轻松绘制思维导图

前言 思维导图是一种将思维可视化的工具&#xff0c;它可以帮助我们理清思路、提高效率、促进记忆。传统的思维导图绘制方法需要一定的时间和技巧&#xff0c;而借助AI工具&#xff0c;我们可以轻松绘制思维导图&#xff0c;并将更多时间和精力集中在内容本身。 借助AI工具把…

网络以太网之(2)VLAN协议

网络以太网之(1)VLAN协议 Author: Once Day Date: 2024年4月1日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day…

输出100~200之间的素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现素数判断函数&#xff1b; int Prime(int number) {//初始化变量值&#xff1b;int divided 2;int JudgementCondition 0;//循环判断素数&#xff1b;wh…

基于SpringBoot+微信小程序的外卖跑腿点餐(订餐)系统设计与实现+毕业论文(12000字)

介绍 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发展的快速应…

美联储,非必要,不降息

美联储“没必要、没空间、没动力”降息&#xff0c;也会尽量避免货币政策干扰大选&#xff0c;用“口头降息”代替实际调整是现实选择&#xff0c;市场降息预期将继续推迟和下调。 前言&#xff1a; 当前美国经济从各个方面看均并未表现出疲态——新增就业持续修复&#xff0c;…

俄罗斯Yandex广告推广如何开户及费用?

作为俄罗斯首屈一指的搜索引擎&#xff0c;Yandex凭借其超过60%的市场份额&#xff0c;成为企业进入俄罗斯、触及俄语消费者的关键入口。然而&#xff0c;对于不熟悉当地市场环境与网络营销规则的企业而言&#xff0c;成功开户并高效运营Yandex广告并非易事。云衔科技凭借专业的…

大模型量化技术-AWQ

大模型量化技术-AWQ 在2023年6月,Ji Lin等人发表了论文AWQ:Activation-aware Weight Quantization for LLM Compression and Acceleration。 这篇论文详细介绍了一种激活感知权重量化算法,可以用于压缩任何基于 Transformer 的语言模型,同时只有微小的性能下降。关于 AWQ 算…

2024 年云繁荣:驾驭人工智能驱动转型浪潮

在人工智能革命的核心&#xff0c;2024 年见证了云计算应用的空前激增。云计算的繁荣不仅仅是异地存储数据&#xff0c;而是创建动态的智能基础设施&#xff0c;推动人工智能的指数级增长。让我们深入探讨推动这一现象的关键因素和趋势。 01 人工智能和云&#xff1a;共生关系…

Mac上怎么合并多张图片?

Mac上怎么合并多张图片&#xff1f;上班过的小伙伴都应该知道&#xff0c;合并拼接图片是一件非常重要且经常需要使用到的图片处理技术&#xff0c;将多张图片合并拼成一张之后能够展现出更多的图片内容。在Mac电脑上&#xff0c;合并多张图片是一项常见的任务&#xff0c;无论…

鸿蒙OS开发实例:【ArkTS类库多线程@Concurrent装饰器校验并发函数】

在使用TaskPool时&#xff0c;执行的并发函数需要使用该装饰器修饰&#xff0c;否则无法通过相关校验。从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 装饰器说明 Concurrent并发装饰器说明装饰器参数无。使用场景仅支持在Stage模型的工程中使用。装饰的函…

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

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

【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。

如题&#xff1a; 允许用户有三次体验效果&#xff0c;然后弹出激励视频弹窗&#xff0c;之后当日不再弹出。 体验小程序&#xff1a; /*** 判断当前项目当天是否点击超过3次&#xff0c;触发广告效果。* 若&#xff0c;当天低于三次&#xff0c;则新增&#xff0c;若高于…

达梦数据库 优化

谁进行优化&#xff1f;优化什么&#xff1f; 优化不能仅从数据库方面考虑&#xff0c;比如&#xff0c;在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下&#xff0c;进行调优就是杯水车薪的效果。 涉及到优化人员&#xff1a; 数据库管理员应用程序架构师应用…

gulp的基本使用(二)

gulp的基本使用&#xff08;二&#xff09; 任务&#xff08;Tasks&#xff09;创建任务&#xff08;Tasks&#xff09;分类 series()和parallel()的区别series()parallel()代码运行命令结果series() 和 parallel()根据环境运行series() 和 parallel()相互深层嵌套当两个任务的…

C语言:二叉树的构建

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