常用类的介绍

抽象类

  1. 抽象方法:指一些只有方法声明,而没有具体方法体的方法。
  2. 抽象字段:定义了field,但是没有给出初始值,则此field为抽象field
  3. 抽象类:如果一个类中有抽象字段或者抽象方法的类一定是抽象类,抽象类中不一定有抽象方法或者抽象字段,只需要用abstract 修饰
  4. 抽象类:不可以实例化的,子类继承抽象类必须实现抽象类中的成员
  5. 子类在实现父类的抽象字段或者抽象方法的时候,不使用override
  6. 子类在覆盖(重写)父类的字段或者方法的时候,一定使用override
  7. 重写字段的实质是在重写字段的setter、getter方法
abstract class Person(val name: String) {
  def sayHello
  val age: String
}
class Student(name: String) extends Person(name) {
  def sayHello: Unit = println("Hello, " + name)
  val age: String = "leo"
}

 

匿名子类

  1. 在Scala中,匿名子类是非常常见,而且非常强大的。Spark的源码中也大量使用了这种匿名子类
  2. 匿名子类:定义一个类的没有名称的子类,并直接创建其对象。(通过new 父类名 进行创建,可以同时重写父类中的成员)
  3. 可以将对象的引用赋予一个变量
object test {
      def main(args: Array[String]): Unit = {
        class Person(protected val name: String) {
          def sayHello = "Hello, I am " + name
        }
        val p = new Person("leo") {  //匿名子类(创建匿名子类的同时直接创建匿名子类的对象p)
        override def sayHello = "Hi, I'm " + name  //重写父类中的方法
        }
        def greeting(s:Person) { //将该匿名子类的对象传递给其他函数
          println(s.sayHello)
        }
        greeting(p)
      }
    }

 内部类

  1. 内部类是隶属于对象而不是隶属于类本身
  2. 创建内部类的实例:需要先创建外部类的实例,在创建内部类的实例。如:
    1. val outer1= new OutClass
    2. val inner1= new outer1.InnerClass
  3. 直接调用内外部类的属性的方式
    1. 使用this的方式调用:OutClass.this.name ()表示外部类   this.name和name表示内部类
    2. 使用别名的方式调用:outer.name表示外部类  (outer表示外部类对象的别名)
class OutClass(val name:String) { outer=>
  class InnerClass(val name:String){
   def info1=println("外部类:"+OutClass.this.name+"内部类:"+this.name) //第一种方法this的形式调用
    def info2=println("外部类:"+outer.name+"内部类:"+name)    //第二种方法调用,别名调用外部类
  }
}
object printOut{
  def main(args: Array[String]): Unit = {
    val outer= new OutClass("out")
    val inner= new outer.InnerClass("inner")
    inner.info1
    inner.info2
  }
}

 

posted @ 2019-10-12 16:26  WeiKing  阅读(166)  评论(0编辑  收藏  举报