一文带你搞懂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封装数组实现在数组中查询元素和修改元素操作示例

    下面是详细讲解“Java封装数组实现在数组中查询元素和修改元素操作示例”的完整攻略。 1. 简介 在Java中,数组是一种基本的数据结构。数组中存储的元素都是具有相同数据类型的,可以通过下标来访问数组中的每个元素。但是,使用数组还存在一些不足,例如数组的长度是固定的,无法动态扩展;数组元素的类型一旦确定就无法更改等。因此,我们可以通过封装数组的方式来实现数组…

    Java 2023年5月26日
    00
  • Java HttpURLConnection超时和IO异常处理

    Java中的HttpURLConnection是HTTP协议的实现,是进行HTTP通信的基础。在使用HttpURLConnection进行网络请求时,会遇到超时和IO异常等问题,需要进行相应的处理。本文将详细讲解如何处理HttpURLConnection超时和IO异常。 HttpURLConnection超时处理 超时类型 HttpURLConnection…

    Java 2023年5月27日
    00
  • 情人节写给女朋友Java Swing代码程序

    下面是详细的“情人节写给女朋友Java Swing代码程序”的攻略: 1. 确定编写目的 首先需要明确编写这个代码的目的是什么,是为了送给女朋友一份特殊的礼物,还是仅仅练习一些Java Swing编程技巧。这个目的确定好以后,就可以开始进入下一步。 2. 设计程序界面 Java Swing是一种操作系统无关的图形界面工具包,可以方便地实现各种界面。在这一步中…

    Java 2023年5月23日
    00
  • java 获取HttpRequest Header的几种方法(必看篇)

    Java 获取HttpRequest Header的几种方法(必看篇) 简介 HttpRequest Header中包含了HTTP请求相关的重要信息,如User-Agent、Content-Type、Accept-Encoding等等。在Java Web开发中,我们可能需要获取Header中的某些信息进行处理,接下来我们就来介绍几种Java获取HttpReq…

    Java 2023年6月15日
    00
  • Java面向对象之多态

    Java面向对象之多态 Java是一门面向对象的编程语言,其中最重要的特性之一就是多态。多态是指同一个方法或者同一个类,在不同的时间、不同的对象上具有不同的表现形式。下面我们来仔细分析Java中的多态。 引言 Java的多态性分为静态多态和动态多态。 静态多态性是指在编译期就可以确定方法的调用对象,也就是说,在程序编译时已经确定了将要调用的方法。在Java中…

    Java 2023年5月26日
    00
  • Java String类的性质与比较

    针对“Java String类的性质与比较”,我准备了以下攻略: Java String类的性质 不可变性 Java中的String类是不可变的。这意味着,一旦创建了一个字符串对象,就不能更改它的内容。如果您需要修改一个字符串,必须创建一个新的对象,然后将原始对象的引用更改为指向新的字符串对象。 字符串池 Java中的字符串池是一种特殊的内存区域,它存储了所…

    Java 2023年5月27日
    00
  • Java中String.format的使用方法总结

    Java中String.format的使用方法总结 作为Java程序员来说,我们用到String.format的场景很多,今天我们就来总结一下它的使用方法。 1. 格式化字符串 String.format方法可以用来格式化字符串。以下是一个简单的例子: String message = String.format("Hello, %s! Today…

    Java 2023年5月26日
    00
  • 图解Java经典算法冒泡排序的原理与实现

    下面详细讲解一下“图解Java经典算法冒泡排序的原理与实现”的完整攻略。 冒泡排序的原理 冒泡排序是一种基础的排序算法,它是通过比较相邻元素的大小来进行排序的。具体来说,它的原理是: 比较相邻的两个元素,如果前面的元素大于后面的元素,就交换它们的位置。 对每一对相邻元素做相同的操作,从开始的第一对直到结尾的最后一对。这样一轮下来,就能把最大元素排到最后。 对…

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