6.1 基本介绍

  6.1.1 Scala语言是面向对象的

      1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等

      2) Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala时纯粹的面相对象的语言,即在Scala中,一切皆为对象

      3) 在面向对象的学习过程中可以对比着Java语言学习

  6.1.2 类和对象的区别和联系

      1) 类是抽象的,概念的代表一类事物,比如人类,猫类...

      2) 对象是具体的,实际的,代表一个具体事物

      3) 类是对象的模版,对象是类的一个个体,对应一个实例

      4) Scala中类和对象的区别和联系和Java是一样的

  6.1.3 如何定义类

      -基本语法

        [修饰符] class 类名 {

          类体

        }

      -定义类的注意事项

        1) Scala语法中,类并不声明为public,所有这些类都具有公有可见性(默认就是public)

        2) 一个Scala源文件可以包含多个类,而且默认都是public

  6.1.4 属性

      -基本介绍

        属性是类的一个组成部分,一般是值数据类型,也可是引用类型

      -案例演示

class Dog {
var name = "Tom"
var lover = new Fish } class Fish { }

  6.1.5 属性/成员变量

      -注意事项和细节说明

       1) 属性的定义语法同变量,示例:[访问修饰符] var 属性名称 [: 类型] = 属性值

       2) 属性的定义类型可以为任意类型,包含值类型或引用类型

       3) Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)

       4) 如果赋值为null,则一定要加类型,因为不加类型,那么该属性的类型就是Null类型

       5) 如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值

       

class A {
var a1: String = _ //null
var a2: Byte = _ // 0
var a3: Double = _ // 0.0
var a4: Boolean = _ // false
}

  6.1.6 属性的高级部分

      说明:属性的高级部分和构造器(构造方法/函数)相关,具体介绍将在构造器部分详解

  6.1.7 如何创建对象

      -基本语法

      val | var 对象名 [: 类型] = new 类型()

      -说明

      1) 如果我们不希望改变对象的引用(即:内存地址),应该声明为val性质的,否则声明为var,Scala设计者推荐使用val,因为一般来说,在程序中,我们只是改变对象属性的值,而不是改变对象的引用

      2) Scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new对象类型有继承关系时即多态,就必须写了

      3) 案例演示

object boke_demo01 {

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

  6.1.8 类和对象的内存分配机制

      -案例演示

object boke_demo01 {

  def main(args: Array[String]): Unit = {
val p1 = new Person2
p1.name = "jack"
p1.age = 10 val p2 = p1
println(p1 == p2) // true
p1.name = "tom"
println("p2.name=" + p2.name) // p2.name=tom
} } class Person2 {
var name = ""
var age: Int = _ //如果是用 _ 方式给默认值,则属性必须指定类型
}

      -案例演示对应的内存布局图

6.2 方法

  6.2.1 基本说明

      Scala中的方法其实就是函数,声明规则请参考函数式编程中的函数声明

  6.2.2 基本语法

      def 方法名[: 返回值类型] = {

        方法体

      }

  6.2.3 方法案例演示

      给Cat类添加cal方法,可以计算两个数的和

object MethodDemo01 {
def main(args: Array[String]): Unit = {
val cat = new Cat
println(cat.cal(10, 20))
}
} class Cat {
private var sal: Double = _
var food: String = _ //方法
def cal(n1: Int, n2: Int): Int = {
return n1 + n2
}
}

6.3 构造器

  6.3.1 看一个需求

      我们来看一个需求:前面我们在创建Person的对象时,是先把一个对象创建好后,再给他的姓名和年龄属性赋值,如果现在要求,在创建Person类对象时,就直接制定这个对象的姓名和年龄,该怎么做?这时就可以使用构造方法/构造器

  6.3.2 回顾-Java构造器基本语法

      [修饰符] 方法名 (参数列表) {

        构造方法体

      }

  6.3.3 回顾-Java构造器的特点

      1) 在Java中一个类可以定义多个不同的构造方法,构造方法重载

      2) 如果程序员没有定义构造方法,系统会自动给类生成一个无参构造方法(也叫默认构造器),比如:Person(){}

      3) 一旦定义了自己的构造方法(构造器),默认的构造方法就覆盖了,就不能使用默认的无参构造方法,除非显示的定义一下,即:Person(){}

  6.3.4 Java构造器案例

      在前面定义的Person类中添加两个构造器

      第一个无参构造器:利用构造器设置所有人的age属性初始值都为18

      第二个带name和age两个参数的构造器:使得每次创建Person对象的同时初始化对象的name属性值和age属性值

public class Person {

    public String name;
public int age; public String getInfo() {
return name + "\t" + age;
} public Person() {
age = 18;
} public Person(String name, int age) {
this.name = name;
this.age = age;
} }

  6.3.5 Scala构造器的介绍

      和Java一样,Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法(即Scala中构造器也支持重载),Scala类的构造器包括:主构造器和辅助构造器

  6.3.6 Scala构造器的基本语法

      class 类名(形参列表) {  //主构造器

        def this(形参列表){  //辅助构造器

        }

        def this(形参列表){  //辅助构造器可以有多个...

        }

      }

      辅助构造器的函数名this,可以有多个,编译器通过不同参数来区分

  6.3.7 Scala构造器的快速入门

      创建Person对象的同时初始化对象的name属性和age属性,案例演示

object boke_demo01 {

  def main(args: Array[String]): Unit = {
// val p1 = new Person("Jack", 20)
// println(p1) //下面这句话就会调用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 //重新赋值
}
}

  6.3.8 Scala构造器注意事项和细节说明

      1) Scala构造器的作用是完成对新对象的初始化,构造器没有返回值

      2) 主构造器的声明直接放置于类名之后

      3) 主构造器会执行类定义中的所有语句,这里可以体会到Scala的函数式编程和面向对象编程融合在一起,即:构造器也是方法(函数),传递参数和使用方法和前面的函数部分内容没有区别

      4) 如果主构造器没有参数,小括号可以省略,构建对象时调用的构造方法的小括号也可以省略

class AA {

}

val a = new AA
val b = new AA()

      5) 辅助构造器名称为this(这个和Java是不一样的),多个辅助构造器通过不同参数列表进行区分,在底层就是构造器重载

object boke_demo01 {

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

    val p1 = new Person2("jack")
p1.showInfo()
}
} //定义了一个Person类
//Person 有几个构造器 4
class Person2 private() {
var name: String = _
var age: Int = _ def this(name: String) {
//辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑
//而且需要放在辅助构造器的第一行[这点和java一样,java中一个构造器要调用同类的其它构造器,也需要放在第一行]
this() //直接调用主构造器
this.name = name
} //辅助构造器
def this(name: String, age: Int) {
this() //直接调用主构造器
this.name = name
this.age = age
} def this(age: Int) {
this("匿名") //调用主构造器,因为 def this(name : String) 中调用了主构造器!
this.age = age
} def showInfo(): Unit = {
println("person信息如下:")
println("name=" + this.name)
println("age=" + this.age)
}
}

      6) 如果想要主构造器编程私有的,可以在()之前加上private,这样用户只能通过辅助构造器来构造对象了,比如: class Person2 private(){}

      7) 辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)

6.4 属性高级

      对属性的内容做一个加强

  6.4.1 构造器参数

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

      2) 如果参数使用val关键字声明,那么Scala会将参数作为类的私有只读属性使用

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

      4) 案例演示

object boke_demo01 {

  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)
}
} //如果 主构造器是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.4.2 Bean属性

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

      注意:给某个属性加入@BeanPropetry注解后,会生成getXxx和setXxx的方法,并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存

import scala.beans.BeanProperty

object boke_demo01 {

  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
}

6.5 Scala对象创建的流程分析

  6.5.1 看一个案例

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

  6.5.2 流程分析(面试题-写出)

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

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

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

      4) 使用主构造器对属性进行初始化[age:90, name:null]

      5) 使用辅助构造器对属性进行初始化[age:20, name:小倩]

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

6. Scala面向对象编程(基础部分)的更多相关文章

  1. 2.3 Scala面向对象编程基础

    一.类 1.类的定义 Unit表示什么都不返回 方法体最后一句的值,就是方法的返回值. 2.类成员的可见性 3.方法的定义方式 定义方法的时候加圆括号,调用时可以加圆括号c.getValue()也可以 ...

  2. 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础

    第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...

  3. 第二章 Matlab面向对象编程基础

    DeepLab是一款基于Matlab面向对象编程的深度学习工具箱,所以了解Matlab面向对象编程的特点是必要的.笔者在做Matlab面向对象编程的时候发现无论是互联网上还是书店里卖的各式Matlab ...

  4. [.net 面向对象编程基础] (1) 开篇

    [.net 面向对象编程基础] (1)开篇 使用.net进行面向对象编程也有好长一段时间了,整天都忙于赶项目,完成项目任务之中.最近偶有闲暇,看了项目组中的同学写的代码,感慨颇深.感觉除了定义个类,就 ...

  5. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  6. [.net 面向对象编程基础] (2) 关于面向对象编程

    [.net 面向对象编程基础]  (2)  关于面向对象编程 首先是,面向对象编程英文 Object-Oriented Programming 简称 OOP 通俗来说,就是 针对对象编程的意思 那么问 ...

  7. [.net 面向对象编程基础] (3) 基础中的基础——数据类型

    [.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型 ...

  8. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  9. [.net 面向对象编程基础] (5) 基础中的基础——变量和常量

    [.net面向对象编程基础]  (5) 基础中的基础——变量和常量 1.常量:在编译时其值能够确定,并且程序运行过程中值不发生变化的量. 通俗来说,就是定义一个不能改变值的量.既然不能变动值,那就必须 ...

随机推荐

  1. 剑指Offer编程题2——替换空格

    剑指Offer编程题2——替换空格 题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happ ...

  2. POJ 3347 Kadj Squares (计算几何)

    题目: Description In this problem, you are given a sequence S1, S2, ..., Sn of squares of different si ...

  3. 【转】浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法. ...

  4. gcc 8.2.1 / MCF thread 简介

    gcc 8.2.1 下载 地址 https://gcc-mcf.lhmouse.com/ MCF threadhttps://github.lhmouse.com/ MCF thread 简介MCF ...

  5. nmap简介和使用

    文章链接:https://blog.csdn.net/m1585761297/article/details/80015726 参考链接:https://www.cnblogs.com/nmap/p/ ...

  6. Selenium API常用方法

    driver.findElements()//定位一组List元素集合 driver.findElement()//定位一个元素 driver.getTitle()//获取页面标题 driver.ge ...

  7. python开发环境_windows系统安装_错误记录

    1 安装python编译器2.7.11版本 (安装包自带pip,setuptools,依赖,会将pip,setuptools安装到自己的类库中) 配置环境变量: 配置python_home,然后加入p ...

  8. MySQL和B树的那些事

    一.零铺垫 在介绍B树之前,先来看另一棵神奇的树——二叉排序树(Binary Sort Tree),首先它是一棵树,“二叉”这个描述已经很明显了,就是树上的一根树枝开两个叉,于是递归下来就是二叉树了( ...

  9. Swift - use Array

    //数组声明 var arr0 = Array<Int>() var arr1 = Array<String>(count: 3, repeatedValue: "& ...

  10. PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度—Jason niu

    x = 1:0.01:2; y = sin(10*pi*x) ./ x; figure plot(x, y) title('绘制目标函数曲线图—Jason niu'); hold on c1 = 1. ...