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

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

开发者学堂课程【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 的区分说明,案例的代码也会在笔记中,其次讲了类和对象的内存分配机制,针对案例先写了代码,然后也画了示意图,案例代码和示意图在笔记中会有,本节课就说到这里。

相关文章
|
存储 安全 算法
深入剖析JVM内存管理与对象创建原理
JVM内存管理,JVM运行时区域,直接内存,对象创建原理。
40 2
|
1月前
|
存储 算法 安全
【JVM】深入理解JVM对象内存分配方式
【JVM】深入理解JVM对象内存分配方式
29 0
|
6月前
|
存储 安全 程序员
浅谈内存管理及僵尸对象
浅谈内存管理及僵尸对象
33 0
|
5月前
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
37 0
|
1月前
|
Python
Python中如何判断两个对象的内存地址是否一致?
Python中如何判断两个对象的内存地址是否一致?
17 0
|
1月前
|
存储 安全 Java
【JVM】Java堆 :深入理解内存中的对象世界
【JVM】Java堆 :深入理解内存中的对象世界
53 0
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
107 0
|
2月前
|
存储 缓存 算法
深入理解JVM - 对象分配内存
深入理解JVM - 对象分配内存
29 1
|
3月前
|
存储 缓存 算法
对象和数组并不是都是在堆上分配内存的
对象和数组并不是都是在堆上分配内存的
25 0
|
8月前
|
缓存 关系型数据库 MySQL
高性能内存对象缓存Memcached
高性能内存对象缓存Memcached案例