Java学习笔记23(面向对象三大特征)

news2024/11/29 12:46:45

1.5 多态

​ *多态(polymorphic)

​ *方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的

1.多态的具体体现

1.方法的多态

(重写和重载体现了多态)

2.对象的多态

​ 1.一个对象的编译类型和运行类型可以不一致

Animal animal = new Dog();	//animal编译类型是Animal,运行类型是Dog
animal = new Cat();

​ 2.编译类型在定义对象时,就确定了,不能改变

​ 3.运行类型是可以变化的

​ 4.编译类型看定义时=号的左边,运行类型看 = 号的右边

class Cat extends Animal
{
    public void cry()
    {
		System.out.println("小猫喵喵叫")
    }
}

class Animal
{
	public void cry()
    {
		System.out.println("动物在叫")
    }
}

main()
{
	Animal animal = new Cat();
    animal.cry();	//小猫喵喵叫
    //若此时改为Dog类,则会执行Dog类下的方法
    animal = new Dog();
    animal.cry();
}

2.多态的细节

1.多态的前提:两个对象(类)存在继承关系

2.本质:父类的引用指向了子类的对象

3.语法:父类类型 引用名 = new 子类类型();

4.特点:编译类型看左边,运行类型看右边

5.如果子类中写有父类没有的方法,那么如果运用了多态,就调用不了子类特有的成员方法

3.多态的向上转型

​ *(子类转换成父类)

​ *父类也可以是爷爷类(基类)

4.多态的向下转型

​ 1.语法: 子类类型 引用名 = (子类类型) 父类引用

​ 2.只能强转父类的引用,不能强转父类的对象

​ 3.要求父类的引用必须指向的是当前目标类型的对象

​ 4.当向下转型后,可以调用子类类型中所有的成员

main()
{
    Animal animal = new Cat();	//原来的animal的运行类型是Cat对象,所以可以在下面强转为Cat类型
    Cat cat = (Cat) animal;//强转父类引用为为子类	这样就可以调用子类的特有成员方法
}

5.注意事项和细节

1.属性没有重写直说,属性的值看编译类型

class Base
{
	int money = 10;
}

class Sub extends Base
{
    int money = 20;
}

main()
{
	Base base = new Base();
    base.money;//10
    Sub sub = new Sub();
    sub.money;//20
}

2.instanceof 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

class AA{}//父类
class BB extends AA{}//子类


main()
{
	BB bb = new BB();
    System.out.println(bb instanceof BB);//bb是不是BB的类型,返回结果为boolean值
        System.out.println(bb instanceof AA);
    
    //aa 编译类型 AA,运行类型BB
    AA aa = new BB();
	System.out.println(aa instanceof AA);//true
	System.out.println(aa instanceof BB);//true    
}

6.动态绑定机制

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明(函数里面的成员属性为函数所在类下的成员属性),哪里使用

class A
{
    public int i = 10;
    public int sum()
    {
        return getI() + 10;
    }
    public int sum1()
    {
        return i +10;
    }
    public int getI()
    {
        return i;
    }
}

class B extends A
{
    public int i =20;
    public int sum()
    {
        return i +20;
    }
    public int getI()
    {
		return i;
    }
    public int sum1()
    {
		return i +10;
    }
}

main()
{
    A a = new B();//向上转型
    System.out.println(a.sum());//40
 System.out.println(a.sum1());//30    
}

7.多态的应用

1.多态数组

​ *数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

class Teacher extends Person
{
    String name;
    int salary;
    public void say(){}
    public void teach(){}
}

class Student extends Person
{
	String name;
    int score;
    public void say(){}
    public void study(){}
}

class Person
{
    public void say(){}
}

main()
{
    Person[] persons = new Person[5];
    
   persons[0] = new Person("jack", 20);
    persons[1] = new Student("jack",18,100);
    persons[2] = new Teach("scott" ,30 ,20000);
    
    for(int i = 0;i<3;i++)
    {
        System.out.println(persons[i].say());//动态板顶机制
        if(persons[i] instancof Student)
        {
            Student student = (Student)persons[i];//向下转型
            student.study();
        }else if(persons[i] instanceof Teacher)
        {
            Teacher teacher = (Teacher)persons[i];
            teacher.teach();
        } else
        {
            System.out.println("你的类型有误,请自己检查...")
        }
    }
}
2.多态参数

​ *方法定义的形参类型为父类类型,实参类型允许为子类类型

1.6 Object类

在这里插入图片描述

1.equals方法

​ * == 是一个比较运算符

1.==:既可以判断基本类型,又可以判断引用类型

2.==:如果判断基本类型,判断的是值是否相等

3.==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

4.equals:是Object类的方法,只能判断引用类型

5.默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer,String

2.重写equals方法

class Person
{
	private String name;
    private int age;
    private char gender;
    
    //重写Object的equals方法
    public boolean equals(Object obj)
    {
        if(this == obj)
        {
            return true;
        }
    }
    //类型判断
    if(obj instanceof Person)
    {
        //是Person,我们才比较
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
    }
    
    //如果不是Person类型,则直接返回false
    return false;
}

1.7 hashCode

​ *hashCode返回该对象的哈希码值

​ *总结:

1.提高具有哈希结构的容器的效率

2.两个引用,如果指向的是同一个对象,则哈希值肯定是一样的

3.两个引用,如果指向的是不同对象,则哈希值是不一样的

4.哈希值主要根据地址号来的,不能完全将哈希值等价于地址

1.8 toString

​ *返回该对象的字符串表示

​ *基本介绍

1.默认返回:全类名(包名 + 类名) + @ + 哈希值的十六进制

2.当直接输出一个对象时,toString会被默认调用

System.out.println(monster);
System.out.println(monster.toString());

//这两个是等价的

1.9 finalize

1.当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作

2.什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会先调用finalize方法

3.垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动触发垃圾回收机制

main()
{
	Car bmw = new("宝马");
    bmw = null;
    System.gc();	//主动调用垃圾回收器
}

1.10 断点调试(debug)

1.在开发中,新手程序员在查找错误时,这时老程序员就会温馨提示,可以用断点调试,一步一步的看原码执行的过程,发现错误

2.在断点调试过程中,是运行状态,是以对象的运行类型来执行的

1.断点调试介绍

1.断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后可以一步一步往下调试,调试过程中可以看各个变量当前的值

2.断点调试的快捷键

F7(跳入) :跳入方法内

F8(跳过) :逐行执行代码

shift + F8(跳出)

F9(resume,执行到下一个断点)

在这里插入图片描述

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

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

相关文章

亮数据----教你轻松获取数据

文章目录 1. 数据采集遇到的瓶颈1.1 不会造数据&#xff1f;1.2 不会写爬虫代码&#xff1f; 2.IP 代理基础知识2.1 基本概念2.2 作用和分类2.3 IP 代理的配置和使用2.4 安全和合规 3. 为何使用亮数据 IP 代理3.1 拥有丰富的代理网络服务3.2 简单易操作的采集工具3.3 拥有各平台…

爬虫入狱笔记——xx政府网站公开政策数据

最近在学习爬虫&#xff0c;做个笔记吧 今天爬xx政府网站-政策法规栏目的数据 咱们首先需要找到数据从哪里来&#xff0c;鼠标右键->检查&#xff08;或者快捷键一般为F12&#xff09;检查元素&#xff0c;搜索关键词 eg.【违法案例】 回车&#xff0c; 如果没有的话&am…

「媒体邀约」天津媒体邀约资源有哪些?媒体宣传现场报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 天津作为中国北方的重要城市&#xff0c;拥有丰富的媒体资源&#xff0c;可以为各类活动提供全面的媒体宣传和现场报道。以下是天津地区的媒体邀约资源&#xff1a; 1. 报纸媒体 - 《天…

「38」LUT在直播间调色的高级应用……

「38」LUT滤镜 对人或物进行精进调色 OBS软件中的LUT&#xff08;Look Up Table&#xff09;滤镜&#xff0c;可用于调整视频、图像的色彩和对比度等效果&#xff0c;以实现专业级的颜色调整需求。 左图为原图 右图为LUT 先对比上面的两张图&#xff0c;用了滤镜效果的变化…

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接&#xff1a; https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图&#xff1a; 3.未升级前 mellanox 网卡驱动版本如下&#xff1a; 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

基于单片机电动自行车太阳能充电系统设计

**单片机设计介绍&#xff0c;基于单片机电动自行车太阳能充电系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的电动自行车太阳能充电系统设计&#xff0c;是一个将太阳能技术与电动自行车充电技术相结合的创…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章: L…

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…

「媒体宣传」科技IT行业有哪些媒体邀约资源-51媒体网

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 科技IT行业的媒体邀约资源非常丰富&#xff0c;包括了各种类型的传统媒体和新兴的网络媒体平台。以下是一些主要的媒体邀约资源&#xff1a; 除此之外&#xff0c;还有一些其他科技类网络…

finebi6.0中我的分析中...中加自己的菜单

js的两个扩展点是&#xff1a; BI.config("bi.result_wrapper", function (e) {return e.showMerge !0, e}),BI.config("bi.analysis.admin_list", function (e) {return e.showMergeUser !0, e}) 对应的组件在conf.min.js中的 bi.search_sort 点击事件…

【多线程】Callable详解

Callable接口 先看看Callable接口的源码: Callable是一个函数式接口&#xff0c;此时就可以用lambda表达式更简洁地使用它。Callable是个泛型接口&#xff0c;只有一个方法call&#xff0c;该方法返回类型就是传递进来的V类型。call方法还支持抛出异常. 与Callable对应的是Ru…

「媒体宣传」产业金融财经媒体邀约资源有哪些-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 产业金融财经领域的媒体邀约资源涵盖了多种平台和形式&#xff0c;主要包括以下几类&#xff1a; 杂志和报纸&#xff1a;如《中国经济周刊》和《中国证券报》&#xff0c;它们通常报道财…

从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南

文章目录 一、写组件1、注册全局组件方法2、组件13、组件2 二、测试三、发布1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 一、写组件 1、注册全局组件方法 plugins/index.js const requireComponent require.context(./, true, /\.vue$/…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

学浪app中的视频怎么缓存

现在越来越多人在学浪app里面购买课程&#xff0c;有的课程有时间限制&#xff0c;想要下载下来&#xff0c;如果你还不知道下载的方法&#xff0c;可以看看我这篇文章&#xff0c;专门讲解如何缓存学浪app里面的课程 讲技术方法很多人可能听不懂&#xff0c;所以我就将技术融…

室友打团太吵?一条命令让它卡死

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 SYN Flood 1、hping3实现SYN Flood1.1、主机探测1.2、扫描端…

BugKu:Flask_FileUpload

1.打开此题 通过题目知道这个是一个关于Flask的文件上传的漏洞题目 2.查看网页源代码 Flask是一个使用Python编写的轻量级Web应用框架。 这里又提示说用python来运行结果&#xff0c;那很有可能就是要通过python脚本来抓取flag 3.编辑Python脚本 工具&#xff1a;pycharm 文件…

C++从入门到精通——this指针

this指针 前言一、this指针的引出问题 二、this指针的特性三、例题什么时候会出现编译报错什么时候会出现运行崩溃this指针存在哪里this指针可以为空吗 四、C语言和C实现Stack的对比C语言实现C实现 前言 this指针是一个特殊的指针&#xff0c;在C类的成员函数中使用。它指向调…

高校本科毕业论文word 自动化模板

高校本科毕业论文word 自动化模板 “一份好的论文模板能真正能够让作者专注于内容&#xff0c;而不用关注令人烦恼的排版细节问题, 例如插入页眉页码、插入目录、编号、交叉引用、参考文献等等。本文提供中山大学本科毕业论文Word模板&#xff0c;已经按照学校最新格式规范设置…

Qt使用iostream的cout

在QT想使用iostream的cout。 参考以下博客&#xff1a; &#xff08;转载&#xff09;Qt中使用cout输出的方法 pro里加上; CONFIG console勾选 Run in Terminal clean工程&#xff0c;重新构建 上面是cout的&#xff0c;下面是我的另一个函数的qDebug输出的。