一文带你搞懂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中的ClassNotFoundException是什么?

    ClassNotFoundException是Java中的一种异常类型,表示虚拟机在试图加载类时无法找到指定的类。 当Java虚拟机无法找到某个类时,会抛出ClassNotFoundException异常。通常情况下,这种情况发生在以下几种情形中: 使用Class.forName()方法加载类时,指定的类不存在; 使用ClassLoader.loadClas…

    Java 2023年4月27日
    00
  • SpringMVC 方法四种类型返回值总结(你用过几种)

    SpringMVC 方法四种类型返回值总结 SpringMVC 的控制器方法可以有四种类型的返回值,这四种类型分别是: ModelAndView Model View String 下面将对这四种类型的返回值进行详细的讲解,并给出示例说明。 1. ModelAndView ModelAndView 是 Spring 框架中常用的一种返回类型。它既包含了 Mo…

    Java 2023年5月16日
    00
  • Spring定时任务轮询本地数据库实现过程解析

    让我来详细讲解一下Spring定时任务轮询本地数据库实现过程解析,需要掌握以下几个步骤: 1. 编写定时任务 首先,我们需要编写一个调度器来轮询本地数据库,可以使用Spring自带的TaskScheduler接口来实现,示例代码如下: @Component public class LocalDatabasePoller { @Autowired priva…

    Java 2023年5月20日
    00
  • 教你如何写springboot接口

    教你如何写Spring Boot接口攻略 1. 确定项目需求和数据库设计 在编写Spring Boot接口前,需要先明确项目需求和数据库设计,包括接口需要实现哪些功能,数据表的关系等。这样才能确保编写出的接口满足项目需求。同时,我们还需要确定使用的数据库类型和数据库连接方式。 2. 创建Spring Boot项目 接下来我们需要使用Spring Initia…

    Java 2023年5月19日
    00
  • Java8生成时间方式及格式化时间的方法实例

    Java8生成时间方式及格式化时间的方法实例 本文将介绍Java8生成时间的几种方式,以及如何利用DateTimeFormatter对时间进行格式化。 生成时间的方式 Java8提供了3种生成时间的方式:1. 使用now()静态方法生成当前时间2. 使用of()静态方法生成指定时间3. 使用parse()静态方法解析字符串生成时间 生成当前时间 可以使用ja…

    Java 2023年5月20日
    00
  • 解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    这个问题一般是由于我们使用了java版本比当前springboot版本所支持的版本还要高的原因导致的。下面详细讲解一下解决步骤。 确认java版本和springboot版本 首先需要确认当前java版本和springboot版本是否匹配。可以在命令行中输入以下命令查看java版本: java -version 可以在pom.xml文件中查看springboo…

    Java 2023年6月2日
    00
  • Springboot工具类ReflectionUtils使用教程

    下面我将详细讲解“Springboot工具类ReflectionUtils使用教程”。 Springboot工具类ReflectionUtils使用教程 简介 在Java开发中,我们有时需要使用反射来获取或修改某些对象的属性或方法,而这个过程其实是比较繁琐的。Spring框架提供了一个工具类ReflectionUtils,能够方便地使用反射来快速获取或修改对…

    Java 2023年5月19日
    00
  • springboot 整合canal实现示例解析

    下面是关于“springboot 整合canal实现示例解析”的完整攻略: 1. 什么是Canal? Canal是阿里巴巴开源组织推出的一款数据库增量订阅和消费组件,能够解析MySQL数据库binlog的增量数据,并将数据以类似于MQ的方式进行消费或者解析。Canal能实时获取MySQL数据库的数据变更,解决传统的数据库数据同步方式需要轮询而且存在延迟性的问…

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