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一样,可以在定义的子类重写 ...
随机推荐
- Hive设置变量
hive --define --hivevar --hiveconf set 1.hivevar命名空间 用户自定义变量 hive -d name=zhangsan hive --define nam ...
- leetCode题解 寻找运动环
1.题目描述 Initially, there is a Robot at position (0, 0). Given a sequence of its moves, judge if this ...
- 3.如何在Maven项目中引入自己的jar包
1.一般情况下jar包都可以使用pom.xml来配置管理,但也有一些时候,我们项目中使用了一个内部jar文件,但是这个文件我们又没有开放到maven库中. 我们会将文件放到我们项目中.(以下以java ...
- ASP.NET MVC使用AuthenticationAttribute验证登录
首先,添加一个类AuthenticationAttribute,该类继承AuthorizeAttribute,如下: using System.Web; using System.Web.Mvc; n ...
- 通过runtime获取对象相关信息
通过runtime获取对象相关信息 在这里,本人给大家提供一个runtime关于NSObject的扩展,用来显示各种NSObject中的信息,这有助于你来分析类的组成:) 先准备以下类供测试: Mod ...
- mysql 8.0.11 安装(windows)
mysql本地安装(windows) 一.安装包下载 从官网下载安装包,地址:https://dev.mysql.com/downloads/mysql/ 二.配置 解压到本地,然后在目录下新建my. ...
- Redis学习---Redis操作之String
set(name, value, ex=None, px=None, nx=False, xx=False) 在Redis中设置值,默认,不存在则创建,存在则修改 参数: ex,过期时间(秒 ...
- JAVA入门之程序设计环境搭建
这篇文章写给刚接触或者想学JAVA的新朋友.学习JAVA,需要找一本好的入门书籍,推荐<Java从入门到精通>,然后就是JAVA程序设计开发环境的搭建. 首先,我们需要安装JAVA开发工具 ...
- TortoiseGit bonobo gitserver记住帐号密码
记住帐号密码有两种方式: 针对服务器存储用户名密码 设置方式为在windows用户存储位置创建文件_netrc,没有后缀名.用文本编辑内容,格式为 machine 115.29.141.162 只 ...
- php命名空间的设计思想和缺点
相比C#等语言,你可以在PHP函数里面随意定义变量并赋值,而不用担心覆盖了全局变量,或者类变量:你也可以随意的定义类变量,而不用担心会和函数名冲突,因为变量前面都有个$. php的命名空间和全局变量. ...