11.2 Object类的概述(重点) | 拉勾Java就业急训营

11.2 Object类的概述(重点)

11.2.1 基本概念

  • java.lang.Object类是Java语言中类层次结构的根类,也就是说任何一个类都是该类的直接或者间接子类。
  • 如果定义一个Java类时没有使用extends关键字声明其父类,则其父类java.lang.Object类。
  • Object类定义了“对象”的基本行为, 被子类默认继承。

11.2.2 常用的方法

方法声明功能介绍
Object() 使用无参方式构造对象
boolean equals(Object obj)用于判断调用对象是否与参数对象相等。该方法默认比较两个对象的地址是否相等,与==运算符的结果一致若希望比较两个对象的内容,则需要重写该方法。若该方法被重写后,则应该重写hashCode方法来保证结果的一致性。
int hashCode()用于获取调用对象的哈希码值(内存地址的编号)。若两个对象调用equals方法相等,则各自调用该方法的结果必须相同。若两个调用对象equals方法不相等,则各自调用该方法的结果应该不相同。为了使得该方法与equals方法保持一致,需要重写该方法。
String toString()用于获取调用对象的字符串形式该方法默认返回的字符串为:包名.类名@哈希码值的十六进制。为了返回更有意义的数据,需要重写该方法使用printprintln打印引用或字符串拼接引用都会自动调用该方法
Class<?> getClass()用于返回调用对象执行时的Class实例,反射机制使用

案例题目:

编程实现Student类的封装,特征:学号(id)和姓名,要求提供打印所有特征的方法。
编程实现StudentTest类,在main方法中使用有参方式构造两个Student类型的对象并打印特征。

题目扩展:
如何实现以姓名作为基准判断两个对象是否相等?以及以学号和姓名同时作为基准判断两个对象是否相等?

package com.lagou.task11;

import java.util.Objects;

public class Student {
    private int id;         // 用于描述学号的成员变量
    private String name;    // 用于描述姓名的成员变量

    public Student() {
    }

    public Student(int id, String name) {
        setId(id);
        setName(name);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        if(id > 0) {
            this.id = id;
        } else {
            System.out.println("学号不合理哦!!!");
        }
    }

    public String getName() {
        return name;
    }

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

    /**
     * 为了比较两个对象的内容,也就是学号信息需要重写该方法
     */
    // Student this = s1;
    // Object obj = s2;
/*    @Override
    public boolean equals(Object obj) {
        // 当调用对象和参数对象指向同一个对象时,则内容一定相同
        if(this == obj) {
            return true;
        }
        // 当调用对象不为空而参数对象为空时,则内容一定不相同
        if(null == obj) {
            return false;
        }
        // 判断obj指向的对象是否为Student类型的对象,若是则条件成立,否则条件不成立
        if(obj instanceof Student) {
            Student ts = (Student)obj;
            // 以学号作为基准判断两个对象是否相等 int是基本数据类型,内存空间中放的就是数据本身,使用==可以判断数据是否相同
            //return this.getId() == ts.getId();
            // 以姓名作为基准判断两个对象是否相等,String是引用数据类型,内存空间中放的是地址,使用==可以判断地址是否相同
            // 也就是判断两个对象中姓名字符串的地址是否相同,不够完美
            return this.getName().equals(ts.getName()); // 比较姓名字符串的内容是否相同

        }
        // 否则类型不一致,没有可比性,则内容一定不相同
        return false;
    }*/

    /**
     * 为了使得该方法的结果与equals方法的结果保持一致,从而满足Java官方的常规协定,需要重写该方法
     */

/*    @Override
    public int hashCode() {
        //return getId();     // 不再代表内存地址的编号了
        final int type = 12;
        //return type * 31 + getId();
        return type * 31 + getName().hashCode();
    }*/

    /**
     * 为了返回更有意义的字符串数据,则需要重写该方法
     */
/*    @Override
    public String toString() {
        return "Student[id = " + getId() + ", name = " + getName() + "]";
    }*/

/*  默认模板创建的equals和hashCode方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Student student = (Student) o;

        if (id != student.id) return false;
        return name != null ? name.equals(student.name) : student.name == null;
    }

    @Override
    public int hashCode() {
        int result = id;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }*/

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

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

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

package com.lagou.task11;

public class StudentTest {

    public static void main(String[] args) {

        // 1.使用有参方式构造Student类型的两个对象并判断是否相等
        Student s1 = new Student(1001, "zhangfei");
        //Student s2 = new Student(1002, "guanyu");
        Student s2 = new Student(1001, "zhangfei");
        //Student s2 = s1;    // 表示s2和s1都指向了同一个对象,地址相同了

        // 下面调用从Object类中继承下来的equals方法,该方法默认比较两个对象的地址
        // 当Student类中重写equals()方法后,则调用重写以后的版本
        //Student s3 = null;
        //boolean b1 = s1.equals(s3);
        //Student s4 = s1;
        boolean b1 = s1.equals(s2);

        System.out.println("b1 = " + b1);   // false
        System.out.println("s1 == s2 结果为:" + (s1 == s2));   // 比较地址 false

        System.out.println("------------------------------------");
        // 下面调用从Object类中继承下来的hashCode方法,获取调用对象的哈希码值(内存地址的编号)
        // 当Student类中重写hashCode方法后,则调用重写以后的版本
        int ia = s1.hashCode();
        int ib = s2.hashCode();
        System.out.println("ia = " + ia);
        System.out.println("ib = " + ib);

        System.out.println("------------------------------------");
        // 下面调用从Object类中继承下来的toString方法,获取调用对象的字符串形式:包名.类名@哈希码值的十六进制
        // 当Student类中重写toString的方法后,则调用重写以后的版本
        String str1 = s1.toString();
        System.out.println("str1 = " + str1);   //com.lagou.task11.Student@55d
        System.out.println(s1);     // 当打印一个引用变量时会自动调用toString方法
        String str2 = "hello, " + s1;
        System.out.println("str2 = " + str2);

    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 11.2题要求我们实现一个简单的Java,该可以将一个字符串中的所有单词首字母大写,并返回处理后的字符串。 我们可以先定义一个名为StringUtils的,其中包含一个名为capitalize的静态方法,该方法接受一个字符串参数,返回处理后的字符串。 在capitalize方法中,我们可以使用Java的正则表达式来匹配字符串中的单词,并将每个单词的首字母转换为大写。具体实现可以参考以下代码: ``` import java.util.regex.Matcher; import java.util.regex.Pattern; public class StringUtils { public static String capitalize(String str) { Pattern pattern = Pattern.compile("\\b\\w"); Matcher matcher = pattern.matcher(str); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, matcher.group().toUpperCase()); } matcher.appendTail(sb); return sb.toString(); } } ``` 在上述代码中,我们首先使用Pattern.compile方法创建一个正则表达式模式,该模式可以匹配字符串中的单词首字母。然后使用Matcher的find方法来查找字符串中的匹配项,并使用appendReplacement方法将每个匹配项替换为大写字母。最后使用appendTail方法将剩余的字符串添加到结果中,并返回处理后的字符串。 使用该的示例代码如下: ``` public class Main { public static void main(String[] args) { String str = "hello world"; String result = StringUtils.capitalize(str); System.out.println(result); // 输出 "Hello World" } } ``` 在上述示例代码中,我们首先定义一个字符串变量str,然后调用StringUtils的capitalize方法将字符串中的单词首字母大写,并将结果保存到result变量中。最后输出result变量的值,即可看到处理后的字符串。 ### 回答2: 本题主要是要求对Java的网络编程结构和Java提供的网络编程接口进行概述和总结,并且深入探讨Java Socket的使用。 Java的网络编程结构包含两个主要部分:网络协议和Java网络编程API。Java提供了丰富的库和接口,用于实现各种网络协议及传输层协议(TCP/IP),包括Socket、ServerSocket、DatagramSocket等。它们都继承自java.net包中的抽象,实现了一系列的方法和属性,实现了数据传输的功能。 Java提供了Socket来实现客户端和服务器之间的数据传输。Socket是一个封装了传输层的TCP/IP协议的,它提供了Socket的各种操作方法和Socket的各种配置选项。Socket的构造函数有两种方式:一种是提供ip地址和端口号,另一种是提供已经获取该服务器地址的InetAddress对象和端口号。在Socket中,可以通过getInputStream()和getOutputStream()方法获取数据传输的输入和输出流。 Socket不仅可以用于客户端的请求,还可以用于服务端的监听和响应。因此,Java提供了ServerSocket来实现服务端的Socket创建。ServerSocket监听指定端口号上的客户端请求,并且收到请求后会调用accept()方法,创建一个新的Socket连接来处理请求。ServerSocket的accept()方法在没有请求时会一直阻塞等待。这样就可以实现无限循环监听客户端请求。 当Java Socket传输数据时,通常要使用一些协议,比如HTTP协议、SMTP协议和FTP协议等。Java提供了很多和接口来处理这些协议,比如java.net.URLjava.net.URLUpdatejava.net.URLConnection等。这些和接口都可以方便地完成网络通信所需要的各种操作。 总之,Java网络编程是非常重要的,可以实现各种通信方式,并且提供了许多工具和接口可供使用。SocketJava网络编程中最重要的之一,它可以实现客户端和服务器之间的数据传输,而ServerSocket可以实现服务端的Socket创建和连接处理。无论是何种情况,Java网络编程都是非常重要的一部分。 ### 回答3: 本题主要是关于Java线程的控制和同步问题。在11.2题中,我们需要编写一个程序来模拟生产者/消费者模型。其中生产者生产苹果,消费者消费苹果,一共有10个苹果,生产者只有在框案上还有空位可以放苹果的时候才能生产,消费者只有在框案上还有苹果的时候才能消费。 首先,需要定义一个线程安全的框子,其中包含框案的状态(装有多少苹果)和状态的读写接口(取苹果,放苹果)方法。这里可以使用synchronized关键字来解决同步问题,确保每个方法在运行时只能被单个线程访问。 接着,需要定义一个生产者线程和一个消费者线程,分别使用while循环进行苹果的生产和消费,直到达到预定数量为止。在每次生产和消费之后,需要使用wait()方法来将线程挂起,直到框子上有苹果或空位,防止线程死循环或浪费资源。 最后,在main函数中创建框子对象和生产者、消费者线程对象,并启动生产者线程和消费着线程,等待线程结束即可。 总之,Java线程的控制和同步需要仔细考虑,尤其是在多线程环境中,要避免竞态条件和资源冲突等问题,保证线程安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值