java中的抽象类
语法:
[访问修饰符] abstract class 类名{}
scala 中的抽象类
语法:
abstract class 类名{}
案例:
代码语言:javascript复制/**
* 动物抽象类
*/
abstract class Animal{ }
若 类中什么都没定义{}
可以省略
abstract class Animal
抽象方法
没有方法体({}
)的方法,就是抽象方法。
abstract class Animal{
/**
* 吃饭
*/
def eat():Unit
}
定义成抽象方法的方法,需要由子类去实现该方法,除法子类也是一个抽象类。
代码语言:javascript复制/**
* 犬科
*/
abstract class Canine extends Animal{}
代码语言:javascript复制/**
* 狗
*/
class Dog extends Canine{
/**
* 吃饭
*/
override def eat(): Unit = {
println("狗啃骨头")
}
}
抽象类中,抽象方法返回值类型可以不指定,默认就是Unit
类型。
具体方法
在抽象类中,除了有抽象方法,还有具体的方法(带{}
)实现。
如:动物各种其他行为可能有些区别,但是只要是动物,就应该会睡觉,所以可以定义成具体的方法。
abstract class Animal{
/**
* 吃饭
*/
def eat():Unit
/**
* 睡眠
*/
def sleep(): Unit ={
println("闭眼,睡觉...")
}
}
抽象属性
每个动物都会有个名字,那么名字属性
就可以定义成 抽象属性,具体叫什么,由子类去定义。
语法:
代码语言:javascript复制val 属性名:类型
abstract class Animal{
//抽象属性
val name:String
/**
* 吃饭
*/
def eat():Unit
/**
* 睡眠
*/
def sleep(): Unit ={
println("睡觉...")
}
}
代码语言:javascript复制/**
* 狗
*/
class Dog extends Canine{
/**
* 吃饭
*/
override def eat(): Unit = {
println("狗啃骨头")
}
override val name: String = "旺财"
}
注意:
- 抽象属性必须使用
val
- 抽象属性不能对其赋值
既然有抽象属性,那当然也有具体属性,除去抽象属性的定义,那自然就是具体属性了。
创建抽象类
实际情况下,抽象类是可以进行创建new
的,只不过需要实现其内部属性和方法,这种方式叫匿名子类
。
val animal=new Animal {
override val name: String = _
/**
* 吃饭
*/
override def eat(): Unit = ???
}
代码语言:javascript复制 val cat=new Animal {
override val name: String = "小花"
/**
* 吃饭
*/
override def eat(): Unit = println("猫爱吃鱼")
}
print(cat.name)
cat.eat()
输出结果
代码语言:javascript复制小花猫爱吃鱼
通常情况下,还是创建具体的子类
代码语言:javascript复制 def main(args: Array[String]): Unit = {
val dog:Animal=new Dog
print(dog.name)
dog.eat()
}
输出结果
代码语言:javascript复制旺财狗啃骨头
单例对象
在scala中 object 就是一个单例对象;如 Demo01 即使一个单例对象
代码语言:javascript复制object Demo01 {}
运行测试:
代码语言:javascript复制 def main(args: Array[String]): Unit = {
println(Demo01)
println(Demo01)
println(Demo01)
}
无论运行多少次都是一个实例
代码语言:javascript复制com.admin.xxx.abst.Demo01$@5a01ccaa
com.admin.xxx.abst.Demo01$@5a01ccaa
com.admin.xxx.abst.Demo01$@5a01ccaa
scala object 中所有的属性和方法都是类似 java static 修饰的。 scala class 中所有的属性和方法都是类似 java 非static 修饰的。