scala之面向对象基础

面向对象基础

1、类

1.1、基本语法

[修饰符] class 类名 {
   类体
} 

1.2、注意事项

  1. scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
  2. 一个Scala源文件可以包含多个类.,而且默认都是public


2、属性/成员变量(详情见5.6构造器参数)

  1. 属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [:类型] = 属性值
  2. 属性的定义类型可以为任意类型,包含值类型或引用类型
  3. Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略
  4. 如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型.
  5. 如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值.
private var age:Int = _


3、创建对象

3.1、如何创建对象

  1. 如果我们不希望改变对象的引用(即:内存地址), 应该声明为val 性质的,否则声明为var, scala设计者推荐使用val ,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用
  1. scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new 对象类型有继承关系即多态时,就必须写。
package com.nuc.oop

object CreateObj {      
  def main(args: Array[String]): Unit = {
    val emp = new Emp // emp 类型就是Emp
    //如果我们希望将子类对象,交给父类的引用,这时就需要写上类型
    val emp2: Person = new Emp

  }
}

class Person {

}

class Emp extends Person {

}

3.2、创建对象的流程分析

  1. 加载类的信息(属性信息,方法信息)

  2. 在内存中(堆)开辟空间

  3. 使用父类的构造器(主和辅助)进行初始

  4. 使用主构造器对属性进行初始化 【age:90, naem nul】

  5. 使用辅助构造器对属性进行初始化 【 age:20, naem 小倩 】

  6. 将开辟的对象的地址赋给 p这个引用

class Person {
  var age: Short = 90
  var name: String = _
0
  def this(n: String, a: Int) {
    this()
    this.name = n
    this.age = a
  }}
var p : Person = new Person("小倩",20)



4、scala方法(详情见函数)

4.1、语法

def 方法名(参数列表) [:返回值类型] = { 
	方法体
}

4.2、示例

 def student(n:Int): Unit ={
    n
  }


5、scala构造器

5.1、scala构造器的介绍

  1. 和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即scala中构造器也支持重载)

  2. Scala类的构造器包括: 主构造器 和 辅助构造器(主构造器只能有一个,辅构造器可以有多个)

5.2、scala构造器的基本语法

class 类名(形参列表) {  // 主构造器
   // 类体
   def  this(形参列表) {  // 辅助构造器
   }
   def  this(形参列表) {  //辅助构造器可以有多个...
   }
} 
//1. 辅助构造器 函数的名称this, 可以有多个,编译器通过不同参数来区分.

5.3、示例

构造器的执行顺序和java一样。

①先执行主构造器

②再执行调用的辅助构造器

package com.nuc.constructor

object ConDemo01 {
  def main(args: Array[String]): Unit = {
//    val p1 = new Person("jack", 20)
//    println(p1)
//
//    val a = new A
//    val a2 = new A()

    //下面这句话就会调用def this(name:String)
    val p2 = new Person("tom")
    println(p2)
  }
}

//构造器的快速入门
//创建Person对象的同时初始化对象的age属性值和name属性值
class Person(inName:String,inAge:Int) {
  var name: String = inName
  var age: Int = inAge
  age += 10
  println("~~~~~~~~~~")

  //重写了toString,便于输出对象的信息
  override def toString: String = {
    "name=" + this.name + "\t age" + this.age
  }

  println("ok~~~~~")
  println("age=" + age)

  def this(name:String) {
    //辅助构造器,必须在第一行显式调用主构造器(可以是直接,也可以是间接)
    this("jack", 10)
    //this
    this.name = name //重新赋值
  }
}

class A() {

}

5.4、常用示例(总结)

object Demo7 {

  def main(args: Array[String]): Unit = {
    val b1 = new BB()
    println(b1)
    val b2 = new BB("张三")
    println(b2)
  }

}
class BB{

  var name:String = _


  override def toString: String = {
    name
  }


  def this(name:String){
    this
    this.name = name;
  }

}

5.5、构造器注意事项

1) Scala构造器作用是完成对新对象的初始化,构造器没有返回值。
2) 主构造器的声明直接放置于类名之后 [反编译]
3) 主构造器会执行类定义中的所有语句,这里可以体会到Scala的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别
4) 如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略
5) 辅助构造器名称为this(这个和Java是不一样的),多个辅助构造器通过不同参数列表进行区分, 在底层就是构造器重载。
6) 如果想让主构造器变成私有的,可以在()之前加上private,这样用户只能通过辅助构造器来构造对象了
7) 辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)

5.6、构造器参数

  1. Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量。

  2. 如果参数使用val,那么Scala会将参数作为类的私有的只读属性使用

  3. 如果参数使用var,那么那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写

package com.nuc.constructor

object ConDemo04 {
  def main(args: Array[String]): Unit = {

    val worker = new Worker("smith")
    worker.name //不能访问 inName

    val worker2 = new Worker2("smith2")
    worker2.inName  //可以访问 inName
    println("hello!")

    val worker3 = new Worker3("jack")
    worker3.inName = "mary"
    println(worker3.inName)
  }
}

//1. 如果 主构造器是Worker(inName: String) ,那么  inName就是一个局部变量

class Worker(inName: String) {
  var name = inName
}
//. 如果 主构造器是Worker2(val inName: String) ,那么  inName就是Worker2的一个private的只读属性
class Worker2(val inName: String) {
  var name = inName
}

// 如果 主构造器是Worker3(var inName: String) ,那么  inName就是Worker3的一个
// 一个private 的可以读写属性
class Worker3(var inName: String) {
  var name = inName
}



6、Bean属性

6.1、定义

JavaBeans规范定义了Java的属性是像getXxx()和setXxx()的方法。许多Java工具(框架)都依赖这个命名习惯。为了Java的互操作性。将Scala字段加@BeanProperty时,这样会自动生成规范的 setXxx/getXxx 方法。这时可以使用对象.setXxx() 和 对象.getXxx() 来调用属性

注意:给某个属性加入@BeanPropetry注解后,会生成getXXX和setXXX的方法

并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存

6.2、示例

package com.nuc.constructor

import scala.beans.BeanProperty

object BeanPropertDemo {
  def main(args: Array[String]): Unit = {
    val car = new Car
    car.name = "宝马"
    println(car.name)

    //使用 @BeanProperty 自动生成 getXxx 和 setXxx
    car.setName("奔驰")
    println(car.getName())
  }
}


class Car {
  @BeanProperty var name: String = null
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值