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 spring 通过注解方式创建对象的示例详解

    Java spring 通过注解方式创建对象的示例详解 前言 在Java Spring框架中创建对象可以使用XML配置或者注解方式。其中注解方式比较方便快捷,并且代码可读性更好。在本文中,将详细讲解如何使用Java Spring框架通过注解方式创建对象。 环境 JDK版本:1.8+ Spring版本:5.0+ 使用注解方式创建对象 @Component注解 …

    Java 2023年5月26日
    00
  • Java字节码指令集的使用详细

    Java字节码指令集的使用详细 什么是Java字节码指令集 Java字节码指令集是一组用于JVM(Java虚拟机)执行Java程序的指令,它是在Java源代码被编译成可执行的Java字节码文件后所产生的中间代码。每个字节码指令对应一个特定的操作,例如变量的赋值、运算操作、方法调用等。 Java字节码指令集的格式 Java字节码指令由一些操作码(opcode)…

    Java 2023年5月23日
    00
  • Java参数传递实现代码及过程图解

    Java参数传递实现代码及过程图解 在Java中,方法传递参数是通过按值传递(pass-by-value)实现的。简单来说,就是在传递参数的时候,将参数的值复制一份给方法内部进行操作,不会直接影响原来的变量值。以下是Java参数传递的一些细节和过程图解: 基本数据类型的参数传递 基本数据类型的参数传递就是将值复制给方法内部进行操作,不会对原来的变量值产生影响…

    Java 2023年5月30日
    00
  • Springboot整合kafka的示例代码

    下面就为您详细讲解“Springboot整合kafka的示例代码”的完整攻略。 1. Springboot整合kafka的前置知识 在开始编写Springboot整合kafka的示例代码前,需要了解下面几个知识点: Apache Kafka的基本概念:Broker、Topic、Partition、Producer、Consumer等。 Kafka消息的格式化…

    Java 2023年5月20日
    00
  • feign调用中文参数被encode编译的问题

    当我们使用Feign进行调用时,如果参数中含有中文或其他非ASCII字符,我们会发现这些参数被自动编码了,而且编码方式并不是我们常见的UTF-8,这就需要我们进行一些额外的配置来解决这个问题。 一般情况下,我们需要在Feign配置中添加一个编码器类,用于将参数编码成UTF-8格式,例如: @Configuration public class FeignCo…

    Java 2023年5月20日
    00
  • java web项目Session获取不到问题及解决

    我们来详细讲解一下“Java Web项目Session获取不到问题及解决”的攻略。 问题的描述 在 Java Web 项目中,我们经常使用 Session 来进行用户状态的维护和管理。但有时我们会发现,无法获取到已经创建的 Session,这样就会导致用户登录等功能出现问题。 问题的原因 造成 Session 获取失败的原因有很多,具体包括以下几个方面: 代…

    Java 2023年6月15日
    00
  • 微信小程序组件化开发的实战步骤

    下面我会详细讲解“微信小程序组件化开发的实战步骤”的完整攻略,共分为以下几个步骤: 1. 创建自定义组件 首先,在小程序项目中新建一个文件夹,用来存放自定义组件。命名可以根据需要自行定义,这里以 components 为例。在文件夹中按照组件的需求创建各个组件文件夹,比如 toast(提示框组件)、modal(弹框组件)等。 在组件文件夹中,需要新建三个文件…

    Java 2023年5月23日
    00
  • Java类加载器的作用是什么?

    Java类加载器的作用是将类文件加载到内存中,并使其能够被Java虚拟机识别。在Java中,类的加载是在其被首次引用时完成的,而类加载器则是负责协调和完成这个任务的组件。 Java类加载器的主要作用包括: 将.class文件加载到JVM中 确定每个类在JVM中的唯一性 保证不同类的可见性 实现类的动态加载和卸载 实现Java程序的模块化开发 Java类加载器…

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