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一样,可以在定义的子类重写 ...
随机推荐
- Eclips 快捷键设置
- leetCode题解之寻找一个数在有序数组中的范围Search for a Range
1.问题描述 Given an array of integers sorted in ascending order, find the starting and ending position o ...
- docker的网络基础配置
一.端口映射实现访问容器 当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数来指定端口映射.当使用-P标记时,Docker会随机映射一个49000~49900的端口至容器内部开放 ...
- MySQL->>innodb_autoinc_lock_mode参数控制auto_increment 插入数据时相关锁的模式
转自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15498/viewspace-2141640/ ---------------------------------- ...
- C#.net XML的序列化与反序列化
/// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列 ...
- [翻译] PJR Signature View
PJR Signature View https://github.com/paritsohraval100/PJRSignatureDemo It is a UIView subclass by w ...
- golang 防知乎 中文验证码 源码
原创,转载请注明出处! 最开始用图形来模仿文字进行各种角度的倒立和排列,后来切换为文字后,有很多问题.总结如下: 1.程序在画图形和画文字方面不一样,图形的是从原点开始(0,0),而文字则从文字的基线 ...
- 【matlab】 拉格朗日插值
第一个函数 "lagrange1.m" 输入:X Y 与点x0 输出:插值函数对应函数值 y0 function y = lagrange1(X,Y,x0) n = length ...
- 铁乐学Python_day06-整数和字符串小数据池
python小数据池(内存地址) 今天来学习认识一下python中的小数据池. 我们都知道 ==是用来作比较,要是两个变量的数值相等, 用==比较返回的bool值会是True: a = 1000 b ...
- 【1】python-正则表达式语法规范与案例
正则表达式的用法与案例分析 2018-08-24 21:26:14 [说明]:该文主要为了随后复习和使用备查,由于做了word文档笔记,所以此处博文没有怎么排版,没放代码,以插入图片为主, 一.正则表 ...