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

相关推荐
Pth_you2 分钟前
Python权限问题终极解决方案
开发语言·python
Ulyanov2 分钟前
PyVista战场可视化实战(三):雷达与目标轨迹可视化
开发语言·人工智能·python·机器学习·系统架构·tkinter·gui开发
rfidunion2 分钟前
springboot+VUE+部署(9。安装MySql)
spring boot·后端·mysql
张张努力变强3 分钟前
C++ 类和对象(二):实例化、this指针、构造函数、析构函数详解
开发语言·c++
gaize12133 分钟前
云计算服务和云解决方案-阿里云
开发语言·php
J_liaty9 分钟前
Spring Boot整合Shiro实现权限认证
java·spring boot·后端·shiro
花间相见11 分钟前
【JAVA开发】—— Git常用操作
java·开发语言·git
坏柠11 分钟前
ESP32-S3 的 I²C:从“能连设备”到“工程上用得顺”
c语言·开发语言
Swift社区12 分钟前
Python 图片验证码库推荐与实践指南
开发语言·python
进击的小头12 分钟前
C语言实现设计模式的核心基石
c语言·开发语言·设计模式