Scala坑六(抽象类)

原文地址为: Scala坑六(抽象类)

1.抽象类(abstract class)

类的一个或者多个方法没有完整的定义

声明方法时只需要不写方法体,不需要关键字

子类重写父类的抽象方法时不需要加override

父类可以声明抽象字段(没有初始值的字段)

子类重写父类抽象字段时不需要加override

class Test3 {

}

abstract class Person{
def speak
val name : String
var age : Int
}
class Student extends Person{
def speak{
println("speak!!")
}

var age = 100
val name = "ahaha"
}
object Test3 extends App{
var s = new Student;
s.speak
print (s.name + ":" + s.age)
}

2.trait 特质 对比下JAVA8的借口

可以理解为包含具体实现的借口

   字段和行为的集合

混入类中,第一个要用extends 

通过with关键字,一个类可以扩展多个特质

带有特质的对象

特质从左到右被构造

trait Logger{
def log(msg:String)
}
trait ConsoleLogger extends Logger{
def log(msg : String){
println(msg)
}
}
class loggerImpl extends ConsoleLogger{
def test{
log("aaa")
}
}

trait ConsoleLogger{
def log(msg : String){
println("sava money" + msg)
}
}
trait MessageLogger extends ConsoleLogger{
override def log(msg : String){
println("sava money to bank" + msg)
}
}
abstract class Account{
def save
}
class MyAcconunt extends Account with ConsoleLogger{
def save{
log("100")
}
}
object Test3 extends App{
val a = new MyAcconunt with MessageLogger //带有特质的对象
a.save
}

class loggerImpl extends ConsoleLogger{
def test{
log("aaa")
}
}


2.apply方法和单例对象

class Test4 {

}
object Test4 extends App{
val a = ApplyText() //类名+括号调用的是object中的apply方法
a.test
val b = new ApplyTest//对象+括号调用的是类中的apply方法
println(b())
}

class ApplyTest{
def apply() = "APPLY"
def test{
println("test")
}
}

//object 里面的方法相当于静态方法
object ApplyText{ //本身就是一个单例
def apply()= new ApplyTest
def static{
println("mmm a static method")
}
}

3.包

    可串联   package com.aaa{

//在这个层次不能看的bbb的成员

package.bbb{

}

}

顶部标记  package com.b

  package b

包对象  把公有的东西放在同一个包里面

包可见性

package aa.bb.cc.dd

class XXX{

private[dd] def as = {} //只能在dd包以下能使用

}

包在任何地方引入

重命名成员 import  java.unil.(HashMap => JavaHashMap)

隐藏包  (hashMap => _)

自动引入 java.lang._






转载请注明本文地址: Scala坑六(抽象类)

猜你喜欢

转载自blog.csdn.net/dearbaba_1666/article/details/80958543