广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文带你搞懂Java中Object类和抽象类
  • 227
分享到

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

2024-04-02 19:04:59 227人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、抽象类是什么二、初始抽象类2.1 基本语法2.2 继承抽象类三、抽象类总结四、Object类4.1 初始Object4.2 toString4.3 equals4.4 has

一、抽象类是什么

面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。

父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。

二、初始抽象类

2.1 基本语法

在 Java 语言中使用 abstract class 来定义抽象类。如下实例:

abstract class Employee {
    
    //普通的成员属性
    private String name;
    private String address;

    //构造方法
    public Employee(String name, String address) {
        this.name = name;
        this.address = address;
    }

    //普通的成员方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

注意到该 Employee 类没有什么不同,尽管该类是抽象类,但是它仍然有 成员变量,成员方法和 构造方法

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

public static void main(String[] args) {
        Employee employee = new Employee("zhangsan","shanxi");
    }

代码可以编译通过吗?

我们可以发现抽象类是无法实例化对象的.

2.2 继承抽象类

1.抽象方法的权限

abstract class Shape {
    abstract private void func();
}

抽象类要被继承,需要子类实现抽象方法,所以抽象方法的权限不能是private.

注意:抽象方法没有加访问限定符时,默认是public.

abstract class Shape {
    abstract final void func();
}

** 抽象方法不能被final和static修饰,因为抽象方法要被子类重写**

先写一个Shape抽象类

abstract class Shape {
    //被abstract修饰的抽象方法,没有方法体
    abstract public void draw();
    abstract void calcArea();
}

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

class Circle extends Shape {
    private double r;
    final private static double PI = 3.14;

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

    @Override
    public void draw() {
        System.out.println("画圆!");
    }

    @Override
    void calcArea() {
        System.out.println("面积为: "+PI*r*r);
    }
}
public static void main(String[] args) {
        Circle circle = new Circle(2);
        circle.draw();
        circle.calcArea();
    }

实现父类的抽象方法后,即可正常实例化

class Rect extends Shape {
    @Override
    public void draw() {
        
    }
}

子类继承抽象类时,要么把抽象方法全部实现,不然将子类继续抽象化.

三、抽象类总结

1.抽象类中必须使用abstract修饰类

2.抽象类中可以包含普通类所能包含的成员

3.抽象类和普通类不一样的是:抽象类可以包含抽象方法.

4.抽象方法使用abstract修饰的,这个方法没有具体的实现

5.不能实例化抽象类

6.抽象类最大的意义就是被继承

7.如果一个普通类继承了一个抽象类,那么必须重写抽象类当中的方法,否则写为抽象类

8.抽象方法不能是私有的,static?也就是要满足重写的规则

9.final?不可以它和abstract是矛盾的

10.抽象类当中可以有构造方法,为了方便子类调用,来初始化类中的成员变量.

11.抽象类的出现,是为了让程序员更早的发现错误,防止出错,让编译器及时提醒我们.

四、Object类

4.1 初始Object

Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。

class Person {
    
}
class Person extends Object {
    
}

这两种是一模一样的.

4.2 toString

Object中的toString方法

public static void main(String[] args) {
        Circle circle = new Circle(2);
        System.out.println(circle);
    }

我们要打印circle对象具体内容的话,需要重写toString方法.

public String toString() {
        return "Circle{" +
                "r=" + r +
                '}';
    }

4.3 equals

在Java中,进行比较时:

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

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

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

public static void main(String[] args) {
        Circle circle = new Circle(2);
        Circle circle1 = new Circle(2);
        int a = 1;
        int b = 1;
        System.out.println(a == b);
        System.out.println(circle == circle1);
        System.out.println(circle.equals(circle1));
    }

每次new一个对象都会在堆开辟一个新的空间.

Object定义的equals方法,在两个对象调用时对比的是两个对象地址是否相等,而不是具体对象中的内容这时候我们需要重写equals方法.

 @Override
    public boolean equals(Object obj) {
        if(obj == null) {
            return false;
        }
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Circle)) {
            return false;
        }
        Circle circle = (Circle)obj;
        return this.r == circle.r;
    }

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

4.4 hashcode

我们可以发现toString方法中有使用到这个方法,我们目前只需要知道它是一个内存地址,然后调用Integer.toHexString()方法,将这个地址以16进制输出。

public static void main(String[] args) {
        Circle circle1 = new Circle(2);
        Circle circle2 = new Circle(2);
        System.out.println(circle1.hashCode());
        System.out.println(circle2.hashCode());
    }

我们认为两个存储相同值的Circle对象,在调用Object的hashcode方法时,输出的值不一样.

//重写hashCode方法
@Override
    public int hashCode() {
        return Objects.hash(r);
    }

当我们重写hashCode后,当两个对象存储的内容一样时,输出的哈希值是一样的.

结论:

1、hashcode方法用来确定对象在内存中存储的位置是否相同

2、事实上hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。

到此这篇关于一文带你搞懂Java中Object类和抽象类的文章就介绍到这了,更多相关Java Object类 抽象类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 一文带你搞懂Java中Object类和抽象类

本文链接: https://www.lsjlt.com/news/166367.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文带你搞懂Java中Object类和抽象类
    目录一、抽象类是什么二、初始抽象类2.1 基本语法2.2 继承抽象类三、抽象类总结四、Object类4.1 初始Object4.2 toString4.3 equals4.4 has...
    99+
    2022-11-13
  • 一文搞懂PHP中的抽象类和接口
    目录一.抽象类1.定义2.应用场景3.入门代码4.细节5. 代码分解二.接口1.定义2. 应用场景3.入门代码4.注意细节三.类和接口之间关系一.抽象类 1.定义...
    99+
    2022-11-13
  • 一文详解Object类和抽象类
    目录一、抽象类是什么?二、初始抽象类2.1 基本语法2.2 继承抽象类三、抽象类总结四、Object类4.1 初始Object4.2 toString4.3 equals4.4 ha...
    99+
    2022-11-13
  • 一文搞懂Java顶层类之Object类的使用
    目录概述toString方法方法摘要覆盖重写equals方法方法摘要默认地址比较对象内容比较Objects类概述 java.lang.Object类是Java语言中的根类,即所有类的...
    99+
    2022-11-16
    Java Object类使用 Java Object类
  • 一文搞懂Java中的抽象类和接口到底是什么
    目录什么是抽象类抽象类在实现多态中的意义接口是什么通过接口实现多态今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 什么是抽象类 我们之前学过什么是类,那么抽象...
    99+
    2022-11-13
  • 一文带你读懂Java中的Character类
    这期内容当中小编将会给大家带来有关一文带你读懂Java中的Character类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。使用字符时,我们通常使用的是内置数据类型char。实例char ch = ...
    99+
    2023-05-31
    java character类 ava
  • 一文带你搞懂Java中的递归
    目录概述递归累加求和计算1 ~ n的和代码执行图解递归求阶乘递归打印多级目录综合案例文件搜索文件过滤器优化Lambda优化概述 递归:指在当前方法内调用自己的这种现象。 递归的分类:...
    99+
    2022-11-13
    Java 递归
  • PHP一文带你搞懂游戏中的抽奖算法
    目录前言一、初始化奖品二、谢谢参与三、过滤抽奖、如充值条件四、重组概率五、进行抽奖六、过滤回调七、最终抽奖结果八、抽奖封装成类前言 没有特别幸运,那么请先特别努力,别因为懒惰而失败,...
    99+
    2022-11-13
  • 一篇文章带你搞懂Python类的相关知识
    目录一、什么是类二、类的方法三、类的特性四、总结一、什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧。 这样就算创...
    99+
    2022-11-12
  • 一文搞懂Java中的日期类
    目录一、日期类1.1 第一代日期类1.2 第二代日期类Calendar1.3 第三代日期类一、日期类 在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的...
    99+
    2022-11-13
  • 一文带你搞懂Java中的泛型和通配符
    目录概述泛型介绍和使用泛型类泛型方法类型变量的限定通配符使用无边界通配符通配符上界通配符下界概述 泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, ...
    99+
    2022-11-13
  • 一文带你认识Java中的Object类和深浅拷贝
    目录前言一.初识Object类1.Object类接收所有子类实例2.Object类部分方法介绍①.Object内的toString方法②.Object内的equals和hashCod...
    99+
    2023-05-17
    java深浅拷贝 java中object类型 java 深拷贝和浅拷贝
  • 一篇文章带你搞懂JavaScript的变量与数据类型
    目录前言:温馨提示:变量1.声明2.赋值3.二个语法小细节变量的命名规范为什么需要数据类型?简单数据类型(基本数据类型)数字型字符串型 String什么是数据类型的转换1.转换为字符...
    99+
    2022-11-12
  • 一文带你了解Java万物之基之Object类
    目录native方法getClass方法hashCode方法equals方法==和equals的区别clone方法浅拷贝和深拷贝toString方法线程方法finalize方法Jav...
    99+
    2022-11-13
  • 一文带你搞懂Java中Synchronized和Lock的原理与使用
    目录1、Synchronized与Lock对比2、Synchronized与Lock原理2.1 Synchronized原理2.2 Lock原理3、Synchronized与Lock...
    99+
    2023-05-16
    Java Synchronized Lock原理 Java Synchronized Lock使用 Java Synchronized Java Lock Java Synchronized Lock
  • 一文带你搞懂Java中线程的创建方式
    目录一. 继承Thread二. 创建Runnable对象三. 创建Callable对象四. 基于Runnable创建FutureTask总结一. 继承Thread 可以通过创建Thr...
    99+
    2023-03-06
    Java线程创建方式 Java线程创建 Java线程
  • 一文带你读懂java中的对象拷贝
    本篇文章为大家展示了一文带你读懂java中的对象拷贝,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。java对象拷贝详解及实例Java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是...
    99+
    2023-05-31
    java 对象拷贝 ava
  • 一文带你搞懂Numpy中的深拷贝和浅拷贝
    目录1. 引言2. 浅拷贝2.1 问题引入2.2 问题剖析3. 深拷贝3.1 举个栗子3.2 探究原因4. 技巧总结4.1 判断是否指向同一内存4.2 其他数据类型5. 总结1. 引...
    99+
    2022-11-10
  • 一文带你初识java中的String类
    目录什么是字符串字符串常见的赋值方法直接赋值法构造方法进行创建字符串的比较相等字符串常量池字符串常量池的实例字符串的不可变字符串的常见操作字符串的比较字符串的查找字符串替换字符串拆分...
    99+
    2022-11-12
  • 一文带你认识java中的String类
    目录什么是字符串字符串常见的赋值方法直接赋值法字符串的比较相等字符串常量池字符串常量池的实例字符串的不可变字符串的常见操作字符串的比较字符串的查找字符串替换 split(S...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作