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

相关推荐
季明洵3 小时前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
小小张说故事3 小时前
BeautifulSoup:Python网页解析的优雅利器
后端·爬虫·python
墨雪不会编程3 小时前
C++之【深入理解Vector】三部曲最终章
开发语言·c++
怒放吧德德3 小时前
后端 Mock 实战:Spring Boot 3 实现入站 & 出站接口模拟
java·后端·设计
浅念-4 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
biyezuopinvip4 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
UrbanJazzerati4 小时前
Python编程基础:类(class)和构造函数
后端·面试
小宋10214 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
楚兴4 小时前
MacBook M1 安装 OpenClaw 完整指南
人工智能·后端
一晌小贪欢4 小时前
Python 爬虫进阶:如何利用反射机制破解常见反爬策略
开发语言·爬虫·python·python爬虫·数据爬虫·爬虫python