开发者学堂课程【Scala 核心编程-基础:scala 对象创建的流程分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8952
scala 对象创建的流程分析
目录:
一、案例
二、流程分析
三、总结
一、案例
看一个案例
class Person {
var age: Short = 90
var name: String=_
def this(n: String, a: Int){
this()
this.name =n
this.age =a
}
}
var p:Person = new Person(
“
小倩”,20)
案例说明:
以这个案例为例,有个 Person,Person 中有两个属性,然后里面还有一个辅助构造器,这个辅助构造器按照原先写的规则也是正确的编写的,假如 new 了一个对象小倩,给了她20岁。那这个时候显然调用的是辅助构造器。
二、流程分析
1、加载类的信息(属性信息,方法信息)
加载类的信息就是加载属性信息和方法信息,这个会把它加载到方法区。
2、在内存中(堆)开辟空间
空间开多大取决于属性多大,所以说在定义内存属性的时候是要注意的,能够用小数据就不用大数据,比如说年龄用Int 就可以了,用 short 也完全够了。假设用大数据对象很多,有一千万个对象,有一个属性节省了2个指针,一千万个对象就节省了两千万个指针。只把数据类型按照严格的优化。
3、使用父类的构造器(主和辅助)进行初始化
父类中也是调用父类的主构造器。
4、使用主构造器对属性进行初始化【age:90, name null】
5、使用辅助构造器对属性进行初始化 【age:20, name小倩】
这点跟 JAVA 是有所区别的,JAVA它在进行初始化的时候,完全没有主和副的概念,构造地位都是一样的。根据辅助构造器相当于把 a 和 n 给它了,所以年龄变成20,name 变成小倩
6、将开辟的对象的地址赋给p这个引用
赋值运算是从右向左,这个时候把对象的地址赋给 p 这个引用。
三、总结
如果有面试官问到,一定要强调有主构造器和父构造器,同时要提到父构造器和主构造器的构建过程,跟java是有点小区别的。