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

相关推荐
星火开发设计4 分钟前
类模板:实现通用数据结构的基础
java·开发语言·数据结构·c++·html·知识
bugcome_com4 分钟前
# C# 变量作用域详解
开发语言·c#
阿里嘎多学长5 分钟前
2026-02-13 GitHub 热点项目精选
开发语言·程序员·github·代码托管
汽车软件工程师00114 分钟前
vector autosar配置一个CAN接收报文,RTE层发现并未接收到信号,怎样查这个问题
开发语言·autosar
xuzhiqiang072423 分钟前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
寻寻觅觅☆26 分钟前
东华OJ-基础题-122-循环数(C++)-难度难
开发语言·c++
谭光志35 分钟前
OpenClaw 安装与运行教程
前端·后端·ai编程
Zachery Pole1 小时前
JAVA_04_判断与循环
java·开发语言
懒惰成性的1 小时前
11.Java的String类
java·开发语言
金牌归来发现妻女流落街头1 小时前
【Spring Boot 中 ResponseEntity 用法全解析】
spring boot·后端