Scala学习(五)---面向对象

本文详细介绍了Scala中的构造器机制,包括主构造器和辅助构造器的使用,并展示了如何通过主构造器参数定义类的属性。此外,文章还探讨了Scala的继承特性,包括子类继承父类的构造器,以及抽象属性和方法的实现。同时,提到了匿名子类的概念及其应用。
摘要由CSDN通过智能技术生成

1.Scala面向对象的构造器

1.1 主构造器和从构造器(辅助构造器)

//主构造器
class ConstructorTest(name:String) {
  //主构造器调用
  val name1:String=name;

  //辅助构造器,也叫从构造器
  def this()={
    //辅助构造器必须在第一行代码
    //直接或者间接的调用主构造器
    this("mao")//加载主构造器
    println("辅助构造器调用")
  }
}

object ConstructorTest{
  def main(args: Array[String]): Unit = {
    //主构造器
    var masterCons=new ConstructorTest("maomao")
    println(masterCons.name1)

    //辅助构造器
    var slaveCons=new ConstructorTest()
    println(slaveCons.name1)
  }
}

运行效果:
在这里插入图片描述
辅助构造器可以进行重载
第二个辅助构造器调用第一个辅助构造器
在这里插入图片描述

1.2 主构造器参数

a.如果参数使用val或者var来修饰,那么会将参数作为属性来使用

class ConsParams(var age:Int) {

}
object ConsParams{
  def main(args: Array[String]): Unit = {
    val consParams = new ConsParams(18)
    println(consParams.age)
  }
}

在这里插入图片描述
b.在样例类中,默认会将参数转换为属性来用,默认修饰为val,如果是var需要手动添加

case class ConsParams(var age:Int,name:String) {

}
object ConsParams{
  def main(args: Array[String]): Unit = {
    val consParams = new ConsParams(18,"zhangsan")
    println(consParams.age)
    println(consParams.name)
  }
}

运行结果如下:
在这里插入图片描述

2.继承

定义一个父类Person05,再定义一个子类Student05,在如下代码中,子类继承的父类的从构造器。

/**
 * Scala面向对象继承学习
 */
object InheritTest{
  def main(args: Array[String]): Unit = {
    val student0 = new Student05("zhangsan")

  }
}
class Person05()
{
  println("父类构造器")
  //使用默认值进行初始化,String类型的为空
  var name:String=_

  def this(name:String) = {
    this()
    println("父类的辅助构造器")
    this.name=name;
    }
}

class Student05(name:String) extends Person05(name :String)
{
  println("子类的主构造器")

  def this(name:String,age:Int)={
    this(name)
    println("子类的从构造器")
    
  }
}

要点:
1.子类在继承父类的时候,子类的主构造器的参数要大于或者等于父类构造器的参数
2.scala继承的本质就是:子类继承父类的一个构造器

2.1 抽象属性和方法

a.如果父类为抽象类,那么子类需要将抽象抽象的属性和方法实现,否则子类也需要声明为抽象类

abstract class Person06{
  //抽象属性
  //抽象属性本质就是不写等号
  val name:String
  val age:Int
  
  //抽象方法
  def sayHi():Unit
}

class Student06 extends Person06{
  override val name: String = "李四"
  override val age: Int = 18

  override def sayHi(): Unit = 
    {
      println("Hi")
    }
}

//测试代码
    val student01 = new Student06
    println(student01.name)
    println(student01.age)
    println(student01.sayHi())

结果:
在这里插入图片描述
b.重写非抽象属性需要用override来修饰,重写抽象方法可以不加override,非抽象方法需要加override
c.子类中调用父类的方法,需要使用super关键字

class TestInherit01 {

}
object TestInherit01{
  def main(args: Array[String]): Unit = {
    val children0 = new Children01
    println(children0.sayHi())
  }
}

class Father01()
{
  def sayHi()={
    println("hello world!")
  }
}
class Children01() extends Father01()
{
  override def sayHi()={
    super.sayHi();
    println("子Helloworld")
  }
}

在这里插入图片描述
d.子类对抽象属性进行重写,父类抽象属性可以使用var来修饰
子类对非抽象属性进行重写,父类非抽象属性只支持val而不支持var

因为var本来就可以对变量值进行修改,重写是无意义的

e.scala中属性和方法都是动态绑定的,而java中只有方法是动态绑定的
即多态:此多态与java中多态不同
当我们在java中使用多态的时候,属性打印的是父类的属性值,方法是子类的,而使用scala完成多态时,属性与方法打印的都是子类的。

class Test_Poly {

}
object Test_Poly{
  def main(args: Array[String]): Unit = {
    val student0 = new Student08
    println(student0.name)
    println(student0.sayHi())
  }
}
class Person08(){
  val name:String ="person"
  def sayHi(): Unit = {
    println("Hi person")
  }
}
class Student08() extends Person08(){
  override val name: String = "student"
  override def sayHi()={
    println("Hi Student")
  }
}

运行结果:
在这里插入图片描述

2.2 匿名子类

可以使用匿名子类来调用抽象类

class TestNom {

}
object TestNom{
  def main(args: Array[String]): Unit = {
    val per: Person09 = new Person09 {
      override val name: String = "zhangsan"

      override def sayHi(): Unit = println("hello")
    }
    println(per.name)
    println(per.sayHi())
  }
}

abstract class Person09{
  val name:String
  def sayHi()
}

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值