Java中的对象和对象引用实例浅析

让我们来详细讲解一下Java中的对象和对象引用实例浅析。

掌握对象和对象引用的基础概念

在Java中,对象是我们需要操作的数据实体。对象本身是占用内存空间的,所以我们需要引用来间接操作对象。对象引用指的是一个指针变量,它指向一个对象在内存中的位置。Java中的对象都是存储在堆内存中,而引用则可以存储在栈内存中。

对象的创建过程

对象的创建过程分为两个步骤:声明和实例化。

  1. 声明对象

在Java中,声明对象通常是通过类创建对象。例如:

public class Person {
    //...
}

Person person;

上述代码中,我们声明了一个Person类型的变量person,但是它还没有指向任何对象。

  1. 实例化对象

实例化对象是指分配内存空间来存储对象。在Java中,使用关键字new来实例化一个对象。例如:

public class Person {
    //...
}

Person person;
person = new Person();

上述代码中,我们实例化了一个Person对象,通过变量person来引用这个新建的对象。

对象引用的基本操作

对象引用的基本操作包括:对象的复制、对象引用的比较、对象的销毁。

  1. 对象的复制

对象的复制是指创建一个新的对象,该对象与原对象具有相同的属性和值。Java中的对象复制有两种方式:浅拷贝和深拷贝。

  • 浅拷贝

浅拷贝是指创建一个新的对象,并将原对象的属性值全部复制到新对象中。但是,对于引用类型的属性,拷贝的是对象引用地址,新对象与原对象共用同一份数据。示例代码如下:

public class Person {
    private String name;
    private int age;
    private Address address;
}

public class Address {
    private String province;
    private String city;
    private String street;
}

Person p1 = new Person();
Address addr = new Address();
addr.setProvince("北京");
addr.setCity("北京市");
addr.setStreet("海淀区中关村街道");
p1.setName("小明");
p1.setAge(18);
p1.setAddress(addr);

Person p2 = p1; // 对象引用赋值,p1和p2指向同一个对象
p1.setName("小红"); // 修改p1的name属性
System.out.println(p2.getName()); // 输出"小红",p1和p2指向同一个对象
  • 深拷贝

深拷贝是指创建一个新的对象,并将原对象的属性值全部复制到新对象中,包括引用类型的属性。深拷贝是完全独立的对象,与原对象没有任何关联。示例代码如下:

public class Person implements Cloneable {
    private String name;
    private int age;
    private Address address;

    public Person clone() throws CloneNotSupportedException {
        Person newPerson = (Person) super.clone();
        newPerson.address = address.clone();
        return newPerson;
    }
}

public class Address implements Cloneable {
    private String province;
    private String city;
    private String street;

    public Address clone() throws CloneNotSupportedException {
        return (Address) super.clone();
    }
}

// 测试代码
Person p1 = new Person();
Address addr = new Address();
addr.setProvince("北京");
addr.setCity("北京市");
addr.setStreet("海淀区中关村街道");
p1.setName("小明");
p1.setAge(18);
p1.setAddress(addr);

Person p2 = p1.clone(); // 深拷贝,p1和p2是完全独立的对象
p1.setName("小红"); // 修改p1的name属性
System.out.println(p2.getName()); // 输出"小明",p1和p2是完全独立的对象
  1. 对象引用的比较

对象引用的比较可以用==操作符或equals()方法来实现。

  • ==操作符

==操作符比较的是两个对象的地址是否相同,即判断两个引用是否指向同一个对象。示例代码如下:

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1 == s2); // 输出"true",s1和s2指向同一个对象
System.out.println(s1 == s3); // 输出"false",s1和s3指向不同的对象
  • equals()方法

equals()方法比较的是两个对象的内容是否相同,即判断两个对象的属性值是否相同。例如:

String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1.equals(s2)); // 输出"true",s1和s2的属性值相同
System.out.println(s1.equals(s3)); // 输出"true",s1和s3的属性值相同
  1. 对象的销毁

在Java中,对象的销毁是由垃圾收集器来完成的。当程序无法访问一个对象时,该对象就成为了垃圾数据,垃圾收集器会自动回收这些垃圾数据所占的空间。

示例代码:

Person p1 = new Person();
p1 = null; // 将p1指向的对象设为null

上述代码中,将p1赋值为null,p1指向的Person对象就无法再被访问,成为垃圾数据。当垃圾收集器运行时,它会回收这个Person对象所占用的空间。

总结

以上就是对Java中的对象和对象引用实例的浅析。我们了解到对象和对象引用的概念、对象的创建过程、对象引用的基本操作等方面的知识点。在实际应用中,需要根据具体的场景实现对象引用的复制、比较和销毁等操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的对象和对象引用实例浅析 - Python技术站

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

相关文章

  • 基于java实现简单的银行管理系统

    我们来详细讲解“基于Java实现简单的银行管理系统”的完整攻略。 1. 确定需求和设计整体架构 在开发任何一种软件系统之前,我们都需要先明确需求,明确需要实现哪些功能和用户需求。在之后的设计过程中,我们需要设计整体的架构。 在本项目中,我们可以按如下的步骤进行: 分析整个系统,确定需要的基本功能和用户需求(例如:存、取、转账、查询余额等)。 设计整体的系统架…

    Java 2023年5月18日
    00
  • mybatisPlus自定义批量新增的实现代码

    下面我将详细讲解如何实现mybatisPlus自定义批量新增的实现代码,包括两条示例: 自定义批量新增实现代码 mybatisPlus并不支持批量新增操作,所以需要我们手动实现,下面是具体的代码实现: public interface CustomBatchInsertMapper<T> extends BaseMapper<T> {…

    Java 2023年5月20日
    00
  • jsp 从web.xml读取连接数据库的参数

    让我来详细讲解一下“jsp 从web.xml读取连接数据库的参数”的完整攻略。 什么是web.xml web.xml是一个配置文件,通常位于WEB-INF目录下,它是Java Web应用程序中最常见的配置文件之一,它用于配置Web应用的许多方面,包括 Servlet、JSP、Filter、Listener、数据库连接、安全性等等。 读取web.xml中的数据…

    Java 2023年6月15日
    00
  • Spring boot项目部署到云服务器小白教程详解

    准备工作 在进行 Spring Boot 项目部署之前,首先需要做好以下准备工作: 一台云服务器(常用的有阿里云、腾讯云、华为云等)。 安装 JDK 环境,一般推荐使用 OpenJDK 或 Oracle JDK。 安装 Maven,用于构建打包项目。 安装 Nginx,用作反向代理服务器。 上传项目代码 可以通过 FTP 或控制台上传本地的 Spring B…

    Java 2023年5月19日
    00
  • 看动画学算法之Java实现doublyLinkedList

    看动画学算法是一种十分有趣的学习方式,Java实现doublyLinkedList正好可以通过该方法进行学习。下面是实现doublyLinkedList的完整攻略。 准备工作 在进行doublyLinkedList的实现之前,需要进行如下准备工作: 确认Java编译器、JUnit测试框架和Maven构建工具是否已经安装好。 创建一个新的Java项目并在其中添…

    Java 2023年5月19日
    00
  • 聊聊maven与jdk版本对应关系

    聊聊maven与jdk版本对应关系 Maven是Java项目在构建编译过程中的重要工具,Java开发者需要根据项目需求选择合适的版本。同时,Maven的版本也需要与Java版本对应,否则可能会导致编译、构建、打包等问题。因此,本文将介绍Maven与JDK版本对应关系的攻略,以帮助Java开发者正确选择版本。 Maven与JDK版本对应关系 以下是Maven与…

    Java 2023年5月20日
    00
  • Java中的IO流是什么?

    Java中的IO流是一种机制,用于与存储在计算机硬盘或网络上的数据进行交互。I/O是输入和输出的缩写,实际上涵盖了多种数据传输方向,其中包括读入数据(输入)和写出数据(输出)到其他地方。在Java中,输入和输出统称为流。 Java中的IO流用于将数据从源读取到目的地,数据源和目的地可以是文件、socket、内存中的缓存等等。可以使用标准的输入和输出流Syst…

    Java 2023年4月27日
    00
  • Spring Boot security 默认拦截静态资源的解决方法

    Spring Boot Security默认会拦截所有请求,包括静态资源文件。这样会导致我们在访问静态资源时收到403(Forbidden)错误的响应。下面将介绍解决这个问题的方法。 第一种解决方法 第一种解决方法是在配置类上添加注解,忽略静态资源的拦截。 @Configuration @EnableWebSecurity public class Secu…

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