package org.xj.scala.spark
/**
* 抽象类:
* 1、类的一个或者多个方法没有被完整的定义
* 2、声明抽象方法不需要加abstract关键字,只需要不写方法体
* 3、子类重写父类的抽象方法时不需要加override
* 4、父类可以声明抽象字段(没有初始值的字段)
* 5、子类重写父类的抽象字段时不需要加override
*/
class AbstractClass {
}
//抽象类
abstract class Person1 {
def speak
val name: String //定义常量,没有赋值
var age: Int //定义变量
}
//继承抽象类
class Student1 extends Person1 {
//覆盖父类抽象的方法
def speak { //有没有返回值就看等号有没有写,没有写返回值Unit
println("speak!!!")
}
//重写父类的抽象字段
val name = "aaa"
var age = 10
}
/**
* 特质(trait) 声明的对比一下java8的接
* 1、字段和行为的集合
* 2、混入类中
* 3、通过with关键字,一个类可以扩展多个特质
*/
/**
* trait Logger {
* def log(msg: String) {
* println("log:"+msg)
* }
* }
* //如果你没有继承人和类或者没有混入任何特质(trait),一定使用extends实现继承关系,多个trait 使用 with实现
* class Test extends Logger {
* def test {
* log("我是Test中的test方法,我调用了特质Logger中继承过来的log方法")
* }
* }
*/
//特质中定义一个没有方法体的方法,即为一个抽象方法,它的抽象方法可以被他的字特质继承
/**
* trait Logger {
* def log(msg: String)
* }
*
* //重写父特质中的抽象方法
* trait ConsoleLogger extends Logger {
* def log(msg: String) { //重写继承过来的特质中的抽象方法,不用加override
* println(msg)
* }
* }
*
* //继承一个特质
* class Test extends ConsoleLogger {
* def test {
* log("ppp")
* }
* }
*
*/
//控制台日志 特质
trait ConsoleLogger {
def log(msg: String) {
print("save money:" + msg)
}
}
trait MessageLoger extends ConsoleLogger {
override def log(msg: String) { //这里覆盖父特质的非抽象方法,那么就需加override
println("save money to bank:" + msg)
}
}
abstract class Account {
def save
}
class MyAccount extends Account with ConsoleLogger {
def save {
log("100")
}
}
/**
* 一个抽象类可以继承trait声明实现,里面可以有具体的实现方法被继承过来
*/
object AbstractClass extends App { //-->trait App extends DelayedInit
// val stu = new Student1 //实例化
// stu.speak
// println(stu.name + "," + stu.age)
// val t = new Test
// t.log("你好吗?我是Test,我的方法log()来自trait(特质)声明的Logger类")
// t.test
// val t = new Test
// t.test
// val acc = new MyAccount
// acc.save //---->save money:100
//为对象混入特质
val acc = new MyAccount with MessageLoger
acc.save //----save money to bank:100
}
/**
* 抽象类:
* 1、类的一个或者多个方法没有被完整的定义
* 2、声明抽象方法不需要加abstract关键字,只需要不写方法体
* 3、子类重写父类的抽象方法时不需要加override
* 4、父类可以声明抽象字段(没有初始值的字段)
* 5、子类重写父类的抽象字段时不需要加override
*/
class AbstractClass {
}
//抽象类
abstract class Person1 {
def speak
val name: String //定义常量,没有赋值
var age: Int //定义变量
}
//继承抽象类
class Student1 extends Person1 {
//覆盖父类抽象的方法
def speak { //有没有返回值就看等号有没有写,没有写返回值Unit
println("speak!!!")
}
//重写父类的抽象字段
val name = "aaa"
var age = 10
}
/**
* 特质(trait) 声明的对比一下java8的接
* 1、字段和行为的集合
* 2、混入类中
* 3、通过with关键字,一个类可以扩展多个特质
*/
/**
* trait Logger {
* def log(msg: String) {
* println("log:"+msg)
* }
* }
* //如果你没有继承人和类或者没有混入任何特质(trait),一定使用extends实现继承关系,多个trait 使用 with实现
* class Test extends Logger {
* def test {
* log("我是Test中的test方法,我调用了特质Logger中继承过来的log方法")
* }
* }
*/
//特质中定义一个没有方法体的方法,即为一个抽象方法,它的抽象方法可以被他的字特质继承
/**
* trait Logger {
* def log(msg: String)
* }
*
* //重写父特质中的抽象方法
* trait ConsoleLogger extends Logger {
* def log(msg: String) { //重写继承过来的特质中的抽象方法,不用加override
* println(msg)
* }
* }
*
* //继承一个特质
* class Test extends ConsoleLogger {
* def test {
* log("ppp")
* }
* }
*
*/
//控制台日志 特质
trait ConsoleLogger {
def log(msg: String) {
print("save money:" + msg)
}
}
trait MessageLoger extends ConsoleLogger {
override def log(msg: String) { //这里覆盖父特质的非抽象方法,那么就需加override
println("save money to bank:" + msg)
}
}
abstract class Account {
def save
}
class MyAccount extends Account with ConsoleLogger {
def save {
log("100")
}
}
/**
* 一个抽象类可以继承trait声明实现,里面可以有具体的实现方法被继承过来
*/
object AbstractClass extends App { //-->trait App extends DelayedInit
// val stu = new Student1 //实例化
// stu.speak
// println(stu.name + "," + stu.age)
// val t = new Test
// t.log("你好吗?我是Test,我的方法log()来自trait(特质)声明的Logger类")
// t.test
// val t = new Test
// t.test
// val acc = new MyAccount
// acc.save //---->save money:100
//为对象混入特质
val acc = new MyAccount with MessageLoger
acc.save //----save money to bank:100
}