scala详解之面向对象

1.类和对象详解

1.1 组成结构

  1. 构造函数
  2. 成员变量
  3. 成员方法(函数)
  4. 局部变量
  5. 代码块  

1.2 构造器的定义:

每个类都有一个主构造器,这个构造器和类定义"交织"在一起类名后面的内容就是主构造器,如果参数列表为空的话,()可以省略,scala的类有且仅有一个主构造器,要想提供更加丰富的构造器,就需要使用辅助构造器,辅助构造器是可选的,它们叫做this

注意:主构造器会执行类定义中的所有语句

1.3   构造器的总结

1,有两类构造器:主构造器,辅助构造器

2,构造器的定义位置,主构造器和类交织在一起,class Student2(val name: String, var age: Int)

3辅助构造器是一个特殊的方法,定义在类中 def this(name:String,age:Int,gender:String)

4,辅助构造器,第一行必须调用主构造器(或者其他的辅助构造器)

5,辅助构造器的参数不能和主构造器的参数完全一致(参数个数,参数类型,参数顺序)

6,可以定义空参的辅助构造器,但是主构造器的参数必须进行初始化赋值

7,作用域:辅助构造器的作用域,只在方法中,主构造器的作用域是类中除了成员属性和成员方法之外的所有范围(可以通过反编译查看源码)

1.4 构造器的参数说明

  1. 主构造器的参数没有使用var/val修饰 ,那么他的参数就是局部变量
  2. val修饰的构造函数的参数是类的成员私有属性 ,只读
  3. var修饰的构造函数的参数是类的私有成员属性 ,但是是可读可写的

2.成员变量

定义:定义在类中的变量称为成员变量,也可以定义在主构造器中

总结:

  • 主构造函数中使用val 和 var修饰的变量为成员变量
  • val 修饰的变量默认只有getter方法   一要初始化
  • var 修饰的变量默认有 get和set方法  直接点属性操作  使用 _ 占位可以稍后赋值
  • @BeanProperty会生成getMsg setMsg方法

3. 成员方法和成员函数

定义:在类的成员位置定义的函数或者方法是类的成员的一部分

4.局部变量

定义:定义在函数/方法的参数中 , 定义在代码块中 , 定义在流程控制的条件表达式中

注意 :

  1 局部变量都需要设置初始值

  2 局部变量的作用范围 ,定义在代码块中

5.伴生类和伴生对象

成为伴生类和伴生对象的条件:条件 1:在同一个源文件中, 条件 2:对象名和类名相同

特点:伴生对象和伴生类之间可以互相访问彼此的私有属性和私有方法

6 权限修饰符

定义:保护类成员属性不被修改

用private修饰的成员方法,不允许被其他类访问,用public修饰的属性或者方法的访问范围是本类和伴生类对象,需要注意的一点是,伴生类和伴生对象中,伴生类中的成员属性被private修饰,伴生对象可以随意访问;

scala中有更加严格的访问权限的控制:

  1. private [this] ,作用域为当前类中,伴生对象中无效
  2. private [packageName] 指定包及其子包有效

7. 特质和抽象类

什么是特质:

Trait(特质)相当于 java 的接口。比接口功能更强大。特质中可以定义属性和抽象方法和方法的实现。 Scala 的类只能够继承单一父类,但是可以实现(继承,混入)多个特质(Trait)使用的关 键字是 with 和 extends 注意:特质不能有主构造函数\

接口和类的区别:接口中不能写构造器,没有构造器,类可以写构造器,因为默认调用无参构造或者父类的构造器

7.1 动态混入

在使用的时候再实现具体的接口重写对应的抽象方法


    new AnimalDemo {
      override def eat(): Unit = {
        println("实现吃的方法")
      }

      override def jum(): Unit = {
        println("实现跳的方法")
      }
    }

8. 抽象类

在 Scala 中, 使用 abstract 修饰的类称为抽象类. 在抽象类中可以定义属性、未实现的方法

(抽象方法)和具体实现的方法。  含有抽象方法的类就是抽象类

  1. 抽象类中的属性 
  2. 抽象方法
  3. 具体实现的方法
  4. 类的单继承

9. 样例类

使用case修饰的类就是样例类

1 构造器中的参数默认是val修饰的

2 样例类会自动创建伴生对象, 同时在里面实现;的apply和unapply方法 ,创建对象的时候不用new

3 很好的支持匹配模式

4 默认实现了自己的toString , hashCode , copy , equals方法

定义一个样例类:

case class Users( var uid:Int,var name:String,var gender:String)

 

10 高阶函数

定义:

  • 函数的参数是函数的函数或者方法
  • 函数的返回值是函数的函数或者方法
  • 函数的参数和返回值都是函数的函数或者方法

高阶函数的优点:

使用高阶函数的一个原因是减少冗余的代码。比方说需要写几个方法以通过不同方式来提升员工工资,若不使用高阶函数,代码可能像这样

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值