一文带你搞懂Java中Object类和抽象类

一文带你搞懂Java中Object类和抽象类

1. Object类

在Java中,所有的类都继承自Object类。Object类是Java的基类,提供了一些通用的方法,如equals()、hashCode()、toString()等。

equals()

equals()方法用来判断两个对象是否相等。Object类的equals()方法实现的是比较两个对象的引用是否相等。如果要比较内容是否相等,需要在子类中重写该方法。

例如,有如下代码:

public class Person{
    private String name;
    private int age;
    //...
}

Person person1 = new Person("Tom", 18);
Person person2 = new Person("Tom", 18);

System.out.println(person1 == person2); //false
System.out.println(person1.equals(person2)); //false

虽然person1和person2的属性值相同,但它们是两个不同的对象,因此equals()方法返回false。如果重写equals()方法,可以实现比较两个对象的内容是否相等。

hashCode()

hashCode()方法用来获取对象的哈希值,也就是一个用来标识对象的整数。如果两个对象的equals()方法返回true,在这两个对象中的其中一个对象上调用hashCode()方法必须返回相同的整数。而如果两个对象的equals()方法返回false,则hashCode()方法可以返回相同的整数,也可以返回不同的整数。

toString()

toString()方法返回表示对象的字符串。默认实现返回对象的类名、一个'@'符号和该对象的哈希码的无符号十六进制表示形式。

2. 抽象类

抽象类是用abstract关键字声明的类。抽象类不能被实例化,只能被子类继承,并且子类必须实现抽象类中定义的所有抽象方法。抽象方法是指没有实现的方法,只有方法的声明,子类必须实现抽象方法才能被实例化。

例如,有如下代码:

public abstract class Shape{
    public abstract double getArea();
    public abstract double getPerimeter();
}

public class Circle extends Shape{
    private double radius;

    public Circle(double radius){
        this.radius = radius;
    }

    public double getArea(){
        return Math.PI * radius * radius;
    }

    public double getPerimeter(){
        return 2 * Math.PI * radius;
    }
}

Shape抽象类定义了两个抽象方法,getArea()和getPerimeter(),这两个方法在子类中必须被实现才能被实例化。Circle类是Shape抽象类的一个子类,实现了Shape类中定义的两个抽象方法,并定义了自己的属性和方法。

示例说明

示例1:equals()方法

public class Student{
    private int id;
    private String name;

    public Student(int id, String name){
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object obj){
        if(this == obj){
            return true;
        }
        if(obj == null || getClass() != obj.getClass()){
            return false;
        }
        Student student = (Student) obj;
        return id == student.id && Objects.equals(name, student.name);
    }

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

Student student1 = new Student(1, "Tom");
Student student2 = new Student(1, "Tom");

System.out.println(student1 == student2); //false
System.out.println(student1.equals(student2)); //true

在Student类中重写equals()和hashCode()方法,使得比较两个Student对象的内容是否相等。

示例2:抽象类

public abstract class Animal{
    private String name;

    public Animal(String name){
        this.name = name;
    }

    public String getName(){
        return name;
    }

    public abstract void sound();
}

public class Cat extends Animal{
    public Cat(String name){
        super(name);
    }

    @Override
    public void sound(){
        System.out.println("喵喵喵");
    }
}

public class Dog extends Animal{
    public Dog(String name){
        super(name);
    }

    @Override
    public void sound(){
        System.out.println("汪汪汪");
    }
}

Animal cat = new Cat("小花");
Animal dog = new Dog("小黑");

System.out.println(cat.getName()); //小花
cat.sound(); //喵喵喵
System.out.println(dog.getName()); //小黑
dog.sound(); //汪汪汪

Animal抽象类定义了一个抽象方法sound(),在子类中必须被实现。Cat和Dog类分别是Animal类的子类,实现了sound()方法并定义了自己的属性和方法。在主程序中实例化Cat和Dog对象,调用它们的方法。由于Animal类是抽象类,无法被实例化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你搞懂Java中Object类和抽象类 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java+MySQL 图书管理系统

    那我将详细讲解一下“Java+MySQL 图书管理系统”的完整攻略。 1、前期准备 在开发过程中,需要确认以下前期准备: MySQL 数据库的安装并创建数据表 Eclipse 或者其他 Java IDE 的安装设置 在 MySQL 中创建以下表: book表 字段名 类型 描述 book_id int 书籍编号 book_name varchar(50) 书…

    Java 2023年5月19日
    00
  • Java编程接口调用的作用及代码分享

    下面我将详细讲解“Java编程接口调用的作用及代码分享”的完整攻略。 Java编程接口调用的作用 Java编程接口(API)是Java标准库中的一组类和接口,用于提供基本的程序操作功能。Java API包含了很多常用的类,比如String、Math和ArrayList等,可以帮助程序员快速进行开发。 Java编程接口调用的作用是在程序中调用Java API提…

    Java 2023年5月23日
    00
  • 我认为JSP有问题(下)

    第一步:理解攻略背景 在“我认为JSP有问题(上)”一文中,作者通过了解到一个项目使用了JSP技术,但是发现该项目在前端页面渲染时存在很多性能问题,例如页面加载速度慢、页面渲染效果差等问题。本文将进一步讲解在解决这些问题过程中,需要采取哪些具体措施。 第二步:寻找问题根源 要解决JSP技术带来的前端性能问题,首要任务就是找到问题的深层次原因。在该问题中,JS…

    Java 2023年6月15日
    00
  • springboot配置Jackson返回统一默认值的实现示例

    下面是“springboot配置Jackson返回统一默认值的实现示例”的完整攻略。 1. 什么是Jackson Jackson是Java中主流的JSON解析库之一,用于Java对象和JSON数据之间的序列化和反序列化。在Spring Boot框架中,常用Jackson来将Java对象转换成JSON格式的数据,以便于前端页面对数据进行展示和处理。 2. 什么…

    Java 2023年5月26日
    00
  • java虚拟机学习笔记进阶篇

    Java虚拟机学习笔记进阶篇攻略 本文旨在为读者提供Java虚拟机学习笔记进阶篇的学习攻略,包括必要的准备知识、学习方法、学习重点等内容。 准备知识 在学习Java虚拟机进阶篇之前,需要对Java虚拟机的基础知识有清晰的理解,包括但不限于: Java虚拟机的体系结构和工作原理; Java虚拟机的内存模型和内存管理机制; Java字节码的结构、格式和指令集; …

    Java 2023年5月23日
    00
  • 聊聊Redis的单线程模型

    下面我来详细讲解一下Redis的单线程模型。 Redis的单线程模型 Redis采用单线程模型,每个redis服务进程只有一个线程处理所有客户端的请求。该线程在一个西北曼岛一个时间点处理一个客户端请求,而不是并发处理请求。下面是Redis采用单线程模型的原因: 对于CPU密集型任务,单线程的处理方式可以避免线程间切换所带来的额外开销,提高CPU的利用率; 对…

    Java 2023年5月26日
    00
  • Java编程中的性能优化如何实现

    下面是Java编程中的性能优化攻略,共分为四个步骤: 1. 定位瓶颈 性能优化的第一步是定位瓶颈,只有知道哪里出了问题才能有针对性地进行优化。我们可以使用一些工具来定位瓶颈,比如: JProfiler:一款功能强大的Java性能分析工具,在视图中可以观察到CPU使用率、内存占用、线程状态、对象创建等性能特征,帮助我们快速定位瓶颈。 Java Mission …

    Java 2023年5月24日
    00
  • Spring Framework远程代码执行漏洞分析(最新漏洞)

    Spring Framework远程代码执行漏洞分析(最新漏洞) 漏洞简介 Spring Framework是一个由Pivotal团队(前身是SpringSource)开发的开源框架,应用广泛,而且易于使用。但是,最新版本的Spring Framework(版本5.2.0到5.3.0)中存在一种远程代码执行漏洞。攻击者可以通过构造恶意的输入来执行任意代码,导…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部