scala之-类加载 and 初始化顺序(与java对比)babe!~
1 scala的对象加载顺序
1、首先通过类加载器加载类信息。
2、初始化成员(属性、方法及其变量)
3、通过主构造器进行初始化
4、通过辅助构造器进行初始化
5、给接收的变量分配内存地址
2 声明子类对象时构造器的加载顺序
2.1 Java
在Java中,声明子类对象时,子类的所有的构造器(包括有餐、午餐构造器)、会隐式或者显式的调用父类的无参构造器super()
package com.shufang.facetoobject;
public class A {
private String name;
// 1
// 3
public A() {
System.out.println("A的无参构造器");
}
public A(String name) {
this.name = name;
System.out.println("A的有参构造器");
}
}
class B extends A {
private String name;
// 2
public B() {
//super();
System.out.println("B的无参构造器");
}
// 4
public B(String name) {
super(name); //如果显示调用,那么父类的无参构造器就不会被调用了
this.name = name;
System.out.println("B的有参构造器");
}
public static void main(String[] args) {
B b = new B();
B b1 = new B("shuFang");
}
}
/*最后的结果如下:
* A的无参构造器
B的无参构造器
A的无参构造器
B的有参构造器
*/
2.2 Scala
在scala中一个类可以有1个主构造器,所有的辅助构造器都必须显示调用this(x x)主构造器(可以是间接调用)。
package com.shufang.facetoobject
//声明超类A
class A1 {
var name: String = "A"
val id: Int = 1
def this(name: String) {
this()
this.name = name
println("A1的辅助构造器")
}
println("A1的主构造器")
}
//声明子类B
class B1 extends A1 {
/** TODO mutable 的 var 修饰的属性是不能被重写的
* Error:(20, 16) overriding variable name in class A1 of type String;
* variable name cannot override a mutable variable
* override var name: String = "bbbb1"
*/
// override var name: String = "bbbb1" //可变的属性是不能被重写的,这里涉及到一个动态绑定机制
override val id = 10
def this(name: String) {
this
this.name = name
println("B的辅助构造器")
}
println("B的主构造器")
}
object TestOne {
def main(args: Array[String]): Unit = {
val a = new A1("shuFang")
println("*" * 40)
val b = new B1()
println(b.name)
println(b.id)
}
}
/**运行结果
A1的主构造器
A1的辅助构造器
****************************************
A1的主构造器
B的主构造器
/