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

news2024/10/7 2:17:54

一、多态性

多态在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 {
    @Override
    public void sound() {
        System.out.println("狗发出汪汪声");
    }
}

class Cat extends Animal {
    @Override
    public 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()方法以支持对象的克隆
    @Override
    public 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("人睡觉");
    }

    @Override
    protected void finalize() throws Throwable {
        try {
            // 执行清理操作,例如关闭资源等
            System.out.println("对象被垃圾回收前执行finalize()方法");
        } finally {
            super.finalize();
        }
    }

    @Override
    public 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.coloradmin.cn/o/1887147.html

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

相关文章

掌握这些快捷键,提升你的编程效率!

文章目录 执行代码行操作移动光标查看源码编辑常用操作类操作方法操作文件操作快捷键组合结语 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文…

Chapter9 更复杂的光照——Shader入门精要学习笔记

Chapter9 更复杂的光照 一、Unity的渲染路径1.渲染路径的概念2.渲染路径的类型①前向渲染路径a. 前向渲染路径的原理b. Unity中的前向渲染c. 两种Pass ②延迟渲染路径a. 延迟渲染路径的原理b. Unity中的延迟渲染c. 两种Pass ③顶点照明渲染路径 二、Unity的光源类型1.光源类型①…

【简单讲解神经网络训练中batch的作用】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

IP地址与电商企业

网购作为我们现代生活不可或缺的部分,现如今电商企业蓬勃发展。 IP地址是网络世界中每一台设备的独特标识符,就像现实世界中每家每户的门牌号。对于电商企业而言,它在很多方面方面发挥着作用。 IP地址能够帮助电商企业精准地确定用户所在的地…

2024广州智能音箱展|广州蓝牙耳机展

2024广州智能音箱展|广州蓝牙耳机展 时间:2024年11月29日-12月1日 地点:广州琶洲保利世贸博览馆 【展会简介】 中国是全球最大的音频产品制造基地和消费市场,随着国内外互联网巨头纷纷瞄准音频行业并投入巨资布局AI产品矩阵,音…

思考如何学习一门编程语言?

一、什么是编程语言 编程语言是一种用于编写计算机程序的人工语言。通过编程语言,程序员可以向计算机发出指令,控制计算机执行各种任务和操作。编程语言由一组语法规则和语义规则组成,这些规则定义了如何编写代码以及代码的含义。 编程语言…

C++ ariac2 Windows库编译

cd "F:\\aria2" gmp-6.1.2.tar.lz expat-2.2.0.tar.bz2 sqlite-autoconf-3160200.tar.gz zlib-1.2.11.tar.gz c-ares-1.12.0.tar.gz libssh2-1.8.0.tar.gz --enable-libaria2 --enable-static libgnutls-dev(对于HTTPS,BitTorrent&#xff0…

探囊取物之多形式注册页面(基于BootStrap4)

基于BootStrap4的注册页面,支持手机验证码注册、账号密码注册 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/preview/ly4gax38ub9j 演练页…

墨烯的Java技术栈-数据结构与算法基础-010

(前言 这是在之前容器很多的不知名的名词 想着与其一个个解释不如直接重温一遍数据结构) 一.概念 程序 数据结构 算法 程序的本质 数据结构经常可以说为计算机内功(心法) 而编程能力就是招式(法术) 考研 必考专业课 一共四门专业课 共150分 找工作更不用说:面试主要考…

AcWing 1256:扩展二叉树

【题目来源】https://www.acwing.com/problem/content/1258/【题目描述】 由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用 补齐,如图所示。 我们把这样处理后的二叉树称为原二叉树…

Linux系统之 — 线程

Linux系统之 — 线程 线程介绍线程使用死锁(Deadlock)竞态条件(Race Condition) 线程使用示例服务器端代码示例服务器端示例拆解1. 引入头文件和宏定义2. 定义全局变量3. 定义线程函数4. 主函数5. 错误处理和资源释放 客户端代码示…

谷歌重磅:告别RAG,长上下文的大语言模型无需检索增强

当今人工智能领域正在经历一场静默的革命。随着大语言模型(LLM)的快速发展,它们不仅能够处理更长的上下文,还展现出惊人的推理和检索能力。 难道我们要告别基于LLM的检索增强生成(RAG)了吗? 结果还真是这样,最近谷歌发布专门用于…

k8s公网集群安装(1.23.0)

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

一文搞懂 java 线程池:ThreadPoolExecutor 和 FixedThreadPool 原理

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

数据结构-排序算法篇

前言 在我们的生活中有很多东西都是有大小的,那么该如何去排序?假设有10个数字要你去排序,眼睛一扫就看出来了,那100、1000、10000要怎么去排?下面就为大家介绍各种排序的算法。 内容 1.冒泡排序 2.选择排序 3.插入…

某Dota/IM对战平台玩家助手、查看战绩下、胜率等

功能说明 WAR3游戏启动后,可以自动获取游戏双方的玩家列表,然后查询显示玩家的战绩及个人信息。附带查看玩家的战绩详情、最近游戏,查看对手及友方的战绩详情,据此推算出是否开黑、是否小号等信息 使用方法及运行效果 启动 查…

武汉星起航:贴心服务引领,跨境电商成功启航

在当今全球互联互通日益加强的背景下,跨境电商已经跃升为驱动国际贸易繁荣的重要引擎。作为全球电商领域的翘楚,亚马逊坚守公平、公正、透明的商业准则,为全球卖家搭建了一个值得信赖的交易平台。在这个平台上,众多卖家通过提升产…

如何指定Microsoft Print To PDF的输出路径

在上一篇文章中,介绍了三种将文件转换为PDF的方式。默认情况下,在Microsoft Print To PDF的首选项里,是看不到输出路径的设置的。 需要一点小小的手段。 运行输入 control 打开控制面板,选择硬件和声音下的查看设备和打印机 找到…

Django 多对多关系

多对多关系作用 Django 中,多对多关系模型的作用主要是为了表示两个模型之间的多对多关系。具体来说,多对多关系允许一个模型的实例与另一个模型的多个实例相关联,反之亦然。这在很多实际应用场景中非常有用,比如: 博…

Ceyear®VSA 信号分析软件

CeyearVSA 信号分析软件 CeyearVSA 矢量信号分析软件 CeyearVSA 矢量信号分析软件将信号分析体验和测试应用于桌面,帮助排查问题并优化设计。 CeyearVSA 矢量信号分析软件结合仪表支持在线解调分析,也可支持信号导入离线分析;软件具有多种…