广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 面向对象通过new揭开对象实例化
  • 881
分享到

Java 面向对象通过new揭开对象实例化

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

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

摘要

目录概念了解第一种情况第二种情况更正说明: 我之前的的标题有点文不对题,我这篇博客的内容明明说的是:java中对象创建的过程,对内存之种底层的东西,我其实提的不太多。 所以我原来的标

更正说明:

我之前的的标题有点文不对题,我这篇博客的内容明明说的是:java中对象创建的过程,对内存之种底层的东西,我其实提的不太多。

所以我原来的标题:《当你实例化对象时,在内存中到底发生了什么》是不合适的

概念了解

想要知道内存中发生了什么,我们先来了解两个内存概念??

  • 堆内存:保存对象的属性内容。堆内存需要用new关键字来分配空间;
  • 栈内存:保存的是堆内存的地址(在这里为了分析方便,可以简单理解为栈内存保存的是对象的名字)。

Student student1 = new Student()

这行代码可以分为两部分

1、Student student1 声明对象,会在栈上开辟一块区域,名叫student1,里面存了:堆中开辟的内存的地址?

2、new Student() 实例化student1对象,在堆里开辟了一块区域,名叫student1?

当用等号将两者关联的时候,其实就是将栈上声明的对象student1,指向堆上实例化的具体空间

如图所示:

从图中也可以看出,在“=”关联的时候,就是将堆中student1开辟内存的地址0X99存放到了栈里,可以吧内存地址看成Student类的一把钥匙?

实例化后对象student1获得了这把钥匙,所以可以在类中任意拿东西,即调用属性、方法等?

(大多数情况下可以这么认为,其实变量名student1储存的不一定是地址?)

第一种情况

因此可以通过对象名 student1 ,给堆中的具体成员变量赋值、调用?。

其实栈中存放的就是堆中某一个内存的引用,这就是对象引用的概念,其中的 student1 也被称作对象的引用变量?

class Student {
    String name;   //学生类的属性
    int age;
    public void eat() {
        System.out.println(name + "在吃饭, 他" + age + "岁了");   // 学生类的行为(方法)
    }
}
public class TestDemo3 {
    // 不同的实例化对象在栈中拥有不同的空间,他们也指向堆中不同的内存地址
    public static void main(String[] args) {
        Student student1 = new Student();  // 学生对象student1
        student1.name = "小强";  // 通过 对象名.属性 来给堆中的具体成员变量赋值
        student1.age = 18;
        student1.eat();        // 调用类中的eat()方法
        
        Student student2 = new Student(); // 学生对象student2
        student2.name = "小红";
        student2.age = 23;
        student2.eat();
    }
}

第二种情况

不同的实例化对象在栈中拥有不同的空间,他们也指向堆中不同的内存地址,但是也可以有这样的情况:栈中有不同的空间,他们指向堆中同一个内存地址?。

class Dog {
    String name;
    int age;
    public void show() {
        System.out.println("姓名:" + name + "   年龄: " + age);
    }
}
public class TestDemo4 {
    public static void main(String[] args) {
        Dog one = new Dog();
        Dog two = one;
    }
}

对象one在实例化后,拥有一块栈的空间,空间里存放堆的一个内存地址?

那么将one赋值给two之后,two的栈的空间里,也会存放one拥有的堆的内存地址?。

用一个很形象的比喻,妻子带着一幅画嫁给了丈夫,那么她的画也就属于丈夫了,两人共有?。

不论是丈夫还是妻子,只要是对画做出了最后的更改,那么这幅画的内容就会改变。即最后一次修改是有效的,会覆盖掉原先的内容?

用代码来展示:

class Dog {
    String name;
    int age;
    public void show() {
        System.out.println("姓名:" + name + "   年龄: " + age);
    }
}
public class TestDemo4 {
    public static void main(String[] args) {
        Dog one = new Dog();
        Dog two = one;
        one.name = "阿黄";
        one.age = 10;
        
        two.name = "旺财";
        two.age = 3;
        one.show();
        System.out.println("========这是分割线========");
        two.show();
    }
}

怎么样!通过对象one对姓名和年龄的赋值是不是被覆盖掉了,内存中的场景大概是这样 

 栈中的对象one、two同时指向堆中的同一块空间,也就是不同的栈可以修改同一块堆内存的内容?,这样堆内存的内容自然就是最后对象two所赋值的内容了?。

哈哈! 原来在我们实例化new一个对象的时候,内存里偷偷干了这么多事啊?!

各位铁汁们,我们下篇博客见,嘻嘻? 

到此这篇关于Java 通过new揭开对象实例化的文章就介绍到这了,更多相关Java 对象实例化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 面向对象通过new揭开对象实例化

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

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

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

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

下载Word文档
猜你喜欢
  • Java 面向对象通过new揭开对象实例化
    目录概念了解第一种情况第二种情况更正说明: 我之前的的标题有点文不对题,我这篇博客的内容明明说的是:java中对象创建的过程,对内存之种底层的东西,我其实提的不太多。 所以我原来的标...
    99+
    2022-11-13
  • Java面向对象类和对象实例详解
    目录1 - Java面向对象学习的三条主线2 - 面向过程与面向对象3 - 面向对象的三大特征4 - 面向对象分析方法分析问题的思路和步骤5 - 面向对象的思想概述6 - 类和对象的...
    99+
    2022-11-13
  • VB面向对象实例化分析
    这篇文章主要介绍“VB面向对象实例化分析”,在日常操作中,相信很多人在VB面向对象实例化分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”VB面向对象实例化分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-17
  • Java 面向对象 之 多态实例2
    转载于 : http://www.verejava.com/id=16992846385655 public class Polymorphism3 {public static&...
    99+
    2023-06-02
  • java中的面向对象实例讲解
    这篇文章主要介绍“java中的面向对象实例讲解”,在日常操作中,相信很多人在java中的面向对象实例讲解问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中的面向对象实例讲解”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-20
  • Java面向对象之多态实例分析
    这篇文章主要介绍“Java面向对象之多态实例分析”,在日常操作中,相信很多人在Java面向对象之多态实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java面向对象之多态实例分析”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • Java语言面向对象编程思想之类与对象实例详解
    在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧。首先我们来简单的阐述面向对象的思想。面向对象:官方的语言很抽象,我们把官方的解释和定义抛开。想想,自己有什么,对!!我们自己有手...
    99+
    2023-05-31
    java 面向对象 之类
  • 如何通过构造函数实例化对象
    这篇文章主要介绍如何通过构造函数实例化对象,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!如下所示: @Data public class Person ...
    99+
    2022-10-19
  • MySQL通过实例化对象参数查询实例讲解
    本篇文章给大家带来的内容是关于MySQL如何通过实例化对象参数查询数据 ?(源代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 public static string Query...
    99+
    2022-10-18
  • 如何通过实例学习Java对象的构造过程
    这篇文章给大家介绍如何通过实例学习Java对象的构造过程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。下面提供一个项目中的错误实例,提供对其观察和分析,揭示出Java语言实例化一个对象具体过程,最后总结出设计Java类...
    99+
    2023-06-03
  • MySQL通过实例化对象参数如何查询数据
    下文主要给大家带来MySQL通过实例化对象参数如何查询数据 ,希望这些内容能够带给大家实际用处,这也是我编辑MySQL通过实例化对象参数如何查询数据 这篇文章的主要目的。好了,废话不多说...
    99+
    2022-10-18
  • java面向对象设计原则之开闭原则示例解析
    概念 唯一不变的是不断的变化,在软件开发中应该对需求的变化持开放态度,我们要做的就是如何将这种变化对我们现有的成果带来最小的冲击。开闭原则直接面对面向对象程序的目标扩展性和可维护性,...
    99+
    2022-11-12
  • Java面向对象编程(封装/继承/多态)实例解析
    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容。封装封装一个Teacher和Student类package com.hz.test;public class Teacher { private String name; pr...
    99+
    2023-05-30
    java 面向对象 ava
  • java 对象实例化过程中的多态特性解析
    目录java 对象实例化过程中的多态特性通过案例说明通过上述代码java对象的三个特性(封装、继承、多态)1.封装2.继承3.多态java 对象实例化过程中的多态特性 执行对象实例化...
    99+
    2022-11-12
  • Java基础之面向对象机制底层实现的示例分析
    这篇文章主要介绍Java基础之面向对象机制底层实现的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允...
    99+
    2023-06-14
  • java对象实例化过程中的多态特性怎么理解
    本篇内容主要讲解“java对象实例化过程中的多态特性怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java对象实例化过程中的多态特性怎么理解”吧!java 对象实例化过程中的多态特性执行...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作