对象创建和对象内存布局图|学习笔记

简介: 快速学习对象创建和对象内存布局图。

开发者学堂课程【Scala 核心编程-基础对象创建和对象内存布局图】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8943


对象创建和对象内存布局图

 

内容创建

一、如何创建对象

二、如何访问属性

三、类和对象的内存分配机制

四、证明 scala 对象的分配和 Java 是一样的

 

一、如何创建对象

1、基本语法

val| var 对象名[:类型]=new 类型()

创建对象和 var 基本上是一样的,在创建对象中的类型也可以使用类型推导;

2、val 和 var的区别

如果不希望改变对象的引用,这里提到的变化指的是对象本身的变化,而不是对象的属性(即:内存地址),应该声明为val 性质的,因为这样此对象没有线程,提高了安全性和动力性;否则声明为 var, scala 设计者推荐使用 val ,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用,就会直接使用 val。

3、scala 在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面 new 对象类型有继承关系即多态时,就必须得写上。

(1)详解:

当基本语法 val| var 对象名[:类型]=new 类型()变成 val| var 对象名=new 类型(),多态效果就不会出现,比如语法中的类型为子类,本意是想把子类赋给父类,但是不去指明父类的类型,这样会造成终身子类的现象。当需要把子类的引用交给父类时,父类的类型就必须要写上,如若不写,推导出来的只能是子类。

(2)案例例示:Create Obj

代码如下:

package com.atguigu.chaptero6.oop

object Create obj {

def main(args: Array [string]):unit = {

val emp =new Emp // emp 类型就是 Emp(因为用的类型推导)

//如果我们希望将子类对象,交给父类的引用,这时就需要写上类型

val emp2: Person = new Emp//把子类对象 Emp 交给了父类 emp2,emp2指向了 Emp 的地址或引用

}

//现有叫 person 的类,固原 Emp extends 继承了 person,可以看出 Emp 是 Person 的子类

class Person {

}

class Emp extends Person {

}

 

二、如何访问属性

1基本语法

对象名.属性名;

案例演示赋值和输出。

 

三、类和对象的内存分配机制

1、思考题

看看下面一段代码:

val p1 = new Person

p1.name = "jack"

p1.age = 30

val p2 = p1

其中给了类的名字和年龄,把 p1的引用交给了 p2,此时的内存布局是如何的?如图

 image.png

此内存布局和 var 是相同的,因为底层都是基于 JVM 的;当把 p1的引用交给 p2的逻辑如下,p1里面的地址 0x1122指向了一个类,把 p1交给了 p2之后,站里有了 p2,利用地址同样指向了类,这种机制跟 var 是完全一样的。

 

四、证明 scala 对象的分配和 Java 是一样的

1、案例 Mem State

(1)代码如下:

package com.atguigu.chaptero6.oop

object Mem state {

def main(args: Array [ string]):unit = {

//新创建一个类,并赋上名称和年龄

val p1 =new Person2//在之前的包里用到过 person,所有此处使用 person2

}

class Person2 {

var name = ""

var age: Int =_//如果是用_方式给默认值,则属性必须指定类型。因为默认值是根据不同类型赋不同类型的值,如果不指定类型,就无法给出对应的类型值,可能会按整数或字符串来处理,这样会导致无法判断,很容易报错。

}

代码执行结果:

turn

(2)代码如下:

p1.name = "jack"

p1.age = 10

val p2 = p1

print ln(p1 == p2)// true

p1.name = "tom"

print ln( "p2.name=" +p2.name)

}

代码执行结果:

P2.name=tom

接下来对本节课所讲的内容进行版述。

首先讲了创建对象的基本语法和对 var 和 val 的区分说明,案例的代码也会在笔记中,其次讲了类和对象的内存分配机制,针对案例先写了代码,然后也画了示意图,案例代码和示意图在笔记中会有,本节课就说到这里。

相关文章
|
18天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
45 4
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
70 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
Java 测试技术 Android开发
让星星⭐月亮告诉你,强软弱虚引用类型对象在内存足够和内存不足的情况下,面对System.gc()时,被回收情况如何?
本文介绍了Java中四种引用类型(强引用、软引用、弱引用、虚引用)的特点及行为,并通过示例代码展示了在内存充足和不足情况下这些引用类型的不同表现。文中提供了详细的测试方法和步骤,帮助理解不同引用类型在垃圾回收机制中的作用。测试环境为Eclipse + JDK1.8,需配置JVM运行参数以限制内存使用。
32 2
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
57 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
存储 Java
深入理解java对象的内存布局
这篇文章深入探讨了Java对象在HotSpot虚拟机中的内存布局,包括对象头、实例数据和对齐填充三个部分,以及对象头中包含的运行时数据和类型指针等详细信息。
28 0
深入理解java对象的内存布局
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
2月前
|
算法 Java
JVM进阶调优系列(3)堆内存的对象什么时候被回收?
堆对象的生命周期是咋样的?什么时候被回收,回收前又如何流转?具体又是被如何回收?今天重点讲对象GC,看完这篇就全都明白了。
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
2月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(一)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
4月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
389 0