专题 class 和 object

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

时间: 2024-11-04 10:29:15

专题 class 和 object的相关文章

喜马拉雅第三方客户端开发(接口和接口数据解析)。

前言:最近闲来无事,看了网上豆瓣的第三方客户端,手有点痒,决定自己动手开发一个客户端,比较了荔枝和喜马拉雅,决定开发喜马拉雅的第三方客户端. 客户端使用了WPF开发. 1.抓取接口: 首先得解决接口数据的问题,使用了手机端的喜马拉雅,抓包看了接口.这里推荐使用fiddler2这个工具.从图中可以看到接口信息,包括接口地址和参数的一些数据. 2.通过http获取接口数据和转换接口数据格式. 这里提供一个HttpWebRequestOpt类来获取接口数据. using System; using S

Concurrent.Thread.js

(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( this.Data.Stack === undefined ) this.Data.Stack = undefined; with ( function(){ with ( Data ) { return function () {

Cocos3D专题课程源码地址

源码地址 https://github.com/super626/LessonDemo cocos2d引擎版本3.7以上 下载后放置在LessonDemo/cocos2d目录下 MAC配置文件 LessonDemo/proj.ios_mac/LessonDemo.xcodeproj,直接用Xcode打开(Xcode5.1以上).编译桌面版和iOS版. win32配置文件 LessonDemo/proj.win32/LessonDemo.sln,用Visual Studio 2012以上版本打开,

JAVA技术专题综述之线程篇(1)

本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public cla ThreadTest extends Thread{public void run(){for(int i=0;i<10;i++){Syste

[.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现

一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblogs.com/jin-yuan/p/3811077.html.这里我简单介绍下AOP:AOP可以理解为对方法进行截获,这样就可以在方法调用前或调用后插入需要的逻辑.例如可以在方法调用前,加入缓存查找逻辑等.这里缓存查找逻辑就在方法调用前被执行.通过对AOP的支持,每个方法就可以分为3部分了,方法调用前

Android开发之图片处理专题(一):利用软引用构建图片高速缓存

在Android开发中,图片处理是一个难点.对于大量的图片处理,一不小心就会出现OOM的错误.那么,构建缓存,就是非常必要的一个手段.利用软引用构建缓存,只是其中步骤之一,我们来看看一般情况下,图篇处理的流程. 一般而言,图片的处理流程大致如上,之前所说的Xutils的原理,也如此.今天,我们就先讲讲如何利用软引用技术来构建高速缓存. 一.对象的四种引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态

开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm

10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub").Validform(),那么demo对象会有以下属性和方法可以调用: tipmsg[object] 如:demo.tipmsg.s="error! no messageinputed."; 通过该对象可以修改除 tit 以外的其他提示文字,这样可以实现同一个页面的不同表单使用不同的提示文字. 具体可修改的提示文字 $.Tipmsg={//默认提示文字; tit:

[.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现

一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了什么是规约模式,没看过的朋友首先去了解下.下面让我们一起看看如何在网上书店案例中引入规约模式.在网上书店案例中规约模式的实现兼容了2种模式的实现,兼容了传统和轻量的实现,包括传统模式的实现,主要是为了实现一些共有规约的重用,不然的话可能就要重复写这些表达式.下面让我们具体看看在该项目中的实现. 首先

为Pythonic论坛添加一个“专题”功能(续)

上篇博文<为Pythonic论坛添加一个“专题”功能>,在模板的层次上对发帖进行了限制.也就是根据用户是否拥有权限来决定是否显示发帖框. 但是自从这么“投机取巧”的写完模板后,整夜辗转反侧,不知道用户能否通过其它节点在不能够发帖的节点本地添加发帖框实现发帖. 最终,我还是觉得不靠谱…需要在服务端也进行下验证.简单的处理,终于填了坑 翻看\apps\topic\views.py文件找到def topic_create(request, node_slug):函数定义. if node.categ