1.继承与有参构造函数
java
看下列代码的打印顺序
package com.atguigu.bigdata.scala.chapter06;
public class Test {
public static void main(String[] args) {
BB bb = new BB();
}
}
class AA {
//无参构造方法
public AA () {
System.out.println("aaaa");
}
}
class BB extends AA {
public BB() { //报错
System.out.println("bbbb");
}
}
aaaa
bbbb
原因:构建子类对象的时候会隐藏地调用父类的无参构造方法。
如果父类的构造方法是有参的?
package com.atguigu.bigdata.scala.chapter06;
public class Test {
public static void main(String[] args) {
BB bb = new BB();
}
}
class AA {
//无参构造方法
public AA (String name) {
System.out.println("aaaa");
}
}
class BB extends AA {
public BB() {
System.out.println("bbbb");
}
}
子类报错,因为无法构建父类对象,就无法包含父类。
所以我们要在子类中显示地调用父类。
class BB extends AA {
public BB() {
super("xxx");
System.out.println("bbbb");
}
}
看下面代码:
public class Test {
public static void main(String[] args) {
BB bb = new BB("zhangsan");
}
}
class AA {
//无参构造方法
public AA (String name) {
System.out.println("aaaa");
}
}
class BB extends AA {
public BB(String name) {
super(name); //通过子类传参给父类构造器
System.out.println("bbbb");
}
}
说明:子类构造器先执行,父类构造器先执行完。
scala
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
}
}
class Parent11(name: String){
}
class User11 extends Parent11 {
}
同样scala也会报错,也需要显示地调用父类地有参构造方法
object Scala04_Field {
def main(args: Array[String]): Unit = {
}
}
class Parent11(name: String){
}
//在父类的后面增加小括号,等同于调用父类的构造方法。
class User11 extends Parent11("zhangsan") {
}
object Scala04_Field {
def main(args: Array[String]): Unit = {
new User11("zhangsan")
}
}
class Parent11(name: String){
}
//由子类将参数传递给父类
class User11(name: String) extends Parent11(name) {
}
写出下述代码的执行顺序
package com.atguigu.bigdata.scala.chapter06
object Scala04_Field {
def main(args: Array[String]): Unit = {
new User11()
}
}
class Parent11(name: String){
println(name)
//无参构造
def this() {
//调用主构造
this("wangwu")
println("aaaaa")
}
}
//在父类的后面增加小括号,等同于调用父类的构造方法。
class User11(name: String) extends Parent11 {
println("bbbb")
//无参构造
def this() {
//调用主构造
this("zhangsan")
println("cccc")
}
}
new User11() 调无参构造函数 def this() -> 调主构造函数 this("zhangsan") -> User11(name: String) -> 先执行父类Parent11 -> 因为Parent11无参,所以走父类无参构造函数def this() -> 调父类主构造函数this("wangwu") -> 执行父类主构造函数类体 -> 执行父类辅助造函数类体 -> 执行子类主构造函数类体 -> 执行子类辅助构造函数类体。
打印:
wangwu
aaaaa
bbbb
cccc