Java学习 (七) 面向对象--多态、object类

一、多态性

多态在java中的体现是 父类的引用指向子类的对象

格式:
  父类类型  变量名  = 子类对象

1、代码案例

vi Person.java

public class Person {public String name;public int age;//新增方法public void eat(){System.out.println("人吃饭");}public void sleep(){System.out.println("人睡觉");}
}

vi Man.java

//Man 类继承Person类
public class Man extends Person {boolean isSmoking;public void eat(){System.out.println("男人吃肉长肌肉");}public void walk(){System.out.println("男人走路");}public void earnMoney(){System.out.println("男人挣钱养家");}}

vi Woman.java

public class Woman extends Person {boolean isBeauty;public void eat(){System.out.println("女人少吃减肥");}public void walk(){System.out.println("女人走路");}public void goShopping(){System.out.println("女人喜欢逛街");}
}

上面我们定义了一个父类,两个子类去继承所有方法和属性,两子类都重写了eat方法,并且拥有自己独立的其他方法,我们先测试一下

 vi PersonTest.java

public class PersonTest {public static void main(String[] args) {//未使用多态性Person p1 =new Person();Man m1   =    new Man();//使用多态性//在声明子类的时候,使用父类接收Person p2 = new Man();}
}

我们可以将子类赋值给父类的变量,就是多态性,但是要求必须是子类才能我这样做

2、多态性的应用

目前为止我们依旧不知道多态能干啥,只知道用子类能声明给父类,上代码

  vi PersonTest.java

public class PersonTest {public static void main(String[] args) {//未使用多态性Person p1 =new Person();Man m1   =    new Man();//使用多态性//在声明子类的时候,使用父类接收Person p2 = new Man();//多态性的应用p2.eat();}
}

返回

男人吃肉长肌肉

有了一丝明悟,多个子类存在相同方法时,根据传入的子类自动区分不同子类下的方法

我们将man赋值person中去调用eat,发现他调用的还是man,但是我们在idea上点住ctrl 去点击eat发现跳转到person下面了

 

3、实现多态的条件

1、继承关系#存在继承关系的类之间才能够使用多态性#多态性通常通过一个父类用变量引用子类对象来实现。2、方法重写#子类必须重写(Override)父类的方法。通过在子类中重新定义和实现父类的方法#可以根据子类的特点行为改变这个方法的行为,如猫和狗吃东西的独特行为。3、父类引用指向子类对象#使用父类的引用变量来引用子类对象。这样可以实现对不同类型的对象的统一操作#而具体调用哪个子类的方法会在运行时多态决定

4、多态案例展示

vi Main.java

class Animal {public void sound() {System.out.println("动物发出声音");}
}class Dog extends Animal {@Overridepublic void sound() {System.out.println("狗发出汪汪声");}
}class Cat extends Animal {@Overridepublic void sound() {System.out.println("猫发出喵喵声");}
}public class Main {public static void main(String[] args) {Animal animal1 = new Dog(); // 父类引用指向子类对象Animal animal2 = new Cat(); // 父类引用指向子类对象animal1.sound(); // 输出:狗发出汪汪声animal2.sound(); // 输出:猫发出喵喵声}
}

如果我们测试某个类型,比如动物类下面的犬类,那么拿到的类属性都是犬科下面的,如果什么都不声明,直接调用类,那么就是访问的类本身下面的,除非有子类以父类的形式赋值,不然都会优先调用默认的父类的方法,所以说想要多态,就得使用继承和重写才能去实现多态

5、多态的弊端

二、object类

在java中,如果没有定义类继承与那个父类,那么他会默认继承object类,java.lang.object可以理解为所有类的一个超类

 

1、object说明

2、objects的常用方法

clone(): 复制对象equals(Object obj): 用于比较对象是否相等finalize(): 在对象被垃圾回收前调用getClass(): 返回对象的运行时类hashCode(): 返回对象的哈希码值toString(): 返回对象的字符串表示。wait(), notify(), notifyAll(): 用于线程同步。

1、clone 克隆

1、在Person类中实现Cloneable接口。2、重写clone()方法,并在方法中调用super.clone()进行对象的浅拷贝。3、处理CloneNotSupportedException异常

 vi Person.java

public class Person implements Cloneable {public String name;public int age;public void eat() {System.out.println("人吃饭");}public void sleep() {System.out.println("人睡觉");}//实现Cloneable接口,并重写了clone()方法以支持对象的克隆@Overridepublic Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {// 处理异常e.printStackTrace();return null;}}
}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person();p1.name = "Alice";p1.age = 30;// 使用克隆创建新对象Person p2 = (Person) p1.clone();p2.name = "Bob";p2.age = 25;// 输出两个对象的信息System.out.println("Person 1 - Name: " + p1.name + ", Age: " + p1.age);System.out.println("Person 2 - Name: " + p2.name + ", Age: " + p2.age);//输出两个类的地址System.out.println("Person 1 - Name: " + p1.name + ", class: " + p1);System.out.println("Person 2 - Name: " + p2.name + ", class: " + p2);}
}

返回

Person 1 - Name: Alice, Age: 30
Person 2 - Name: Bob, Age: 25
Person 1 - Name: Alice, class: Person@5b480cf9
Person 2 - Name: Bob, class: Person@6f496d9f

2、finalize 垃圾回收

vi Person.java

public class Person implements Cloneable {public String name;public int age;public void eat() {System.out.println("人吃饭");}public void sleep() {System.out.println("人睡觉");}@Overrideprotected void finalize() throws Throwable {try {// 执行清理操作,例如关闭资源等System.out.println("对象被垃圾回收前执行finalize()方法");} finally {super.finalize();}}@Overridepublic Object clone() {try {return super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person();p1.name = "Alice";p1.age = 30;// 使用克隆创建新对象Person p2 = (Person) p1.clone();p2.name = "Bob";p2.age = 25;// 输出两个对象的信息System.out.println("Person 1 - Name: " + p1.name + ", Age: " + p1.age);System.out.println("Person 2 - Name: " + p2.name + ", Age: " + p2.age);// 手动置空对象引用,触发垃圾回收p1 = null;p2 = null;// 强制调用垃圾回收System.gc();}
}

在这个修改后的代码中,我们在Person类中重写了finalize()方法,在该方法中执行了清理操作。在PersonTest类的main方法中,我们创建了两个Person对象p1p2,然后手动将对象引用置空,以便触发垃圾回收。最后,通过调用System.gc()强制进行垃圾回收,从而使系统调用对象的finalize()方法

这个方法在1.9之后会提示过时了,但是还能用,过时的原因是内部可能出现循环引用,导致此对象不能回收

3、equals  判断地址值是否相同

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person();Person p2 = new Person();//对比p1和p2的地址值,如果不同则返回false//equals 的作用是判断两个变量的地址值是否相同,因为new了两个地址值所以一定是不同的System.out.println(p1.equals(p2));System.out.println(p1);System.out.println(p2);}
}
注意

自定义的类在没有重写Object中的equals方法的情况下,调用的就是object类中声明的equals,比较两个对象的引用地址是否相同,或者说比较两个对象是否指向了堆空间中的同一个对象实体,在实际开发中,针对自定义的类,镜像会去判断两个对象是否equals,而此时主要判断两个对象的属性值是否相等,所以我们需要重写object类的equals方法,关于如何重写,推荐调用idea自动实现

在IntelliJ IDEA中可以使用快捷键快速生成和重写equals()方法。以下是在IDEA中使用快捷键的步骤:1、在Person类中,将光标放在类名或类中的任何位置。2、按下快捷键Alt + Insert(或者在菜单栏中选择Code -> Generate...)。3、在弹出的菜单中选择equals() and hashCode()选项。4、在弹出的对话框中勾选需要比较的属性(如name和age),然后点击OK。5、IDEA会自动生成equals()和hashCode()方法的代码。

4、tostring 对象转换字符串

方法是用于将对象转换为字符串表示形式的方法。当我们需要以字符串形式输出对象的内容时,可以重写toString()方法来定义对象的字符串表示方式。

 vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person();System.out.println(p1.toString());}
}

返回

Person@3b07d329

看起来和我们直接System.out.println执行的效果是一样的,其实他下面就是调用的tostring

像string  file   date 或者包装类等object的子类,他们都重写了object类的tostring()  在调用tosring是返回当前对象的实体内容

 重写tostring

5、static  类变量(公共变量)

vi Person.java

public class Person {public String name;public Person(String name){this.name = name;}
}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person("你好1");Person p2 = new Person("你好2");}
}

在上面的代码中变量name是一个实例/成员变量,他属于类的每一个对象,p1中的变更对p2没有影响,如果想要让成员变量被类的所有实例共享,就用static修饰即可,称为类变量

 1、static格式

 

2、静态变量案例

vi Person.java

class Person {//变更为静态变量static String name;}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 未使用多态性Person p1 = new Person();Person p2 = new Person();p1.name = "123";System.out.println(p1.name);System.out.println(p2.name);}
}

我们给公共变量static赋值后,哪怕是不同的对象中也存在

3、静态方法

静态方法随着类的加载而加载,可以通过 “类.静态方法" 直接调用

vi Person.java

class Person {//变更为静态变量static String name;//添加静态方法public static void  show(){System.out.println("你好");}}

静态方法不需要声明new,可以直接调用

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 静态方法不需要声明new  直接调用Person.show();}
}

 静态方法可以直接在其他方法中通过方法名调用

vi Person.java

class Person {//变更为静态变量static String name;//添加静态方法public static void  show(){System.out.println("你好1");}public static void get(){//调用静态方法show();System.out.println("你好2");}}

vi PersonTest.java

public class PersonTest {public static void main(String[] args) {// 静态方法不需要声明new  直接调用Person.get();}
}

4、什么时候使用静态

 

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

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

相关文章

github仓库的基本使用-创建、上传文件、删除

1.第一步 先点击左侧菜单栏的远程仓库 2.点击NEW 3.创建仓库 然后点击右下角的 CREATE 4.点击code 点击SSH,然后我出现了You don’t have any public SSH keys in your GitHub account. You can add a new public key, or try cloning this repository via HTTPS. 1&#xff…

【MySQL备份】Percona XtraBackup加密备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 2.4.生成加密密钥 2.5.配置加密密钥文件 3.加密备份 4.优化加密过程 5.解密加密备份 6.准备加密备份 7.恢复加密备份 7.1.使用rsync进行恢复 7.2.使用xtrabackup命令恢…

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略

什么是半监督目标检测? 传统机器学习根据训练数据集中的标注情况,有着不同的场景,主要包括:监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性,在介绍半监督目标检测方法之前,我…

【驱动篇】龙芯LS2K0300之红外驱动

实验目标 编写HX1838红外接收器驱动,根据接收的波形脉冲解码红外按键键值 模块连接 模块连接:VCC接Pin 2,GND接Pin1,DATA接Pin16 驱动代码 HX1838 GPIO初始化,申请中断,注意:GPIO48默认是给…

2023-2024华为ICT大赛中国区 实践赛网络赛道 全国总决赛 理论部分真题

Part1 数通模块(10题): 1、如图所示,某园区部署了IPv6进行业务测试,该网络中有4台路由器,运行OSPFv3实现网络的互联互通,以下关于该OSPFv3网络产生的LSA的描述,错误的是哪一项?(单选题) A.R1的LSDB中将存在…

Appium adb 获取appActivity

方法一(最简单有效的方法) 通过cmd命令,前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…

会声会影2024破解版下载 让视频编辑更简单、更有趣

在数字时代,视频已经成为我们生活中不可或缺的一部分。无论是记录生活、分享快乐,还是宣传产品、传递信息,视频都扮演着重要的角色。然而,对于很多人来说,视频编辑却是一个让人望而却步的领域。复杂的软件操作、繁琐的…

容器安全:等保合规性的基石

随着云计算和微服务架构的蓬勃发展,容器技术已经成为现代IT基础设施不可或缺的一部分。在网络安全等级保护制度(等保)的框架下,容器安全的要求日益凸显,成为等保合规性的基石。本文将深入探讨容器安全在等保中的重要性…

爽!强化学习+注意力机制,吞吐量提升了10多倍!

通过引入注意力机制,强化学习模型不仅能够更加高效地处理复杂的环境和任务,还能在学习和决策过程中实现更高的精度和适应性。 因此这种结合迅速成为了各大领域的研究热点,而且已经在实际应用中有了显著的性能提升。比如分散式强化学习框架SA…

在嵌入式商用里面哪款RTOS(实时操作系统)比较多人用?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 传统的RTOS和嵌入式Linu…

Qt中使用MySQL数据库详解,好用的模块类封装

本文将详细介绍如何在Qt应用程序中集成MySQL数据库,并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤,同时包含mysql驱动的编译。分享给有需要的小伙伴,喜欢的可以点击收藏。 目录 环境准备 项…

javaSE期末练习题

文章目录 前言一、程序控制1.顺序结构问题描述解题思路题解 2.选择结构2.1 题1问题描述解题思路题解 2.1 题2问题描述解题思路题解 3.循环结构3.1 阶乘的求取问题描述解题思路题解 3.2 水仙花数问题描述解题思路题解 二、数组三、类与对象1.类与对象1.1圆类问题描述解题思路题解…

从云原生视角看 AI 原生应用架构的实践

本文核心观点: 基于大模型的 AI 原生应用将越来越多,容器和微服务为代表的云原生技术将加速渗透传统业务。API 是 AI 原生应用的一等公民,并引入了更多流量,催生企业新的生命力和想象空间。AI 原生应用对网关的需求超越了传统的路…

使用myCobot和OAK-D OpenCV DepthAI摄像头制作一个可以在眼前始终享受视频的手机支架!

引言 由于YouTube和Netflix的出现,我们开始躺着看手机。然而,长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架,让你无需用手拿着手机。请务必试试! 准备工作 这次我们…

电脑文件自动备份:构建坚不可摧的数据防护网

在数字化浪潮的推动下,电脑已成为我们日常生活和工作中不可或缺的一部分,它承载着海量的个人信息、工作文档、学习资料等重要数据。然而,随着数据量的不断膨胀,数据安全问题也日益严峻。硬盘故障、系统崩溃、病毒攻击、人为误操作…

【中项第三版】系统集成项目管理工程师 | 第 2 章 信息技术发展

前言 第2章对应的内容大概率仅考察选择题,通读教程,速战速决。选择题分值预计在2-5分,属于必考的知识点。 2.1 信息技术及其发展 信息技术是在信息科学的基本原理和方法下的关于一切信息的产生、信息的传输、信息的发送、信息的接收等应用技…

2Python的Pandas:读取数据

1.读取Excel文件 1.1.读取数据 import pandas as pd# Excel 文件的 URL 或本地路径 url "https://www.gairuo.com/file/data/dataset/team.xlsx"# 使用 Pandas 的 read_excel 函数读取数据 try:df pd.read_excel(url)print(df.head()) # 打印 DataFrame 的前几行…

k8s公网集群安装(1.23.0)

网上搜到的公网搭建k8s都不太一致, 要么说的太复杂, 要么镜像无法下载, 所以写了一个简洁版,小白也能一次搭建成功 使用的都是centos7,k8s版本为1.23.0 使用二台机器搭建的, 三台也是一样的思路1.所有节点分别设置对应主机名 hostnamectl set-hostname master hostnamectl set…

简述设计模式-代理模式

概述 代理模式:一个类代表另一个类的功能。代理模式通过引入一个代理对象来控制对员对象的访问。 举个例子,就像明星都有经纪公司,商业合作都是直接和经济公司沟通,不会直接和明星沟通。 律师和委托人就是代理关系,…