浅析Java 对象引用和对象本身

浅析 Java 对象引用和对象本身

在 Java 编程中,我们经常会涉及到对象的引用和对象本身的概念。这两者之间的关系非常密切,理解它们的作用和区别对于编写高质量的 Java 代码非常重要。

Java 对象引用

Java 中的对象引用指的是一个变量或表达式,该变量或表达式包含了对象的内存地址。简单来说,即是将对象的地址赋值给一个变量,以方便后续操作。

以下是一个简单的示例,演示了如何定义和使用一个 Java 对象引用:

String str = new String("Hello World!");

在上面的示例中,我们创建了一个字符串对象,并将其赋值给 str 变量,str 变量的值就是该对象的内存地址。

Java 对象本身

Java 中的对象本身指的是一个占用一定内存空间的数据结构,它包含了对象的所有成员变量和相关的方法。当我们使用 new 操作符创建一个对象时,Java 会在堆内存中分配一定的空间来存储这个对象,并返回该对象的引用。

以下是一个简单的示例,演示了如何定义和使用一个 Java 对象本身:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

Person person = new Person("Tom", 20);

在上面的示例中,我们定义了一个 Person 类,并使用 new 操作符创建了一个 Person 对象,并将其引用赋值给 person 变量。

对象引用和对象本身的关系

Java 对象引用和对象本身之间的关系如下:

  • 对象本身是占用内存的数据结构,对象引用则是指向该数据结构的指针。
  • 对象本身存在于堆内存中,而对象引用存在于栈内存中。
  • 当我们定义一个对象引用并将其赋值给某个对象时,这个对象引用就指向了该对象的内存地址。
  • 对象引用可以通过复制来传递,而对象本身只存在一份,无法直接复制。

示例说明

示例1:在方法中改变对象引用的值

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);
        changePerson(person);
        System.out.println(person.getName()); // 输出:Jerry
    }

    public static void changePerson(Person person) {
        person = new Person("Jerry", 30);
    }
}

在上面的示例中,我们创建了一个 Person 对象,并将其引用赋值给 person 变量。然后我们将 person 变量作为参数传递给 changePerson 方法中。在 changePerson 方法内部,我们又创建了一个新的 Person 对象,并将其引用赋值给了传入的参数 person,这里的 person 是一个新对象的引用,不是原对象的引用。因此在 main 方法内部打印 person.getName() 时,输出的是原来的值,即 "Tom"。

示例2:在方法中改变对象本身的值

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

public class Test {
    public static void main(String[] args) {
        Person person = new Person("Tom", 20);
        changePerson(person);
        System.out.println(person.getName()); // 输出:Jerry
    }

    public static void changePerson(Person person) {
        person.setName("Jerry");
    }
}

在上面的示例中,我们同样创建了一个 Person 对象,并将其引用赋值给 person 变量。然后我们将 person 变量作为参数传递给 changePerson 方法中。在 changePerson 方法内部,我们调用了 person 对象的 setName 方法,将该对象的 name 属性值改变为了 "Jerry"。因此在 main 方法内部打印 person.getName() 时,输出的是 "Jerry"。

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

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JavaScript学习笔记之JS函数

    Javascript函数是一种重要的编程元素,用于封装可重用的功能。在本篇学习笔记中,我们将涵盖以下主题: 函数的定义和调用 函数参数的传递与默认值 函数返回值和作用域 1. 函数的定义和调用 JavaScript中函数可以通过函数声明或函数表达式来定义。函数声明使用关键字function定义,如下: function greet(name) { conso…

    JavaScript 2023年5月18日
    00
  • 网页前台通过js非法字符过滤代码(骂人的话等等)

    网页前台通过js非法字符过滤代码的主要目的是防止用户输入一些恶意字符或代码,从而保护网站的安全,提高用户体验。本文将整理出一份完整的攻略,以实现该功能。 步骤一:准备过滤规则列表 在实现非法字符过滤功能前,需要准备好一份过滤规则列表,包括所有需要过滤的字符、字符串、HTML标签等。例如: var illegalChars = ["fuck&quot…

    JavaScript 2023年6月11日
    00
  • js刷新页面方法大全

    下面是详细讲解 “JS 刷新页面方法大全” 的攻略: 一、使用 location.reload() 方法 location.reload() 方法可以重新加载当前文档(即刷新页面)。在不传递任何参数的情况下,它将以最新的内容重新加载当前URL。 // 简洁版 location.reload(); // 带有强制刷新参数的完整版 location.reload…

    JavaScript 2023年6月11日
    00
  • 深入理解JS中attribute和property的区别

    当我们在使用JavaScript处理HTML时,常常涉及到元素的属性(Attribute)和属性值(property)。在一些情况下,这两者的方式使用会存在一些细微的区别。下面,我将为您详细讲解“深入理解JS中attribute和property的区别”的完整攻略。 Attribute和Property的定义 首先,我们需要明确attribute和prope…

    JavaScript 2023年6月10日
    00
  • JS异步执行结果获取的3种解决方式

    下面我为你详细讲解“JS异步执行结果获取的3种解决方式”的完整攻略。 什么是异步执行? 异步执行是指 JavaScript 引擎在执行代码时,遇到需要等待的任务时不会阻塞当前执行流程,而是将该任务挂起,通过异步调用机制继续执行后面的代码,等待该任务完成后再返回到前面被挂起的位置继续执行。 常见的异步任务包括:Ajax,定时器,事件回调函数等。 异步执行结果获…

    JavaScript 2023年5月28日
    00
  • python selenium操作cookie的实现

    Python Selenium操作Cookie的实现: 引入selenium模块 from selenium import webdriver 定义浏览器对象 browser = webdriver.Chrome() 获取网站Cookie信息 browser.get(‘https://www.baidu.com’) print(browser.get_coo…

    JavaScript 2023年6月11日
    00
  • javascript制作幻灯片(360度全景图片)

    准备工作 在制作幻灯片之前,我们需要准备以下几个工作: HTML页面模板 360度全景图片 JavaScript库Three.js 其中,HTML页面模板是整个幻灯片的基础,而360度全景图片是幻灯片展示的内容,而JavaScript库Three.js是帮助我们实现幻灯片效果的工具。 引入Three.js库 首先需要在HTML页面中引入Three.js库,具…

    JavaScript 2023年6月11日
    00
  • js格式化时间和js格式化时间戳示例

    下面是我对“js格式化时间和js格式化时间戳示例”的详细讲解。 什么是js格式化时间和js格式化时间戳? 在网站开发过程中,时间是一个很常见的数据类型。js格式化时间指的是将时间戳转化为人类可读的时间字符串,而js格式化时间戳指的是将时间字符串转化为时间戳。 如何使用js格式化时间? 在js中,可以使用Date对象来处理时间。下面是一个使用js格式化时间的示…

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