开发者学堂课程【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,此时的内存布局是如何的?如图
此内存布局和 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
l
n(p1 == p2)// true
p1.name = "tom"
print ln( "p2.name=" +p2.name)
}
代码执行结果:
P2.name=tom
接下来对本节课所讲的内容进行版述。
首先讲了创建对象的基本语法和对 var 和 val 的区分说明,案例的代码也会在笔记中,其次讲了类和对象的内存分配机制,针对案例先写了代码,然后也画了示意图,案例代码和示意图在笔记中会有,本节课就说到这里。