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一样,可以在定义的子类重写 ...
随机推荐
- create alter rename desc select update delete insert
conn scott/root;create table student (id number(3), name varchar2(10), sex char(2), sno number(3));a ...
- Oracle ALL DBA表
select * from all_tab_comments -- 查询所有用户的表,视图等 select * from user_tab_comments -- 查询本用户的表,视图等 select ...
- PHP_CodeSniffer 使用攻略
安装 PHP_CodeSniffer 安装 phpcs phpcs 是 PHP 代码规范的检测工具. # 下载 $ curl -OL https://squizlabs.github.io/PHP_C ...
- (1)访问控制 (2)final关键字 (3)对象创建的过程 (4)多态
1.访问控制(笔试题)1.1 常用的访问控制符 public - 公有的 protected - 保护的 啥也不写 - 默认的 private - 私有的 1.2 访问控制符的比较 访问控制符 访问权 ...
- MFC调试时可以,使用生产的exe时,显示未响应解决方案
首先,使用release模式,生成解决方案和exe. 对生成的exe,选择属性,兼容性,win7,应用,即可解决. 此方法对debug无用
- 【linux】安装和配置 mysql服务器
按照官网教程,根据自己的系统安装不同的发行版 https://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html 配置: ...
- ubuntu常见问题排查
1. ubuntu recovery mode read-only 获取写的权限 1.1. 选择fsck check all file systems 进去直接选择YES就可以了 1.2. 选择roo ...
- JavaScript创建对象的6种方式
JavaScript创建对象简单的说,无非就是使用内置对象(Object)或各种自定义对象,当然还可以用JSON,但写法有很多种,也能混合使用. 1.对象字面量的方式 person = {name : ...
- shell基础--字符串和变量的操作
一.统计字符串长度 1.wc –L [root@~_~day4]# echo "hello" | wc -L 5 2.expr length string [root@~_~day ...
- weblogic之CVE-2018-3191漏洞分析
weblogic之CVE-2018-3191漏洞分析 理解这个漏洞首先需要看这篇文章:https://www.cnblogs.com/afanti/p/10193169.html 引用廖新喜说的,说白 ...