类的父子关系

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,030评论 2 9
  • Scaladoc是什么:scala api文档,包含了scala所有的api以及使用说明,class、object...
    义焃阅读 7,484评论 0 1
  • 变量初始化可以用用 _ 作占位符,赋值为默认值,字符串 null,Float、Int、Double 等为 0var...
    FaDeo_O阅读 4,502评论 0 0
  • 读《快学Scala 》一书的摘要 Scala 运行于JVM之上,拥有海量类库和工具,兼顾函数式编程和面向对象。 在...
    abel_cao阅读 5,080评论 0 8
  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,438评论 0 6

友情链接更多精彩内容