原文地址为:
Scala坑六(抽象类)
3.包
转载请注明本文地址: 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坑六(抽象类)