您的位置:首页 > 移动开发 > Objective-C

Scala之旅-class和object详解

2016-07-20 17:38 405 查看
1.class

scala的类和C#中的类有点不一样,诸如: 声明一个未用priavate修饰的字段 var age,scala编译器会字段帮我们生产一个私有字段和2个公有方法get和set ,这和C#的简易属性类似;若使用了private修饰,则它的方法也将会是私有的。这就是所谓的统一访问原则。

细节的东西太多,还是上代码在注释里面细讲吧

[java] view
plain copy

//类默认是public级别的

class Person{

var age=18 //字段必须得初始化()

def Age=age //这个是方法,没有参数可以省略()

def incremen(){this.age+=1}

}

class Student{

var age=20 //底层编译器会自动为私有的age添加get和set的公有方法,可以理解为伪public类型

private[this] var gender="male" //private[this] 只有该类的this可以使用

private var name="clow" //声明了private,底层编译器会自动为私有的name添加get和set的私有方法

//但是可以自己定义属性方法

def getName=this.name

def setName(value:String){this.name=value}

}

//构造器的使用

class Teacher {

var age: Int = _

var name: String = _ //可以预留

//重载的构造器和C#里面的public Teacher(){}类似

def this(age: Int, name: String){

this() //必须得调用一次主构造器

this.age=age

this.name=name

}

}

类的构造器细节

[java] view
plain copy

//1.主构造器在类名后,参数会被声明字段,若参数没有使用var或者val声明,则会被声明称私有字段

//2.实例化类的时候,类中的语句会被执行:println("person")

class Person(name:String,var age:Int) {

println("person")

def show(): Unit = {

println("show.."+name)

}

var gender:String=_

//次构造器必须调用主构造器,参数不能使用var

def this(name:String,age:Int, gender:String){

this(name,age)

this.gender=gender

}

}

2.scala没有静态的修饰符,但object下的成员都是静态的 ,若有同名的class,这其作为它的伴生类。在object中一般可以为伴生类做一些初始化等操作,如我们常常使用的val array=Array(1,2,3) (ps:其使用了apply方法)

[java] view
plain copy

object Dog{

private var age=0

def Age={

age+=1

age

}

}

class Dog{

var age1=Dog.age //Dog.age是object Dog的私有字段。这不禁让我回想起了C++的友元类

}

3.Apply的使用

[java] view
plain copy

class ApplyTest{

val name="clow";

def apply() {

println("class ApplyTest--apply()...");

}

}

//object下的成员默认都是静态的

object ApplyTest{

def apply() = {

println("object ApplyTest--apply()...");

new ApplyTest()

}

}

object Basic4 {

def main(args: Array[String]) {

//类名()->调用了对应object下的apply方法

var a1=ApplyTest()

println(a1.name)

//对象名()->调用了对应class的apply方法

a1() //输出:class ApplyTest--apply()...

}

}

Apply怎么用它来实现单例模式

[java] view
plain copy

class ApplyTest private{ //添加private隐藏构造器

def sayHello(){

println("hello jop")

}

}

object ApplyTest{

var instant:ApplyTest=null

def apply() ={

if(instant==null) instant=new ApplyTest

instant

}

}

object ApplyDemo {

def main(args:Array[String]){

val t=ApplyTest()

t.sayHello()

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  class scala