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的更多相关文章

  1. JavaScript学习04 对象

    JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...

  2. 【HTML5 WebSocket】WebSocket对象特性和方法

    <HTML5 WebSocket权威指南>学习笔记&3 WebSocket方法的对象特性 1. WebSocket方法 a. send方法 send方法用于在WebSocket连接 ...

  3. javaScript基础-04 对象

    一.对象的基本概念 对象是JS的基本数据类型,对象是一种复合值,它将很多值(原始值或者对象)聚合在一起,可通过名字访问这些值,对象也可看做是属性的无序集合,每个属性都是一个名/值对.对象不仅仅是字符串 ...

  4. Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】

    自旋对于synchronized关键字的底层意义与价值分析: 对于synchronized关键字的底层意义和价值分析,下面用纯理论的方式来对它进行阐述,自旋这个概念就会应运而生,还是很重要的,下面阐述 ...

  5. Scala的高级特性

    高阶函数 概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等 ...

  6. 6、scala面向对象-对象

    一.对象 1.object object,相当于class的单个实例,通常在里面放一些静态的field或者method,第一次调用object的方法时,就会执行object的constructor, ...

  7. scala伴生对象

    package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...

  8. Scala Singleton对象

    Scala Object: scala没有静态的修饰符,例如Java中的static.但是Scala提供了Object类型,object下的成员都是静态的,比较像Java的静态类.不同在于Scala的 ...

  9. Scala函数式对象-有理数

    有理数类的表示 实现规范:支持有理数的加减乘除,并支持有理数的规范表示 1.定义Rational 首先,考虑用户如何使用这个类,我们已经决定使用“Immutable”方式来使用Rational对象,我 ...

  10. Scala可变对象

    Java提供JavaBean作为数据对象的封装, 而对于Scala来说也提供了同样的支持. class Apple { var weight: Float = _ var color: String ...

随机推荐

  1. 虚拟机ping不通物理机 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.

    准备做samba服务配置的时候 ping 192.168.10.1 (物理机地址) PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 查看自 ...

  2. 类的阐述 package(包)

    类的阐述 同一个文件中可以定义很多类 编译后,每个类都会生成独立的.class文件 一个类中,只能有一个主函数,每个类都可以有自己的主函数 public修饰的类称为公开类,要求类名必须与文件名称完全相 ...

  3. redis数据类型篇

    redis数据类型官网资料,https://redis.io/docs/manual/data-types/ 生产环境下的redis实况图 超哥这个redis实例里,db0库有140万个key. 1. ...

  4. [DP] DP优化总结

    写在前面 $ DP $,是每个信息学竞赛选手所必会的算法,而 $ DP $ 中状态的转移又显得尤为关键.本文主要从状态的设计和转移入手,利用各种方法对朴素 $ DP $ 的时间复杂度和空间复杂度进行优 ...

  5. 使用Blazor WebAssembly整合PocketBase的基础项目模板

    使用Blazor WebAssembly整合PocketBase的基础项目模板 在这篇博客文章中,我们将探讨如何创建一个集成PocketBase的基础Blazor WebAssembly项目.我们将涵 ...

  6. python + pytestTestreport生成测试报告_报告没有生成图标和报告样式错乱

    pytestreport 生成测试报告的问题 1.生成报告html页面的样式错乱 2.生成报告html页面的图标没有展示 3. 生成报告html页面的查询详情按钮点击没有相应 问题排除: 浏览器开发者 ...

  7. 免费的Java主流jdk发行版本有哪些?

    Java的特点是百花齐放,不像c#或者go只有一家主导.oracle jdk收费了,没关系,不是只有它可用.java还有很多免费的主流的jdk发行版本,记录下来备忘. OpenJDK - 官方网站 - ...

  8. MYSQL中怎么查询LONGBLOB类型数据的大小

    在MySQL中,LONGBLOB 是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据.但是,LONGBLOB 数据类型本身并不直接存储数据的大小(长度).它存储的是二进制数据的实际内容. ...

  9. Ubuntu 18.04 安装OneDrive自动同步

    Ubuntu 18.04 安装OneDrive自动同步 Windows10系统已经自带了OneDrive的自动同步功能,对于多设备用户而言已经成为了一个非常方便传输保存文件的途径,在Ubuntu下也有 ...

  10. STM32 CubeMX 学习:001-GPIO的使用

    背景 在上一讲STM32 CubeMX 学习:搭建开发环境中,我们已经利用CubeMx搭建了可编译的工程. 今天就开始来介绍STM32 GPIO的有关知识,以及如何驱动它. HOST-OS : Win ...