类与对象:
- 创建类的基本语法:[修饰符] class 类名{ 类体 }
注意点:
①scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public)
②一个.scala源文件可以包含多个类 - 成员变量(属性):
①Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略
②如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型
③如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值(此时必须标明属性的类型,默认值和Java中一致) - 定义对象:
①定义对象时一般用val修饰,因为我们一般只修改对象的属性,而不修改对象的引用(地址值)
②scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new 对象类型有继承关系即多态时,则不能省略 - 类和对象的分配机制:(和Java类似)
- 构造器:
- 概述:
①scala构建对象需要调用构造器,scala中也可以有多个构造器构成重载;
②scala中构造器分为 主构造器 和 辅助构造器 - 基本语法:
class 类名(形参列表){ //主构造器
//类体
def this(){ } //空参辅助构造器
def this(形参列表){ }辅助构造器
} - 细节:
①主构造器的声明直接放置于类名之后
②主构造器会执行类定义中的所有语句,即:构造器也是方法(函数),传递参数和使用方法 和前面的函数部分内容没有区别
③如果主构造器无参数,小括号可省略,构建对象时调用的构造方法的小括号也可以省略
④辅助构造器的声明不能和主构造器的声明一致,会发生错误(即构造器名重复)
- 概述:
- 对象的属性:
①JavaBeans规范定义了Java的属性是像getXxx()和setXxx()的方法。许多Java工具(框架)都依赖这个命名习惯。为了Java的互操作性。将Scala字段加**@BeanProperty**时,这样会自动生成规范的 setXxx/getXxx 方法。这时可以使用 对象.setXxx() 和 对象.getXxx() 来调用属性。
②注意:给某个属性加入@BeanPropetry注解后,会生成getXXX和setXXX的方法
并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存。 - 对象被创建的流程:
①加载类的信息(属性,方法)
②分配内存(堆)
③调用父类的构造器
④依次调用本类的主、辅构造器
⑤返回引用
包:
-
包的特点概述:
①基本语法:package 包名
②包的三大作用(和Java一致):
1.区分相同名字的类;
2.类很多时更好地管理类;
3.控制访问范围;
③Scala中包名和源码所在的系统文件目录结构要可以不一致,但是编译后的字节码文件路径和包名会保持一致(这个工作由编译器完成)
④包名不能为关键字,不能以数字开头
⑤scala会自动引入的常用的包:【java.lang.*】【scala】【Predef】 -
包的注意事项和使用细节:
①包可以像嵌套类那样嵌套使用(包中有包)这样的好处是:程序员可以在同一个文件中,将类(class / object)、trait 创建在不同的包中,灵活性很强。
②作用域原则:可以直接向上访问。即: Scala中子包中直接访问父包中的内容, 大括号体现作用域,在子包和父包 类重名时,默认采用就近原则,如果希望指定使用某个类,则带上包名即可。
③父包要访问子包的内容时,需要import对应的类
④可以在同一个.scala文件中,声明多个并列的package(建议嵌套的pakage不要超过3层) -
包对象:
- 基本介绍:
包可以包含类、对象和特质trait,但不能包含函数/方法或变量的定义。这是Java虚拟机的局 限。为此scala提供了包对象的概念 - 包底层实现机制分析:
①当创建包对象后,在该包下生成public final class package和public final class package$
②通过 package$ 的一个静态实例(MODULE$)完成对包对象中的属性和方法的调用 - 每层包只能有一个包对象
- 示例:
- 基本介绍:
package com.bigdata{
//每个包都可以有一个包对象。你需要在父包(com.bigdata)中定义它,且名称与子包一样。
package object scala {
var name = "Curry"
def sayHi(): Unit = {
println("Hi Stephen~~~")
}
}
package scala {
class Test {
def test() : Unit ={
//这里的name就是包对象scala中声明的name
println(name)
sayHi()//这个sayHi 就是包对象scala中声明的sayHi
}
}
}
}