1、面向对象概述
java:
封装:属性、方法封装到类中
User:int id,String name,Date birthday
继承:
多态:
2、类的定义与使用
def main(args:Array[String]):Unit={
val person = new People()
person.name = "Messi"
//person.age=30 //会报错,因为是val,没有setter方法,只有getter方法
println(person.name + " .. " +person.age)
person.eat
person.watchFootbal("barcelona")
person.printInfo
//println(person.gender) 会报错,因为gender被private【this】修饰
}
class People{
var name:String = ""
val age:Int = 10
private [this] val gender = "male"
def printInfo():Unit = {
println("gender: "+ gender)
}
def eat():String = {
name + "eating"
}
def watchFootball(teamName: String): Unit={
println(name + " is watching match of " + teamName)
}
}
3、构造器
object ConstructorApp{
main{
val person = new Person("zhangsan",30)
val person2 = new Person("ting",18,"M")
}
}
//主构造器,跟在类名后面的(val name:String, val age:Int)叫做主构造器
class Person(val name:String, val age:Int){
println("Person enter...")
val gender:String = _
//附属构造器,
def this(name:String,age:Int,gender:String){
this(name,age) //附属构造器的第一行代码必须要调用主构造器或者其他附属构造器
this.gender = gender
}
def eat()="eat"
}
4、继承与重写
main{
val student = new Student("messi",18,"Math")
}
class Student(name:String, age:Int,val major:String) extends Person(name,age){
//子类特有的参数必须写val或var,不然会报错
//先调用父类构造器,再调用子类构造器
override def eat()="override def eat"
}
5、抽象类
类的一个或者多个方法没有完整的实现(只有定义,没有实现)
main{
val student = new Student2()
println(student.name+student.age)
}
abstract class Person2{
def speak
val name:String
val age:Int
}
class Student2 extends Person2{
override def speak: Unit={
println("speak")
}
override val name:String = "messi"
override val age:Int = 18
}
6、伴生类与伴生对象
//如果有一个class,还有一个与class同名的object
//那么就称这个objcet是class的伴生对象,class是object的伴生类
//伴生类
class ApplyTest{
}
//伴生对象
object ApplyTest{
}
7、apply
object{
main{
for(i<-1 to 10){
ApplyTest.incr
}
println(AppkyTest.count) //10, 说明object本身就是一个单例对象
val b = ApplyTest() //==>Object.apply
val c = new ApplyTest() //
c() // ===>class.apply
//类名() ==> Object.apply
//对象() ==> Class.apply
}
}
//伴生类
class ApplyTest{
def apply()={
在objcet中的apply中new class
new ApplyTest
}
}
//伴生对象
object ApplyTest{
var count = 0
def incr = {
count+=1
}
//最佳实践,在Object的apply方法中去new Class
def apply():ApplyTest={
在objcet中的apply中new class
new ApplyTest
}
}
8、case class
//通常用在模式匹配
main{
pintln(Dog("wangcai").name)
}
//case class 不用new
case class Dog(name:String)
9、trait
相当于接口
xxx extends ATrait with BTrait with ...