文章目录
- 1.继承
-
- [1.1 构造对象时,父类对象优于子类对象](#1.1 构造对象时,父类对象优于子类对象)
- 1.2父类主构造有参数,子类必须要显示地调用父类主构造器并传值
- 2.封装
- 3.抽象
- 4.伴生对象
1.继承
--和Java一样,权限protected , public.父类定义子类用 , 仅单继承(防止钻石问题歧义)
1.1 构造对象时,父类对象优于子类对象
object Solution01 {
def main(args: Array[String]): Unit = {
// 1.1 构造对象时,父类对象优于子类对象
val s = new Stu //
/**
* person
* stu
*/
}
}
class Person{
var name :String =_
println("person")
}
class Stu extends Person {
println("stu")
}
--创建子类实例,scala会先加载父类构造器 得到person后执行子类构造器,得到stu
--构造对象时,父类对象优于子类对象。且每创建一个实例,父类会初始化一次
1.2父类主构造有参数,子类必须要显示地调用父类主构造器并传值

class Animal(name:String){}
class Cat extends Animal("cat"){}
class Cat1(name:String) extends Animal(name){}
传值方式如上述两种
2.封装
封装就是将数据和数据操作放在一起

Bean规范:属性私有化提供set/get方法
3.抽象
和Java一致,抽象方法就是被子类重写的,因此不需要定义方法体;
3.1抽象定义
abstract class AbstractDemo{
def test():Unit
}
3.2子类继承抽象类
abstract class AbstractDemo{
def test():Unit
}
// 子类继承抽象类
class yy extends AbstractDemo{
override def test():Unit={
}
}

3.3抽象属性
scala中抽象属性
--抽象类中所有属性都可以不初始化值;
--如果初始化值,var类型在子类直接修改,val类型在子类进行override重写即可重新赋值
--var没有重写操作
--子类一旦继承,必须对其属性进行赋值操作

var,val变量可以在抽象类中不进行初始化,但是继承抽象类的类必须进行初始化赋值操作,必须;
4.伴生对象
4.1创建类和伴生对象

class User{
// def apply(): User = new User()
println("class user")
}
object User{
def apply(): User = new User()
println("object user")
}
4.2调用


val user1 = new User() //执行类的构造方法,直接完成类的初始化操作
val user11 = new User //简化原则
println("===========================")
val suer2 = User //伴生对象访问方法
println("===========================")
val user3 = User.apply //apply由编译器动态识别,不论apply写入到class 或是object中,最终调用的都是User类
println("===========================")
val user4 = User() //因为是动态识别,因此apply可省
结果

小结:
--有得有失,得到了抽象方法的能力,失去了创建对象的能力;
--抽象方法省略方法体
--子类重写父类方法,前面加override修饰符,非上面
--调用方法遵循就近原则
--var,val变量可以在抽象类中不进行初始化,但是继承抽象类的类必须进行初始化赋值操作,必须
--占位符???
--抽象类中所有属性都可以不初始化值;
--如果初始化值,var类型在子类直接修改,val类型在子类进行override重写即可重新赋值
--var没有重写操作
--子类一旦继承,必须对其属性进行赋值操作
--对象伴生对象访问区别仅在于有没有new