佛家有云:一花一世界,一叶一菩提,而我们所学的Java就是一个以面向对象为基础的程序语言,在Java中是万物皆为对象,但是在Scala中万事万物皆为对象,由此引出了Scala面向对象编程,接下来,让我带你们走进Scala对象中

1.类与对象

(1)Scala语言是面向对象的

  • Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型 ,null,静态方法等。
  • Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言,即在Scala中,一切皆为对象。
  • 学习时可结合java面向对象的思想来学习

(2)类和对象的区别和联系

  • 类是抽象的,概念的,代表一类事物,比如人类,猫类..
  • 对象是具体的,实际的,代表一个具体事物
  • 类是对象的模板,对象是类的一个个体,对应一个实例
  • Scala中类和对象的区别和联系 和 Java是一样的。

(3) 如何定义类

基本语法[修饰符] class 类名 {类体
} 

(4)如何创建对象

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

(5)Scala对象的内存布局

(6) 定义类的注意事项

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

2.属性

(1) 基本介绍

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

(2)注意事项和细节说明

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

类型

_ 对应的值

Byte Short Int Long

0

Float Double

0.0

String 和 引用类型

null

Boolean

false

  • 不同对象的属性是独立,互不影响,一个对象对属性的更改,不影响另外一 个,这点和java完全一样

3.方法

(1)基本说明

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

(2)基本语法

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

(3)方法的调用机制原理

  • 当我们scala开始执行时,先在栈区开辟一个main栈。main栈是最后被销毁
  • 当scala程序在执行到一个方法时,总会开一个新的栈。
  • 每个栈是独立的空间,变量(基本数据类型)是独立的,相互不影响(引用类型除外)
  • 当方法执行完毕后,该方法开辟的栈就会被jvm机回收。

4.构造器

(1)回顾-Java构造器基本语法

[修饰符] 方法名(参数列表){构造方法体
}

(2)回顾-Java构造器的特点

  • 在Java中一个类可以定义多个不同的构造方法,构造方法重载
  • 如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造器),比如 Person (){}
  • 一旦定义了自己的构造方法(构造器),默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下,即:  Person(){};

(3)回顾-Java构造器

  • 在前面定义的Person类中添加两个构造器:
  • 第一个无参构造器:利用构造器设置所有人的age属性初始值都为18
  • 第二个带name和age两个参数的构造器:使得每次创建Person对象的同时初始化对象的age属性值和name属性值。
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;}}

(4)基本介绍

构造器(constructor)又叫构造方法,是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。

(5)Scala构造器的介绍

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

(6)  Scala构造器的基本语法

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

(7)Scala构造器注意事项和细节

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

5.属性高级

(1)构造器参数

  • Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量。
  • 如果参数使用val关键字声明,那么Scala会将参数作为类的私有的只读属性使用
  • 如果参数使用var关键字声明,那么那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写。

(2)Bean属性

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

(3)说明

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

import scala.beans.BeanProperty
class Car {@BeanProperty var name: String = null
}

(4)对象创建的流程分析

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

流程分析

  1. 加载类的信息(属性信息,方法信息)
  2. 在内存中(堆)开辟空间
  3. 使用父类的构造器(主和辅助)进行初始化
  4. 使用主构造器对属性进行初始化 【age:90, naem nul】
  5. 使用辅助构造器对属性进行初始化 【 age:20, naem 小倩 】
  6. 将开辟的对象的地址赋给 p这个引用

Scala核心编程 第六章—Scala面向对象编程(一)相关推荐

  1. python归一化 增大差异_简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群 群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性pr ...

  2. 《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)

    第五章 Kotlin 面向对象编程(OOP) 正式上架:<Kotlin极简教程>Official on shelves: Kotlin Programming minimalist tut ...

  3. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  4. 第13章 面向对象编程

    第13章 面向对象编程 JavaScript是基于原型继承的机制来实现面向对象编程的.例如,对象直接量继承于Object.prototype,函数对象继承于Function.prototype,而pr ...

  5. Python Qt GUI快速编程第六章代码分析

    这是我敲的Python Qt Gui快速编程第六章上的代码,以后可能要用到其中一些,如果忘记了就来这里看看. #coding=utf-8 #d import os import platform im ...

  6. c语言编程作业最大整数问题,C语言编程第六章作业答案.doc

    C语言编程第六章作业答案 1. 输入两个正整数m和n,求其最大公约数和最小公倍数. 辗除法--辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法. ...

  7. 【编程实践】第二章 C++面向对象编程《C++程序设计语言》 / By 禅与计算机程序设计艺术ChatGPT

    [编程实践]第二章 C++面向对象编程<C++程序设计语言> / By 禅与计算机程序设计艺术&ChatGPT 第二章 C++面向对象编程 在C++中,面向对象编程主要通过类和对象 ...

  8. java学习笔记-第七章:面向对象编程(基础部分)

    第七章:面向对象编程(基础部分) 总体内容 类与对象 引出类与对象 类与对象概述 类与对象的关系示意图 属性概念及其细节 类与对象快速入门案例 对象内存布局 类与对象内存分配机制 引申:java内存的 ...

  9. Java_第08章_面向对象编程(高级)

    第08章_面向对象编程(高级) 本章专题与脉络 1. 关键字:static 回顾类中的实例变量(即非static的成员变量) class Circle{private double radius;pu ...

最新文章

  1. mysql try catch_C# try catch finally:异常处理
  2. BS-XX-042 基于SSM实现人事管理系统
  3. public void DeleteT(ListT EntityList) where T : class, new() 这是什么意思
  4. [推荐]国外的Windows Mobile资源站点
  5. Java SPI机制分析
  6. python卸载模块的方法汇总_Python卸载模块的方法汇总
  7. Amazon:大数据分析技能,你满足几条?
  8. 由return联想到的
  9. 再多迷茫,不如静下来好好学习
  10. 游戏软件性能测试怎么做?常规测试知识要点总结
  11. mybatis SqlMapConfig.xml environments
  12. java环境变量大小写_java环境变量配置
  13. 台式计算机颜色如何矫正,显示器颜色校正,详细教您怎么校准显示器颜色
  14. Excel数据分析工具安装步骤
  15. native内存泄漏分析
  16. Uniapp进行APP打包——iOS 系统
  17. [web前端] 去哪儿网前端架构师司徒正美:如何挑选适合的前端框架?
  18. 用devc++表白_【吉利表白墙】19级倪yl,风吹起如花般破碎的流年,而你的笑容摇晃摇晃,成为我命途中最美的点缀...
  19. 【】每日360题,2019.11.05日19点财会类考试习题答案
  20. 刻在祁连山上的艺术二维码,真的太酷了11

热门文章

  1. markdown写作模板
  2. 从单机架构------》到现在复杂的微服务,分布式,集群,云平台途中是遇到了什么问题,又如何解决的?
  3. python代码手机壁纸_爬虫 抓取王者荣耀所有英雄皮肤高清壁纸+超强注
  4. 电脑蓝屏0x0000007B
  5. cv::watershed(img,mask)
  6. 图像处理 手写体英文字母的目标检测与识别 实验报告
  7. 真静态与伪静态的区别,伪静态的实现原理及简单使用
  8. STM32F103C8T6+ATK-ESP8266连接原子云
  9. 学习html/css基础的重点笔记
  10. DL之Transformer:Transformer的简介(优缺点/架构详解,基于Transformer的系列架构对比分析)、使用方法(NLP领域/CV领域)、案例应用之详细攻略