【Scala】04 对象特性Part1
1、声明式包管理:
一个Scala文件可以声明N个包
包的意义和Java的包管理是一样的
同样也需要import导入资源声明
package pkgA {
import com.oracle.nio.BufferSecretsPermission object PackageOuter {
var out : String = "OUTER" } package pkgB {
package pkgC { object PackageInner {
def main(args: Array[String]): Unit = {
println(PackageOuter.out)
PackageOuter.out = "INNER"
println(PackageOuter.out)
}
}
}
}
} package pkgE { package pkgG { import pkgA.PackageOuter object gg {
def main(args: Array[String]): Unit = {
println (PackageOuter.out)
PackageOuter.out = "INNER"
println (PackageOuter.out)
}
}
}
}
2、包对象
Scala可以为每一个包定义一个同名的对象,包对象中定义的成员,可以被这个包下所有的Class和Object访问
【使用Java原始风格的包管理,包对象一般定义在包下的package.scala文件中,包的对象名和包名一致】
在其他Scala文件中可以直接访问:
package cn.dzz object Main { def main(args: Array[String]): Unit = {
// 在包下面可以直接访问
commonMethod()
println(commonValue)
} }
如果Package文件是复合的,也是一样
package cn
// 定义dzz包对象
package object dzz {
val commonValue = "1001001" def commonMethod() = {
println(commonValue)
}
} package ccc {
import cn.dzz._
object ddd {
def main(args: Array[String]): Unit = {
commonMethod()
println(commonValue)
}
}
}
3、导包区别:
/**
* 导入包说明
* 1、可以和Java一样在顶部使用import导入,这个文件中所有导入的类都可以使用
* 2、局部导入,什么时候调用,什么时候导入,在这个调用的作用域内都可以使用
* 3、Java导入所有的通配符是*,Scala导入所有通配符是_
* 4、给类起名 import.java.util.{ArrayList => AL}
* 5、导入相同包的多个类 import java.util.{HashSet, ArrayList}
* 6、排除导入的类 import java.util.{ArrayList => _,_}
* 7、完整名称书写,Java语法 new java.lang.String Scala语法 new _root_.java.util.HashMap
*
* 三个默认导入的包资源
* import.java.lang._
* import.scala._
* import.scala.Predef._
*
*/
4、类成员的定义:
// 定义多个类
class Class1 {
var name = "alice" // 同样属性也可以有修饰符 不加修饰符默认表示public private var age = 18 // 表示私有的 @BeanProperty // 创建和Java一样的Getter&Setter, 该注解对private修饰是错误的?
protected var gender = true // 设定初始值
var property1:Int = _ // 值放的是下划线,但是必须要声明变量的类型,Scala需要根据类型来推断初始值
var property2:String = _ // Int初始0 String初始null
} class Class2 { }
5、封装和访问权限
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val superClass = new SuperClass
// println(superClass.property1) // property1不能被访问, 是被标注为private受保护的
// println(superClass.property2) // property2不能被访问, 是被标注为protected受保护的
println(superClass.property3)
println(superClass.property4) superClass.printInfo() val subClass = new SubClass
subClass.printInfo() }
}
/**
* Java 访问权限 public protected (default) private
* 1、public 可以被公开访问
* 2、protected 仅限类和继承的子类访问
* 3、(default) 类和所调用的访问
* 4、private 只能在类的内部访问
*
* Scala 访问权限 (default -> public) protected private
* 1、Scala默认public 公开访问
* 2、protected 受保护权限,比Java更严格,同类,子类可以访问,同包无法访问
* 3、private[包名称] 增加访问权限,包名下的其他类也可以使用
*/
class SuperClass { // 上级类
private var property1 : String = "223112312"
protected var property2 : String = "zhangSan"
var property3 : Boolean = true
private [cn] var property4 : Int = 24 def printInfo() = {
println(s"cn.SuperClass p1 = $property1, p2 = $property2, p3 = $property3, p4 = $property4")
} } class SubClass extends SuperClass { // 重写父类方法
override def printInfo(): Unit = {
// 调用父类方法
// super.printInfo()
// 修饰为 private 的 property1 不能被这个SubClass子类访问到
// println(s"property1 : $property1") // 这样写报错 property2 = "12"
property3 = false
property4 = 100
super.printInfo()
} }
6、构造器 Constructor
/**
* // Scala和Java一样拥有主构造器和辅助构造器
*
* class 类名(形参列表) { // 主构造器
* // 类体
* def this(形参列表) {
* // 辅助构造器1
* }
* def this(形参列表) {
* // 辅助构造器2
* }
* // 可以有多个辅助构造器 ...
* }
*
* 1、多个构造器通过重载的形式来进行区分
* 2、辅助构造器不直接构建对象,必须取调用主构造器实现
* 3、构造器调用其他另外的构造器,必须 提前声明被调用的构造器
*/ class Student() {
var name : String = _
var age : Int = _
var gender : Boolean = _ println("主构造方法调用") def this(name : String) {
this() // 辅助构造器必须要先调用主构造器
println("辅助构造器1被调用")
this.name = name
println(s"name : ${this.name} age : $age gender : $gender")
} def this(name : String, age : Int) {
this(name)
println("辅助构造器2被调用")
this.age = age
println(s"name : ${this.name} age : $age gender : $gender")
} def this(name : String, age : Int, gender : Boolean) {
this(name, age)
println("辅助构造器2被调用")
this.gender = gender
println(s"name : ${this.name} age : $age gender : $gender")
} def Student(): Unit = {
println("对象一般方法被调用")
} }
调用时:
object HelloScala {
def main(args: Array[String]): Unit = { val student = new Student
student.Student()
}
}
关于构造器参数:
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val student = new Student("张三", 24, true)
// 调用打印的时候可以发现这个模板语法就不能打印student.name了 因为name不是成员属性
// println(s"student = {name : ${student.name}, age : ${student.age}, gender : ${student.gender}}")
// student.gender = false // gender 设定为val常量,只允许在构造器调用时赋值一次 }
} /**
* 构造器参数问题
* 参数包括三种类型
* 1、无任何修饰 该参数是一个局部变量
* 2、Var修饰 作为类的成员属性使用, 可以写值
* 3、Val修饰 作为类的成员属性使用, 只读属性
*
*/
class Student
(
name : String, // 局部变量
var age : Int, // 成员属性,可以写值
val gender : Boolean // 成员属性,只读属性
)
7、继承关系
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val son1 = new Son("zhangSan", 18)
val son2 = new Son("zhangSan", 18, "1003001")
}
} /**
* 继承和多态
* class 子类名 extends 父类名 { 类体 }
* 子类继承父类没有访问限制的属性和方法
* 继承和Java一样,是单继承的
*/
class Father() {
var name : String = _
var age : Int = _ println("Father 主构造器调用!") def this(name : String, age : Int) {
this()
println("Father 辅助构造器调用!")
this.name = name
this.age = age
} def printInfo(): Unit = {
println(s"Father => { name = $name, age = $age }")
}
}
class Son(name : String, age : Int) extends Father {
var no: String = _
def this (name : String, age : Int, no : String) {
this(name, age)
println("Son 辅助构造器调用!")
this.no = no
} println("Son 主构造器调用!") override def printInfo(): Unit = {
println(s"Son => { name = $name, age = $age }")
}
}
如果继承的父类构造器声明的是辅助构造器参数,那么还会调用辅助构造参数
class Son(name : String, age : Int) extends Father(name, age)
8、多态
package cn object HelloScala {
def main(args: Array[String]): Unit = {
// Scala 进行多态和Java的表达是一样的,需要强制声明引用类型
val daughter : Mather = new Daughter // 父类引用 指向 子类实例
daughter.sayHello()
}
} // 多态实现
class Mather {
val name : String = "Mather"
def sayHello() : Unit = println(s"Hello Mather $name")
}
class Daughter extends Mather {
override val name : String = "Daughter"
override def sayHello() : Unit = println(s"Hello Daughter $name")
}
9、抽象类:
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val s : Common = new Specific
s.method1()
}
} /**
* 抽象类
*/
abstract class Common {
var property1 : String // 没有赋值或者初始值,这个属性也算抽象
def method1() : Unit // 抽象方法
} class Specific extends Common {
override var property1 : String = "123456" // 没有赋值或者初始值,这个属性也算抽象
override def method1() : Unit = {
// 抽象方法的实现
println("Common abstract Implement !")
}
}
10、匿名子类,匿名实现类
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val s : Common = new Common {
override val property: String = "asdasd" override def method(): Unit = {
println("method Implement By anonymous Class!!!")
}
} s.method()
}
} /**
* 匿名子类
*
*/
abstract class Common {
val property : String
def method() : Unit
}
这张图可以直接看懂,Scala是做了一个动静分离的处理
Object 就可以表示一个Static修饰
11、特质(接口)
package cn object HelloScala {
def main(args: Array[String]): Unit = {
val spec : Spec = new Spec
spec.sayHello()
spec.dating()
}
} class Specific {
val p1 : String = "initVal"
var p2 : Int = _ def sayHello(): Unit = println("asdasdas")
} // 这个类很奇怪,必须要继承某一个类之后才能实现特质
class Spec extends Specific with Common {
val p1: String
var p2: Int
override var age: Int = _ override def dating(): Unit = {
println("asdasd")
} } /**
* 特质 TRAIT
* 这个东西使用来代替Java的接口
* 多个类具有相同的特质,可以抽取特质独立于类来创建,用关键字trait声明
* 一个普通类可以混合多个特质
* trait可以抽象方法和属性,也可以有具体的实现
*/ trait Common {
var age : Int
val name : String = "young" def play() : Unit = {
println("young man always struggle")
}
def dating() : Unit
}
动态混入:
就是直接实现接口完成:
package cn object HelloScala {
def main(args: Array[String]): Unit = {
// 动态混入 注意这里变量不能指定了
val specificWithCommon = new Specific with Common {
override var age: Int = _
override def dating(): Unit = {
println("dating impl")
}
}
specificWithCommon.sayHello()
specificWithCommon.dating()
println(specificWithCommon.age)
}
} class Specific {
val p1 : String = "initVal"
var p2 : Int = _ def sayHello(): Unit = println("asdasdas")
}
/**
* 特质 TRAIT
* 这个东西使用来代替Java的接口
* 多个类具有相同的特质,可以抽取特质独立于类来创建,用关键字trait声明
* 一个普通类可以混合多个特质
* trait可以抽象方法和属性,也可以有具体的实现
*/ trait Common {
var age : Int
val name : String = "young" def play() : Unit = {
println("young man always struggle")
}
def dating() : Unit
}
【Scala】04 对象特性Part1的更多相关文章
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- 【HTML5 WebSocket】WebSocket对象特性和方法
<HTML5 WebSocket权威指南>学习笔记&3 WebSocket方法的对象特性 1. WebSocket方法 a. send方法 send方法用于在WebSocket连接 ...
- javaScript基础-04 对象
一.对象的基本概念 对象是JS的基本数据类型,对象是一种复合值,它将很多值(原始值或者对象)聚合在一起,可通过名字访问这些值,对象也可看做是属性的无序集合,每个属性都是一个名/值对.对象不仅仅是字符串 ...
- Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...
- Scala的高级特性
高阶函数 概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等 ...
- 6、scala面向对象-对象
一.对象 1.object object,相当于class的单个实例,通常在里面放一些静态的field或者method,第一次调用object的方法时,就会执行object的constructor, ...
- scala伴生对象
package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...
- Scala Singleton对象
Scala Object: scala没有静态的修饰符,例如Java中的static.但是Scala提供了Object类型,object下的成员都是静态的,比较像Java的静态类.不同在于Scala的 ...
- Scala函数式对象-有理数
有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我 ...
- Scala可变对象
Java提供JavaBean作为数据对象的封装, 而对于Scala来说也提供了同样的支持. class Apple { var weight: Float = _ var color: String ...
随机推荐
- ansible搭建
ansible配置步骤 1.创建用户 2.用户提权 3.用户免密 4.cp ansible配置文件 5.配置主机清单 6.修改ansible 用户路径下的配置文件 1.创建用户(都要做) [root@ ...
- 绑定style
² 对象语法 <div:style="{color: redColor, fontSize: '20px'}">对象写法</div> data: { red ...
- SELinux 基本原理
首发公号:Rand_cs SELinux 基本原理 本文讲述 SELinux 保护安全的基本原理 安全检查顺序 不废话,直接先来看张图 当我们执行系统调用的时候,会首先对某些错误情况进行检查,如果失败 ...
- ETL工具-nifi干货系列 第十一讲 处理器UpdateAttribute使用教程
1.在这里我们重温下nifi里面一个重要的概念FlowFile,如下图所示: FlowFile:FlowFile代表NiFi中的单个数据.nifi数据流中流动的就是flowfile,每个nifi处理器 ...
- 物理机安装Centos系统
引言 在工作中,经常会在本地搭建开发环境,而使用的基本都是Linux系统,本文就教大家如何安装一套Centos Linux系统 准备 1.系统选择 系统:Centos 版本:7.9 2.镜像下载 下载 ...
- FEL - Fast Expression Language
开源好用的表达式计算语言FEL,可惜了官网文档不在国内,我来copy个过来. Fel是轻量级的高效的表达式计算引擎 Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求. Fel是开 ...
- Nginx 静态站点配置不对导致301跳转的坑
背景 是这样的,我们前端服务器统一的入口是 kong网关 ,我们还有一个Nginx静态资源站点:static.mysite.com,根配置如下: location / { root /home/web ...
- git 有用配置汇总
背景 git config的不同级别,每一个级别覆盖上一级别的配置,所以.git/config的配置变量会覆盖/etc/gitconfig中的配置变量 git config --system #为整个 ...
- 解决keil5仿真错误:Encountered an improper argument
--- title: 解决keil5仿真错误:Encountered an improper argument date: 2020-06-18 03:13:18 categories: tags: ...
- Freertos学习:在Posix环境仿真FreeRTOS
--- title: rtos-freertos-在Posix环境仿真FreeRTOS date: 2020-06-11 16:22:34 categories: tags: - freertos - ...