[阿强的自学之路]----Scala学习笔记 Day09:面向对象5 抽象类和伴生对象

抽象类:

定义没有方法体的方法,该方法由其子类来具体的实现。该没有方法体的方法我们称之为抽象方法,含有抽象方法的类我们称之为抽象类。

抽象类可以理解为是一个只有方法声明没有方法体的特殊类。

举例:水果,动物。。

 

基本语法:

(1)定义抽象类:abstract class Person{} //通过  abstract 关键字标记抽象类
(2)定义抽象属性:val|var name:String //一个属性没有初始化,就是抽象属性
(3)定义抽象方法:def   hello():String //只声明而没有实现的方法,就是抽象方法

注意:只要出现抽象属性和方法,一个是抽象类,但是一个抽象类中可以有非抽象属性和方法。

 

继承和重写:

(1)如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象类。
(2)重写非抽象方法需要用  override修饰,重写抽象方法则可以不加  override。
(3)子类中调用父类的方法使用 super关键字。
(4)子类对抽象属性进行实现,父类抽象属性可以用  var修饰;

子类对非抽象属性重写,父类非抽象属性只支持 val类型,而不支持 var。

object Test_Abs {
  def main(args: Array[String]): Unit = {
    val stu1 : PersonAbs = new StudentAbs
    println(stu1.name)
    println(stu1.age)
    stu1.m2()
    stu1.m1()
  }
}
abstract class PersonAbs(){
  //抽象属性
  val name:String
  //非抽象属性
  val age :Int = 23
  //抽象方法
  def m1():Unit
  //非抽象方法
  def m2():Unit={
    println("我是父类方法")
  }
}
class StudentAbs() extends PersonAbs{
  override val age:Int = 22//重写的非抽象属性只能是val
  val name: String = "jim"

  def m1(): Unit = {
    super.m2()//调用父类的方法
    println("我是子类继承父类的抽象方法")
  }

}

匿名子类:

object Test_Anno {
  def main(args: Array[String]): Unit = {
    val person : PersonAnn = new PersonAnn {
      override val name: String = "john"

      override def m1(): Unit = println("123")
    }
    println(person.name)
    person.m1()
  }
}
abstract class PersonAnn{
  val name :String
  def m1():Unit
}

伴生对象:

Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念)。

但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该对象为单例对象。

若单例对象名与类名一致,则称该单例对象这个类的伴 生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。

说明:

(1)单例对象采用 object 关键字声明
(2)单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
(3)单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

package com.scala.learn
//测试伴生类和伴生对象
object Test_Company {
  def main(args: Array[String]): Unit = {
    //val personCom = new PersonCom("bob",23) 无法调用主构造方法
    val personCom = PersonCom.NewPerson("bob",23)
  }
}
//class PersonCom (name:String,age:Int){
class PersonCom private(name:String,age:Int){//将构造方法私有化 这样将无法初始化
  def printInfo(): Unit ={
    println(s"person name = $name age = $age school = ${PersonCom.school}")
  }
}
object PersonCom{
  //相当于新建一个static修饰的方法
  def NewPerson(name:String,age:Int):PersonCom = {
    new PersonCom(name,age)
  }
  val school:String = "CSDN"//相当于在java中用static修饰的变量
}
使用apply命名时可以简化调用的过程:
def apply(name:String,age:Int):PersonCom = new PersonCom(name,age)
val personCom2 = PersonCom("jim",24)

注意这是调用了伴生对象的apply方法,而不是new一个对象。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值