Scala(三):类
类:Class
1.简单类和无参方法
2.带getter和setter属性
3.只带getter属性
4.对象私有字段
5.Bean属性
6.辅助构造器
7.主构造器
8.嵌套类
1.简单类和无参方法
Scala中的简单类和Java中很相似
class ClassOps{
private var value = 0 //你必须初始化字段
def increment(){value += 1} //方法默认是公有的
def current() = value
}
/*
*在Scala中类并不声明为public,,Scala源文件包括多个类,所以这些类都具有公共可见性
* 使用该类需要做的就是构造对象并按照通常的方式调用方法
*/
object Class {
def main(args: Array[String]): Unit = {
val myCounter = new ClassOps
myCounter.increment()
println(myCounter.current)//此处调用无参构造时,()可加也可不加
}
}
2.带getter和setter属性
/**
*public class Person{
* public Int age //Java中并不推荐这样使用
* private String name
* public String getName(){return name;}
* public void setName(String name){this.name=name}
*}
* 像这样一对getter/setter通常叫做属性(property)
* Scala中对每个字段都给生成getter/setter方法,不过我们可以控制这个过程
* 如果字段私有,则getter/setter也是私有的
* 如果字段被val修饰,那么只有getter生成
* 如果你不需要getter/setter,那么可以将字段声明为private[this]
*/
//Scala中每个字段都提供getter和setter方法
class Person{
// var age = 0
/*
*Scala生成面向JVM的类,其中有一个私有字段age字段和相应的getter/setter方法,
*在Scala中此处,getter和setter分别为age和age_=
*/
//重写getter和setter
private var privateAge = 0 //变成私有并改名
def age = privateAge //getter def age_(newValue : Int ){ //setter方法
if(newValue > privateAge) privateAge = newValue
}
}
object Person{
def main(args: Array[String]): Unit = {
val p = new Person
println(p.age) p.age_(40)
println(p.age) //打印结果:40
p.age_(30)
println(p.age) //打印结果:40
}
}
3.对象私有字段
在Scala中,方法可以访问该类的所有对象的私有字段
class atm{
private var momey = 0
def drawMoney(){momey += 1}
def spendMoney(other : atm) = momey < other.momey
//之所以访问other.money是合法的是因为other也是atm对象
//Scala允许我们定义更加严格的访问限制,通过private[this]
private[this] var foods = null //在这对象.value行不通
//类私有字段,Scala会生成私有getter/setter,但是对象私有的字段不会生成
//private[类名],这样的只有指定类才能访问
}
4.Bean属性
当你将Scala字段标注为@BeanProperty时,会自动生成四个方法
import scala.reflect.BeanProperty
class superMan{ @BeanProperty var name : String = _ }
/*
*将会生成如下四个方法:
* name :String
* name_=(newValue:String):Unit
* getName():String
* setName(newValue:String):Unit
*/
5.辅助构造器
Scala中有主构造器和辅助构造器
辅助构造器和Java中的构造器很相似,只有两处不同
1.辅助构造器名称是this,Java中构造器名和类名相同
2.每一个辅助构造器必须以一个先前已定义的其他辅助构造器或主构造器的调用开始
class SuperWoman{
private var name = ""
private var age = 0
def this(name:String ) {
this() //调用主构造器
this.name=name
}
def this(name :String ,age :Int){
this(name) //调用前一个辅助构造器
this.age=age
}
//一个类中没有显式的定义主构造器,那么会默认的定义一个无参的主构造器
}
object superWoman {
//三种方式构建对象
val s1 = new SuperWoman
val s2 = new SuperWoman("John")
val s3 = new SuperWoman("John",30)
}
6.主构造器
在Scala中,每个类都有主构造器,主构造器并不以this方法定义,而是与类定义交织在一起
主构造器的参数被编译成字段,其值被初始化成构造时传入的参数
在Scala中,类也接受参数,和方法一样
class SuperBoy(val name:String,val age:Int){
//(...)中的内容就是主构造器的参数
println("this is construct")
override def toString = s"SuperBoy($name, $age)"
}
//构造参数也可以是普通的方法参数,不带val或者var,这样的参数如何处理取决于它们在类中如何被使用
//如果不带val或者var的参数至少被一个方法使用,它将被升级为字段
class SuperGirl(name:String,age:Int){
def description=name + "is" + age + "years old"
}
//上述代码声明并初始化了不可变字段name和age,而这两个字段都是对象私有的,类似于private[this]
//当你把主构造器的参数看做是类参数时,不带val或var的参数就变得易于理解了,这样的参数的作用域覆盖整个类,因此你可以在方法中使用,同时
//你这样做了,编译器自动帮你将它保存成字段
//如果你想把主构造器变为私有,如下
class OldMan private(val name:String,val age:Int){}//这样只能通过辅助构造器来创建对象
7.嵌套类
函数中定义函数,类中定义类
import scala.collection.mutable.ArrayBuffer
class NetWork{
class Member(val name:String){
val contacts = new ArrayBuffer[Member]()
}
private val Members=new ArrayBuffer[Member]() def join(name:String)={
val m =new Member(name)
Members += m
m
}
}
object NetWork{
def main(args: Array[String]): Unit = {
//如有如下两个网络
val chatter = new NetWork
val myFace= new NetWork
//在两个网络中添加成员
val fred=chatter.join("fred")
val wilma=chatter.join("wilma")
fred.contacts += wilma
val barney = myFace.join("barney")
//fred.contacts += barney 不允许这样做
/*
*如果你不希望是这个效果,两种方式解决
* 1.可以将Member类移动到NetWork的伴生对象中
* 2.使用类型投影:NetWork#Member
* eg :
* class NetWork{
* class Member(val name:String){
* val contacts = new ArrayBuffer[NetWork#Member]()
* }
* }
*/
//在内嵌类中,可以通过外部类.this的方式来访问内部类的this引用,和Java一样
}
}
提示:有不妥的地方希望大家能够批评指正,一起学习,一起进步
Scala(三):类的更多相关文章
- 【scala】类的定义和单例对象
一.类的定义 Scala类的定义跟JAVA中类的定义基本是一样的. 示例 class ChecksumAccumulator{ var sum = 0;//Scala默认关键字为public priv ...
- Scala学习——类,继承,接口(中)
基本类的使用:(初) package com.dtspark.scala.basics /** * trait是一个接口 * 接口的第一次继承用extends,多继承时用with * 多继承时,如果这 ...
- 泛函编程(4)-深入Scala函数类
既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数:可以手工转换或者由编译器(compiler)在适当的情况下自动转换. ...
- IOS基础之 (三) 类的声明和对象的创建
一 OC类的声明和实现语法 1.接口的声明 @interface NewClassName: ParentClassName { 实例变量 ... } 方法的声明 ... @end //...表示省略 ...
- scala学习-类与对象
类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...
- Scala:类,对象和特征(接口)
http://blog.csdn.net/pipisorry/article/details/52902609 Scala类和对象 类是对象的抽象,而对象是类的具体实例.类是抽象的,不占用内存,而对象 ...
- Scala的类层级讲解
Scala的类层级 Scala里,每个类都继承自通用的名为Any的超类. 因为所有的类都是Any的子类,所以定义在Any中的方法就是"共同的"方法:它们可以被任何对象调用. Sca ...
- Scala学习之路 (六)Scala的类、对象、继承、特质
一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员用 ...
- Scala进阶之路-Scala特征类与unapply反向抽取
Scala进阶之路-Scala特征类与unapply反向抽取 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala特征类分析 1>.Unit 答:用于定义返回值类型, ...
- Scala的类继承
Scala的类继承 extend Scala扩展类的方式和java一样使用extends关键字 class Employee extends Person { } 与java一样,可以在定义的子类重写 ...
随机推荐
- Java中的Number和Math类简单介绍
Java Number类 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double 等. 实例: int a = 5000; float b = 13.65 ...
- HDFS pipeline写 -- 客户端
上一篇说了datanode端如何处理pipeline写请求的,这里主要看DFSClient. 这里以append为例, write差不多. 创建一个pipeline用于append操作的流程: Fil ...
- 使用 Azure CLI 管理 Azure 磁盘
Azure 虚拟机使用磁盘来存储 VM 操作系统.应用程序和数据. 创建 VM 时,请务必选择适用于所需工作负荷的磁盘大小和配置. 本教程介绍如何部署和管理 VM 磁盘. 学习内容: OS 磁盘和临时 ...
- ubuntu-15.04-desktop-amd64想要安装KDE桌面,结果出现如下问题
The following packages have unmet dependencies: kubuntu-desktop : Depends: ark but it is not going t ...
- [C++] 用Xcode来写C++程序[4] 函数
用Xcode来写C++程序[4] 函数 此节包括引用函数,内联函数,防止修改函数入参,函数自身带有默认值. 引用函数:防止复制对象,减少系统开销 内联函数:编译的时候根据具体情形将代码嵌入进去,成不成 ...
- UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流
1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. ...
- JDBC 连接mysql获取中文时的乱码问题
前段时间学习JDBC,要连接mysql获取数据.按照老师的样例数据,要存一些名字之类的信息,用的都是英文名,我当时就不太想用英文,就把我室友的名字存了进去,嘿嘿,结果,出问题了. 连接数据库语句: s ...
- zabbix之自动发现Tomcat多实例(第一种:已经部署完成,后续不再添加;第二种:后续或根据需要添加Tomcat实例)
单一实例手动部署:https://www.cnblogs.com/huangyanqi/p/8522526.html 注释:参考的一位博主的博客后续做的修改,那个博主的网址找不到了!!!! 背景: 1 ...
- 构造个人轻量级XSS平台获取管理员cookie并登录
一.前言 本平台是个人轻量级XSS测试平台,仅作为练习参考. 二.实验环境 服务器操作系统:Centos 7 Web容器:Apache 三.平台搭建过程 安装Apache 安装PHP 安装Git工具 ...
- AltiumDesigner17学习指南
AltiumDesigner工程模板 工程文件管理 视图->桌面布局->默认 恢复界面 AltiumDesigner17功能 修改元件标号 双击元件标号,在Designetor的Value ...