Scala2.11.7学习笔记(七)类和对象

鲁春利的工作笔记,好记性不如烂笔头



apply

需要构造有参数需求的伴生对象时,可定义并使用apply方法。

class HelloWorld (var m : String, var n : Char) {
    println("I‘m class HelloWorld!");
    def speak () {
        println("Class HelloWorld Speak.");
    }
}

object HelloWorld {
     def apply(n : Char) = new HelloWorld("The char is ", n);
     def speak () {
        println("Object HelloWorld Speak.");
    }
}

val hi = HelloWorld.apply(‘s‘);
HelloWorld.speak();
hi.speak();

运行scala文件

G:\Hadoop\scala-SDK\source>scala companions.scala
I‘m class HelloWorld!
Object HelloWorld Speak.
Class HelloWorld Speak.

实际上,这是一种“约定”,只要你的object中定义了一个apply方法,你是可以直接使用object的名字作为函数名实现对这个apply方法的调用!

单例对象、伴生对象、apply方法使用

 
/**
 * @author lucl
 */
final class Person private {
  var name : String = "";
  // 可以直接访问伴随对象的成员
  println("The first NO of class Person is " + Person.NO);
  def apply () = {
    println("This is apply method in class Person.");
  }
  
  def foo () {
    println("The foo method of class Person.");
  }
  
  def this (name : String) {
    this;
    
    this.name = name;
  }
}
 
/**
 * 类的伴生对象
 * object修饰的为单例对象,其所有成员均是静态的
 */
object Person {
  private var NO : Int = 0;
  
  def nextNo {
    NO += 1;
  }
  
  def apply() = {
    println("This is apply method in object Person.")
    new Person();
  }
  
  def apply (name : String) = {
    println("This is apply method in object Person with name " + name + ".");
    new Person (name);
  }
  
  def foo () {
    println("The foo method of object Person.");
  }
}
 
object OOPTest {
  def main (args : Array[String]) {
//    println("----------------------------------");
//    当class Person的主构造函数通过private修饰后则new Person()不可再被访问    
//    val a = new Person();  // The first NO of class Person is 0
//    a.foo();        // The foo method of class Person.
//    println(a);
//    println(a());   // 会调用类的apply方法,输出This is apply method in class Person.
    
    println("----------------------------------");
    val b = Person;
    b.foo;          // The foo method of object Person.
    
    println("----------------------------------");
    val c = Person.apply;  // This is apply method in object Person.
    c.foo();        // The foo method of class Person.
    println(c());   // This is apply method in class Person.
    
    println("----------------------------------");
    val d = Person("zhangsan"); // 实际调用object Person的apply(name : String)方法
    println("The name set by object Person apply method is : " + d.name);
    
    // 
    var e = Array(1, 2, 3, 4, 5);
  }
}

/**
  ----------------------------------
  The foo method of object Person.
  ----------------------------------
  This is apply method in object Person.
  The first NO of class Person is 0
  The foo method of class Person.
  This is apply method in class Person.
  ()
  ----------------------------------
  This is apply method in object Person with name zhangsan.
  The first NO of class Person is 0
  The name set by object Person apply method is : zhangsan
*/

实际上查看Array数组时也可以发现,通过IDE工具把鼠标放到Array上能看到调用的为apply方法:

按下Ctrl键,然后通过数据点进去查看代码时看到的是:

object Array extends FallbackArrayBuilding 的apply方法:

而实际Array类的定义为:

final class Array[T](_length: Int) 
extends java.io.Serializable with java.lang.Cloneable {......}
时间: 2024-10-11 04:20:34

Scala2.11.7学习笔记(七)类和对象的相关文章

Scala2.11.7学习笔记(七)Scala包介绍

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 本文出自 "鲁春利的工作笔记" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1705420

python学习笔记(七) 类和pygame实现打飞机游戏

python中类声明如下: class Student(object): def __init__(self, name, score): self.name = name self.score = score def printinfo(self): print('name is %s, score is %d'%(self.name, self.score)) Student类有两个成员变量,name和score,类的成员函数第一个参数都为self,用来实现成员变量的赋值,__init__是

Java学习笔记-3.类与对象

一.面向对象程序设计 1.概念:   OOA:面向对象的分析,将现实世界进行抽象的分析 OOD:面向对象的设计 OOP:面向对象的程序 2.面向对象的特点: (1)封装性:一是把对象的全部状态和行为结合在一起,形成一个不可分割的整体,对象的私有属性只能由对象的行为来修改和读取 二是尽可能隐藏对象的内部细节,与外界的联系只能够通过外部接口来实现 (2)继承性:特殊类的对象拥有其一般类的属性和行为 (3)多态性:指同一个实体同时具有多种形式,体现在不同的对象可以根据相同的消息产生各自不同的动作 二.

学习笔记——Java类和对象

今天学习了Java的类和对象的相关知识,由于Java面向对象的编程的思想和C++几乎一样,所以需要更多的关注Java的一些不同之处. 1.类 1.1 在类这一块,除了基本的成员变量,成员方法,构造函数等外,需要掌握三种权限修饰符的区别,并会合理使用(private限制了权限只在本类,protected限定了权限只在包内). 1.2 静态常量.变量.方法:static修饰.我们可以使用“类名.静态类成员”来调用,如: public class StaticTest{ static double P

Java学习笔记1——类和对象

面向对象 对象:万物皆对象 面向对象 类:模子,属性+方法,类是对象的类型,是具有相同属性和方法的一组对象的集合 对象属性:对象拥有的各种特征,"对象有什么" 对象方法:对象执行的操作,"对象能干什么" 类与对象的关系/区别:类是抽象的,仅仅是模版:对象是看得到,摸得着的具体实体.例如:'手机'类,对象为iPhone6,Lumia920 Java中的类 定义类:Java程序都以类class为组织单元 创建一个对象 //1.定义一个类 public class Tel

Objective-C学习笔记______类和对象的使用

// // main.m // 类和对象 // // Created by apple on 15/5/30. // Copyright (c) 2015年 apple. All rights reserved. // #import <Foundation/Foundation.h> @interface Computer : NSObject //定义电脑这么一个类 { @public NSString *namec; //定义一个NSString类型名为namec的指针,用于指向一个字符

Objective-C学习笔记_类和对象

一 Objective-C概述 二 面向对象编程OOP Object Oriented Programming 三 类和对象 OC中类的定义 接口部分 实现部分 类和文件 创建对象 使对象 四 实例变量操作 一 Objective-C概述 Cocoa和Objective-C是苹果公司Mac OS X操作系统的核心.1980年初,Brad Cox发明了Objective-C,意将流行的.可移植的C语言和Smalltalk语言结合在一起:1985年,Steve Jobs成立NeXT公司,NeXT选择

Scala2.11.7学习笔记(六)文件操作

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 1.读取文件 import scala.io.Source; if (args.length > 0) {     for (line <- Source.fromFile(args(0)).getLines()) {         println(line.length + "\t" + line);     } } else {     Console.err.println("Please

Scala2.11.7学习笔记(四)

欢迎访问:鲁春利的工作笔记,学习是一种信仰,让时间考验坚持的力量. 简单的类定义 class CheckSumAccumulator {     private var sum = 0;     def add (b : Byte) : Unit = sum += b;     def checksum () : Int = ~ (sum & 0xFF) + 1; } Scala中class的缺省修饰符为public(public,protected,private),类的方法以def定义开始,