码迷,mamicode.com
首页 > 其他好文 > 详细

专题 class 和 object

时间:2016-08-01 19:35:40      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

class

1. 类是对象的抽象,对象是类的实例。类是抽象的不占用内存,对象是具体的,占用内存。

2. Scala中,类不声明为public。Scala源文件可包含多个类,它们都具有公有可见性。

3. 定义无参类或方法时,定义F => 调用F、 定义F() => 调用F or F(); 定义C => new C or new C()、定义C() => new C or new C()

class Counter {                                    // or class Counter()

  var value = 0                                 // 字段value默认是私有的,但不等价于 var private value = 0.

  def increment() { value += 1 }       // or increment,方法默认是公有的

  def current = value                        // or current()

}

val myCounter = new Counter            // 生成对象 or new Counter()

myCounter.increment()                        // or increment

println(myCounter.current)

规范1:类名首写字母为大写,变量和函数首写字母为小写,常量为全大写,均采用驼峰标识。

规范2:无参类,()省略;无参方法,当方法返回值时 => ()省略,否则不省括号。因此increment()推荐。

 

getter and setter

1. Scala中,类中的字段自动带有getter和setter方法,Scala生成面向JVM类时,不带有访问控制符的字段默认是私有的,

    其对应的getter/setter方法默认是公有的。当字段修饰为private时,getter/setter方法变为私有的。

    注意:Scala中,类的字段不同于java,它是一个私有字段 + getter方法(val)or + getter/setter(var),

    不会出现只有setter 而无 getter的情况,因为在Scala中无法实现只写属性。对于一个字段,它可能同时不具备

    setter和getter,当该字段是对象私有的时候(private[this]修饰)。

class Person {

  var age = 0

}

scalac Person.scala

javap -private Person

public class Person {

  private int age;                // 字段默认为private;age为val时则private final int age

  public int age();               // 字段age的getter叫做 age;字段age为private时,public -> private

  public void age_$eq(int);  // 字段age的setter叫做 age_=,编译器将=译为$eq;val age -> 不带有setter方法

  public Person();                   

}

2. 可以自定义字段的getter和setter方法。

class Person {

  var age = 0

      def age_=(newAge: Int) {age  = newAge }  // error: method age_= is defined twice

}

改写为:

class Person {

  private var privateAge = 0

  def age = privateAge 

  def age_=( newValue: Int ) { if ( newValue> privateAge ) privateAge = newValue

}

val fred = new Person  fred.age = 30  fred.age = 21  结果为:fred.age为30

反编译结果为:

public class Person {

  private int privateAge ;                

  private int privateAge ();             

  private void privateAge _$eq(int);  

  public int age ();                            // 是没有publice int age字段的。

  public void age _$eq(int); 

  public Person();                   

}

说明:某个模块提供的所有服务都应该通过统一的表示方法访问到,至于它们是通过存储(变量)还是计算(方法)得到的,

从访问方式上无从知晓。在Scala中,fred.age的调用者并不知道age是通过字段还是通过方法来实现的。(JVM中,该服务

总是通过方法实现的,要么是编译器合成,要么由程序员提供。)

3. 无setter和getter方法

 

主构造器 and 辅构造器 

 

 

object

专题 class 和 object

标签:

原文地址:http://www.cnblogs.com/duchao-hit/p/5726806.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!