雪里温柔,水边明秀,不及Java 抽象类 和 Object类

news2024/11/23 9:22:42

本篇会加入个人的所谓‘鱼式疯言’

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言
而是理解过并总结出来通俗易懂的大白话,
小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.
🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

前言

在上一篇面向对象编程的系列中,我们认识了 类和对象,并熟悉了面向对象编程的三大特效

而在本篇文章中将继续围绕着前面的故事展开续写,进行 抽象类和 Object 的讲解

目录

  1. 抽象类

  2. Object类

一. 抽象类

1. 抽象类的初识

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类

比如:

在这里插入图片描述
在打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由 Shape
的各种子类的 draw 方法来完成的

在这里插入图片描述

像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstractmethod),

包含抽象方法的类我们称为 抽象类(abstract class).

2. 抽象类语法

在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。

abstract public class Shape {

    abstract  public  void draw();

    abstract void calcArea();
    
    // 抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }
    
    protected double area; // 面积
}

以上现象表明我们的抽象方法是在抽象类中的

没有抽象类的抽象方法是不存在的 , 换言之,抽象方法必须在抽象类中

并且抽象类中是可以包含 不止抽象方法还有我们普通类的都有的成员变量和成员方法

3.举个栗子

abstract public class Shape {

    abstract  public  void draw();

    abstract void calcArea();

    // 抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }

    protected double area; // 面积
}


class Triangle extends Shape{

    @Override
    public void draw() {
        System.out.println("正在画三角形!");
    }

    @Override
    void calcArea() {
        System.out.println("正在计算三角形面积!");
    }

}


class Test {
    public static void main(String[] args) {
        Shape s=new Triangle();
        s.draw();
        s.calcArea();
    }
}

在这里插入图片描述
在上面的代码中我们发生了继承,向上转型,动态绑定,多态。

是的,所以我们可以这么说吧,我们的抽象类就是为了多态服务的

下面小编就来说说我们的抽象类的独有的特性吧 💕 💕 💕

4. 抽象类的特性

  1. 抽象类不能被实例化对象

在这里插入图片描述

2. 抽象方法不能被 private 修饰

在这里插入图片描述

  1. 抽象方法不能被final 和 static 修饰

在这里插入图片描述
在这里插入图片描述

  1. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用abstract 修饰

在这里插入图片描述

  1. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  1. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

鱼式疯言

全面总结下

有图有真相

在这里插入图片描述

二. Object类

啥是object类呢,这个类是用来干嘛的呢,下面小编来介绍下我们强大的让人发麻的 Object类

1. Obejct 类的初识

Object 是 Java 默认提供的一个类。

Java里面除了 Object类,所有的类都是存在继承关系的。

默认会继承Object父类。

即所有类的对象都可以使用Object的引用进行接收。

2. 举个栗子

在这里插入图片描述
以上想象是不是有发生了向上转型呢,没错,

我们的 new 的子类对象由我们的父类引用来接收,由此发生了向上转型

更充分的说明了一点我们的Object类是所有类的父类,是默认继承下来的

但小伙伴们有没有想过一个问题我们的 Object 类存在是用来做什么的呢

小伙伴们先看张图哦, 答案马上揭晓 💖 💖 💖

在这里插入图片描述
对于 整个Object类中的方法需要实现全部掌握。

而本篇文章当中,我们主要来熟悉这几个方法:

toString()方法,equals()方法,hashcode()方法

下面让小编带着宝子们逐个分析

3. toString()方法

我们 toString() 方法主要是负责我们的打印工作

<1>. Object类

在Object类中的 tostring()方法 是这样的


// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

所以就会出现这样的打印

在这里插入图片描述

<2>. 子类

当我们需要打印对象内容时,我们就重写我们的方法

class Preson {

   public int age;
   public String name;

    public Preson(int age, String name) {

        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Preson{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}


class  Test {
    public static void main(String[] args) {
        Preson preson=new Preson(18,"小罗");
        System.out.println(preson);

    }


}

在这里插入图片描述

这时就发挥了我们 toString() 方法的打印的效果

鱼式疯言

当我们未重写toString方法时打印的是伪地址

当我们重写了toString方法时打印的是当前对象的内容

4. equals() 方法

在我们的Java中,用 == 比较时

可能会出现以下不同类型的比较

a.如果==左右两侧是基本类型变量, 比较的是变量中值是否相同

b.如果==左右两侧是引用类型变量, 比较的是引用变量地址是否相同

c.如果要比较对象中内容,必须重写 Object中的equals方法,因为equals方法默认也是按照地址比较的:

<1>. Object类

在我们Object类中的 equals方法

// Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
}

在这里插入图片描述

实际上我们看到当小伙伴们的 false

本质上是比较这两个对象的地址,

因为是new出来的对象,所以地址一定是不一样的

<2>. 子类

那如果宝子们要比较这两个对象的内容是否相等的话就需要 重写我们equals()方法

class Preson {

   public int age;
   public String name;

    public Preson(int age, String name) {

        this.age = age;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Preson preson = (Preson) o;
        return age == preson.age && Objects.equals(name, preson.name);
    }

}


class  Test {
    public static void main(String[] args) {
        Preson preson1=new Preson(18,"小罗");
        Preson preson2=new Preson(18,"小罗");
        int a=10,b=10;

        System.out.println(a==b); // true
        System.out.println(preson1==preson2); // false
        System.out.println(preson1.equals(preson2)); // true

    }


}

这时我们是不是成功了 😁 😁 😁

当我们重写方法时,我们就直接比较对象中所有成员变量的内容,

只有全部都相等,才会返回 true 否则就是 false

鱼式疯言

Object类中 equals 比地址

子类中 equals 比内容

结论:比较对象中内容是否相同的时候,一定要重写equals方法。

5. hashcode()方法

回忆下我们讲过的toString()方法的源码:

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

我们看到了hashCode()这个方法,他帮我算了一个具体的对象位置

这里面涉及数据结构,但是小伙伴们还没学数据结构,没法讲述,所以我们只能说它是个内存地址。然后调用Integer.toHexString()方法,将这个地址以16进制输出。

<1>. Object类

public native int hashCode();

该方法是一个native方法,底层是由C/C++代码写的。我们看不到。

我们认为两个名字相同,年龄相同的对象,将存储在同一个位置

如果不重写hashcode()方法,我们可以来看栗子

代码如下:

class Preson {

   public int age;
   public String name;

    public Preson(int age, String name) {

        this.age = age;
        this.name = name;
    }



}


class  Test {
    public static void main(String[] args) {
        Preson preson1=new Preson(18,"小罗");
        Preson preson2=new Preson(18,"小罗");

        System.out.println(preson2.hashCode());
        System.out.println(preson1.hashCode());

    }


}

在这里插入图片描述

从中我们看到了为什么之前 == 返回 false 的原因了,也清楚的明白了打印出的就是我们的地址了

在我们Object类中的 hashcode( ) 中是用来打印不同对象的不同地址的

如果对象而不在乎它的内容

<2>. 子类

class Preson {

   public int age;
   public String name;

    public Preson(int age, String name) {

        this.age = age;
        this.name = name;
    }


    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }
}


class  Test {
    public static void main(String[] args) {
        Preson preson1=new Preson(18,"小罗");
        Preson preson2=new Preson(18,"小罗");

        System.out.println(preson2.hashCode());
        System.out.println(preson1.hashCode());

    }


}

在这里插入图片描述

而我们看到重写的 hashcode()方法打印的哈希值是一样的,

以此证明重写的方法是 关注内容的

鱼式疯言

Object中的哈希值是关于不同对象的地址

子类中的哈希值是关注内容的地址

总结

  1. 抽象类: 理解了抽象类的特点以及和抽象方法之间的关系
  2. Object类:熟悉了在父类的Object类中不同的常用方法以及子类的重写方法

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

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

相关文章

javaWeb健康管理系统

一、引言 1.1 设计背景 紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检&#xff0c;教职工人入职体检&#xff0c;以及所有学生和教职工的定期体检…

淘宝API接口推荐:淘宝商品详情数据API

淘宝天猫商品详情数据接口是一种API接口&#xff0c;它允许开发者通过编程的方式访问和操作淘宝或天猫上的商品信息。这些接口通常用于获取商品的详细信息&#xff0c;包括标题、价格、销量、评价、优惠信息、店铺信息等。 淘宝天猫API列表 item_get 获得商品详情item_search…

代码随想录阅读笔记-栈与队列【逆波兰表达式求值】

题目 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达式总会得出有…

如何使用Docker安装Paperless-ngx系统并实现远程在线搜索查阅文档

文章目录 1. 部署Paperless-ngx2. 本地访问Paperless-ngx3. Linux安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 Paperless-ngx是一个开源的文档管理系统&#xff0c;可以将物理文档转换成可搜索的在线档案&#xff0c;从而减少纸张的使用。它内置…

Hotspot虚拟机对象问题(对象头...对象创建)

目录 对象头 实例数据 对齐填充 对象是如何创建 对象头 在Hotspot虚拟机中&#xff0c;Java对象在内存中的布局大致可以分为三部分:对象头、实例数据和填充对齐。因为synchronized用的锁是存在对象头里的&#xff0c;这里我们需要重点了解对象头。如果对象头是数组类型则对…

嵌入式学习45——硬件相关

FrameBuffer&#xff1a; 可以译作"帧缓冲"&#xff0c;有时简称为 fbdrv。这是一种独立于硬件的抽象图形设…

你敢信?苹果iPhone 16将搭载百度AI文心一言

【行业焦点】苹果公司&#xff0c;这位全球消费电子舞台的常青树&#xff0c;近期传出一则震撼业界的消息&#xff1a;其将在新一代iPhone 16系列中国版产品中&#xff0c;深度融合百度的尖端生成式AI技术。这一重大决策不仅揭示了苹果对中国市场的深度耕耘与本地化创新战略&am…

PCB板在线自动激光打标机:高效、精准的电路板标识利器

PCB板在线自动激光打标机是一种高度自动化的设备&#xff0c;专为PCB&#xff08;印刷电路板&#xff09;板的在线镭雕需求而设计。这种设备结合了激光技术和自动化控制&#xff0c;使得在PCB板上进行高精度、高效率的镭雕成为可能。 ​ PCB板在线自动激光打标机主要由控制系统…

美团0309春招笔试题

下面是美团2024-03-09笔试真题&#xff0c;笔者进行了VP&#xff0c;由于未参与评测&#xff0c;故不保证正确性&#xff0c;仅供参考。 第一题 小美的MT 首先找到原来字符串中含有的M和T的数量&#xff0c;记作cnt。然后剩余n - cnt个字符是可以修改的&#xff0c;但这取决于…

第四百二十五回

文章目录 1. 概念介绍2. 实现方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用intl插件时遇到的问题"相关的内容&#xff0c;本章回中将介绍实现splash页面的另外一种方法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的…

JRT菜单

上一章搭建了登录界面的雏形和抽取了登录接口。给多组使用登录和菜单功能提供预留&#xff0c;做到不强行入侵别人业务。任何产品只需要按自己表实现登录接口后配置到容器即可共用登录界面和菜单部分。最后自己的用户关联到JRT角色表即可。 登录效果 这次构建菜单体系 首先用…

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中&#xff0c;常用各种集合来存储业务数据并处理&#xff0c;比如使用 List&#xff0c;Map&#xff0c;Set 等等集合来存储业务数…

MyBatis是纸老虎吗?(七)

在上篇文章中&#xff0c;我们对照手动编写jdbc的开发流程&#xff0c;对MyBatis进行了梳理。通过这次梳理我们发现了一些之前文章中从未见过的新知识&#xff0c;譬如BoundSql等。本节我想继续MyBatis这个主题&#xff0c;并探索一下MyBatis中的缓存机制。在正式开始梳理前&am…

Python自动化测试环境搭建

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 请事先自行安装好​​Pycharm​​​软件哦&#xff0c;我…

【Python系列】获取字符串的长度

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Clip Converter - 视频在线下载方法

Clip Converter - 视频在线下载方法 1. Video URL to Download2. Continue3. StartReferences YT to MP4 & MP3 Converter! https://www.clipconverter.cc/ Clip Converter is a free online media conversion application, which allows you to reocord, convert and do…

基于冠豪猪优化器(CPO)的无人机路径规划

该优化算法是2024年新发表的一篇SCI一区top论文具有良好的实际应用和改进意义。一键运行main函数代码自动保存高质量图片 1、冠豪猪优化器 摘要&#xff1a;受冠豪猪(crest Porcupine, CP)的各种防御行为启发&#xff0c;提出了一种新的基于自然启发的元启发式算法——冠豪猪…

#Linux系统编程(ps和kill命令)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;ps命令 可以列出系统中当前运行的那些进程。 命令格式&#xff1a;ps 参数(常用-aux) 命令功能&#xff1a;用来显示当前进程的状态 常…

应急响应实战笔记04Windows实战篇(2)

第2篇&#xff1a;蠕虫病毒 0x00 前言 ​ 蠕虫病毒是一种十分古老的计算机病毒&#xff0c;它是一种自包含的程序&#xff08;或是一套程序&#xff09;&#xff0c;通常通过网络途径传播&#xff0c;每入侵到一台新的计算机&#xff0c;它就在这台计算机上复制自己&#xff…

Star 5.3k!纯Python开发的高效SQL 解析器!

目前从事大数据相关的开发&#xff0c;都离不开SQL&#xff0c;不管是关系型数据库还是非关系型数据&#xff0c;在做不同数据库间迁移或者转换的时候都会用到SQL转换。今天来为大家分享一个有趣的开源项目&#xff0c;SQLGlot&#xff0c;一个纯Python开发的SQL转换器&#xf…