17_Scala面向对象高阶功能

文章目录

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

相关推荐
Asthenia041210 分钟前
使用 PARTITION BY 和 RANK/DENSE_RANK 查询部门内薪资 Top 2
后端
狄加山67519 分钟前
Qt模型-视图架构
开发语言·qt
Aphelios38031 分钟前
TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
java·开发语言·前端·javascript·ecmascript·todo
odoo中国42 分钟前
Python 深度学习实战 第1章 什么是深度学习&代码示例
开发语言·python·深度学习
pumpkin845141 小时前
Rust 是如何层层防错的
开发语言·rust
星辰瑞云1 小时前
scala-集合3
开发语言·后端·scala
无名之逆1 小时前
[特殊字符] Hyperlane:为现代Web服务打造的高性能Rust文件上传解决方案
服务器·开发语言·前端·网络·后端·http·rust
牛角挣扎录1 小时前
攻克慢SQL:24小时解决30条慢SQL的实现方法
后端
studyer_domi1 小时前
Matlab 调制信号和fft变换
开发语言·计算机视觉·matlab
_yingty_1 小时前
Go语言入门-反射4(动态构建类型)
开发语言·笔记·后端·golang