16_Scala面向对象编程_函数

本文详细介绍了Scala中的伴生对象使用、不同构造方式(包括对象获取、new、apply和有参构造)、以及私有化构造和辅助构造的区别。内容涵盖了类和伴生对象的访问、函数转换、对象创建策略和面向函数式编程特性。
摘要由CSDN通过智能技术生成

1.声明Scala函数

抛出问题:创建两个类,互为伴生对象,当我new时候,然后调用,我调用的是谁?

object Solution {
  def main(args: Array[String]): Unit = {
    var user=  new User

    user.test()   //class test

  }


  class User{
    def test(): Unit = {
      println("class test")
    }

  }
  object User{
    def test(): Unit = {
      println("object test")

    }
  }
}

在这里插入图片描述

2.访问伴生对象

伴生对象章节已经讲过;伴生对象中放的一般都是静态方法或属性或工具类,访问的话直接 类名.方法即可

User.test()   //静态方式访问,直接类.方法

且可以继续简化

User test	  //也就是伴生对象的访问方式

3.空对象直接用的方法

object类中的方法都可以使用;

在这里插入图片描述

scala提供的一些方法都可以使用

在这里插入图片描述

重点

//    判断是否是父类实例
    println(user.isInstanceOf[User])

//      将普通对象 转化 目标对象
    val value = user.asInstanceOf[Object]
    println(value)    //_15Scala方法.Solution$User@19bb089b     //至此不能使用user的方法了

4.构造对象

–通过object获取单例对象

//    1.1直接使用object构建对象
    println(Solution01)   

//_15Scala方法.Solution01$@19bb089b 打印的就是一个对象地址,直接可以拿来使用

在这里插入图片描述

反编译以后得到的是静态代码块直接实例化对象且仅有一份,私有化Instance方法,创建一个公共的本类型的私有化对象;通过类名访问;

–直接new

//    1.2直接new
val user = new User

–scala独有apply()方式

//    1.3Scala独有方式      object伴生对象,且对象中存在apply方法即可使用      繁琐
val user1 = User.apply() //如果

在这里插入图片描述

目前我的编译器已经无法动态识别apply()
不建议使用

在这里插入图片描述

在这里插入图片描述

最终结果:

在这里插入图片描述

–scala有参构造

概念:

scala默认是无参构造

如果给类传递任何参数,scala会默认抹杀掉任何构造方法仅保留一份构造方法,与类的声明一致;

//    --有参构造
    val zhangsan = new EMP("sad");
//    val zhangsan1 = new EMP   //构造方式不对

    class EMP(name:String){}

–scala构造方法两大类

  • 主构造 -> 完成类的初始化

    • 辅助构造有重载概念,主构造没有
  • 辅构造 -> 完成类的辅助功能,属性赋值

    • 辅构造方法必须直接或见解调用主构造方法
    • 使用this声明
    • 辅助构造有重载概念,主构造没有

使用辅构造如下

class FuGenerate(){
  //定义一下空构造的内容
  println("空构造方法体")

  def this(name:String){
    this()  //必须直接或间接调用主构造方法    FuGenerate()    调用一次执行空构造
    println("辅助构造完成")
  }
}

上述代码主构造为

FuGenerate()

scala中函数就是方法

辅助构造方法甚至可以多个

在这里插入图片描述

上述第二个辅助构造方法使间接调用主构造器 ,也就是先调用name:String		然后通过第一个辅助构造方法调用this()	主构造方法

多个辅助构造形参内容不能重

在这里插入图片描述

不使用辅助构造和使用辅助构造区别

在这里插入图片描述

在这里插入图片描述

主构造函数属性使用this访问,辅助构造函数属性使用属性名访问

在这里插入图片描述

主构造函数的形参就是 类的属性;直接拿this关键字访问即可;

主构造私有化构建对象

主构造私有化,形参前假如private

在这里插入图片描述

一旦私有化,子类无法进行访问,原因是无法显示的调用父类构造器

私有化后如何创建对象

–使用辅助构造器

在这里插入图片描述

使用辅助构造器,传入name,再将name赋值给主构造

–使用伴生对象(伴生对象可以访问类中私有内容)

在这里插入图片描述

小结

1.类和伴生对象访问方式	
        类访问

        实例化对象user,通过实例化对象访问

        伴生对象访问

        直接类名访问
        
2.scala函数在编译的时候都会发生改变与定义有所不同,例如eq 编译阶段都会编程equals,但是方法m编译阶段不会发生改变例如equals

3.scala的构建对象的方式
    --直接new       scala中独有方式  val user = User.apply()
    --反射构建
    --clone
    --反序列化      磁盘中对象写入到内存构建对象
    --scala使用object构建单例对象
    
4.注意scala中类名和方法名相同但是并不代表其是构造方法;
5.scala是强数据类型,完全面向函数式编程语言   ==>   声明类 == 声明函数

6.如果给类传递任何参数,scala会默认抹杀掉任何构造方法仅保留一份构造方法,与类的声明一致;

7.使用辅助构造使代码更加灵活,形式上和Java一致
--必须调用主构造,会执行方法体(类中代码语句)所有
--this声明
--可以多个

在这里插入图片描述

类{}包的是函数体,甚至可以直接println,和Java类中五大成分不同。函数体new几次执行几次;

Appendix

对象创建在实例化之后会发生如下情况

在这里插入图片描述

在这里插入图片描述

为了避免此情况,请尽可能将类放的远一点,以至于先定义 变量,后实例化对象赋值;

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值