1、基本语法:

构造器分为主构造器和辅助构造器

class 类名(形参列表) {  // 主构造器

// 类体

def  this(形参列表) {  // 辅助构造器

}

def  this(形参列表) {  //辅助构造器可以有多个...

}

}

//1. 辅助构造器 函数的名称this, 可以有多个,编译器通过不同参数来区分

2、主构造器

class Person(val age:Int,var name:String, sex:Int, score1:Int) {
  var score = score1
  print("主构造器")
} object Person{
  def main(args: Array[String]): Unit = {
    new Person(3,"zhangsan",1,88)
  }
}

执行结果:

反编译:

public class
Person

{

private final int age;

private int score;

public int age() //get

{

return this.age;

}

public String name() //get

{

return this.name;

}

public void name_$eq(String x$1) //set

{

this.name = x$1;

}

public int score() //get

{

return this.score;

}

public void score_$eq(int x$1) //set

{

this.score = x$1;

}

public Person(int age, String name, int sex, int score1)

{

this.score = score1;

Predef..MODULE$.print("Ö÷¹¹ÔìÆ÷");

}

public static void main(String[] paramArrayOfString)

{

Person..MODULE$.main(paramArrayOfString);

}

}

从上面的代码和结果可以得:

1、主构造器的声明直接放在类名后面

2、主构造器会执行所有的代码,方法定义除外

3、如果主构造无参数,后面的小括号可以省略(简单,不作证明)

4、如果想让主构造器私有化,则可以在(参数)前面添加private关键字

5、从上面代码中我们在Person类中有三个变量

被val修饰,则为只读属性,会生成一个相当于get的方法(反编译看)

被var修饰,则为读写属性,会生成一个相当于get和set的方法

没有被修饰,则是一个局部变量,则不会生成任何方法

其中的sex属性没有生产任何的方法,是局部变量,而score是里面定义的变量,朱构造器也会执行,score1是局部变量,也不会生成任何的相关方法。

3、辅助构造器

class Person(val age:Int,var name:String, sex:Int, score1:Int) {
  var score = score1
  println("主构造器")   def this(age:Int, name:String){
    //辅助构造器必须显示的调用主构造器,可以通过调用其他辅助构造器间接调用
    this(age,name,21,99)
    print("辅助构造器")
  }
} object Person{
  def main(args: Array[String]): Unit = {
    new Person(3,"zhangsan")
  }
}

运行结果:

辅助构造器的名称为this,多个辅助构造器通过不同的参数列表进行区分,也就是重载

4、Bean属性

将scala字段添加@BeanProperty就会生成同java类似的get和set方法

import scala.beans.BeanProperty

  class Person( val name:String, @BeanProperty var age:Int) {
  print("主构造器")
} object Person{
  def main(args: Array[String]): Unit = {
    new Person("zhangsan",7)
  }
}

反编译结果

public class Person

{

private final String name;

public String name()

{

return this.name;

}

public int age()

{

return this.age;

}

public void age_$eq(int x$1)

{

this.age = x$1;

}

public void setAge(int x$1)  //setAge

{

this.age = x$1;

}

public int getAge() //getAge

{

return age();

}

public Person(String name, int age)

{

Predef..MODULE$.print("主构造器");

}

public static void main(String[] paramArrayOfString)

{

Person..MODULE$.main(paramArrayOfString);

}

}

从上面的代码,可以得出生成了get和set方法,如果是val修饰,则只会有get方法

scala之构造器详解的更多相关文章

  1. Scala进阶之路-Scala函数篇详解

    Scala进阶之路-Scala函数篇详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传值调用和传名调用 /* @author :yinzhengjie Blog:http: ...

  2. windows scala helloworld例子详解

    [学习笔记] windows scala helloworld例子详解: 在操作系统中,我们的Test3.scala会生成Test3.class,然后class文件被虚拟机加载并执行, 这一点和jav ...

  3. Scala面向对象—类详解

    package com.zzy import scala.beans.BeanProperty class Aclass { @BeanProperty//生成get和set方法对于其他框架里对标准的 ...

  4. 关于scala环境配置详解

    首先从官网下载适合自身电脑配置的scala安装包.scala下载官网网址:http://www.scala-lang.org/download/ 同时scala还有自己集成好的IDE,例如eclips ...

  5. linkin大话面向对象--构造器详解

       对象的产生格式:类名称  对象名 = new  类名称(); 因为有(),所以是方法,实际上它就是构造方法,并且是非私有的构造方法.如:CellPhone cp = new CellPhone( ...

  6. scala 隐式详解(implicit关键字)

    掌握implicit的用法是阅读spark源码的基础,也是学习scala其它的开源框架的关键,implicit 可分为: 隐式参数 隐式转换类型 隐式调用函数 1.隐式参数 当我们在定义方法时,可以把 ...

  7. Scala集合类型详解

    Scala集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象. Scala 集合分为可变的和不可变的集合. 可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合 ...

  8. Scala面向对象—类详解2(继承相关)

    1.单例类 package com.zzzy class AAA {//单例 /*//java 思路--私有化构造方法,提供公开的getAAA 行不通 private def this(){ this ...

  9. Java面向对象系列(5)- 构造器详解

    构造器: 和类名相同 没有返回值 作用: new本质在调用构造器 初始化对象的值 注意点: 定义了有参构造之后,如果想要使用有参构造,必须显示的定义一个无参构造 IDEA快捷键: Alt + Inse ...

随机推荐

  1. Contiki源码分析--CPU为cc253x里的uart0.c

    我所使用的Contiki系统是contiki-sensinode.理解该文需要有cc2530里uart的相关知识,具体寄存器的用法不做介绍. 先放上所有代码,然后再仔细分析. #include < ...

  2. CDQZ集训DAY10 日记

    又一次跪了,跪在了神奇的数据范围上. T1上来打完暴力之后觉得是数据结构题,像三维偏序,于是开始往各种数据结构上想,主席树,线段树+calc,平衡树,树套树,CDQ……最终在经过一番思考之后选择去打C ...

  3. android_SurfaceView 画图

    有这样一种view类,可以让人在其上面画动画,画图片,它的全名叫做surfaceview.名称就包含两层意思,一层是surface,一层是view.前一层提供一个面可以让人画画,后一层是个view,可 ...

  4. springcloud-高可用部署

    1.场景描述 前端时间只简单介绍了下springcloud的高可用方案(springcloud高可用方案),今天详细介绍下如何实施springcloud的高可用部署. 2.解决方案 2.1 架构方案 ...

  5. 【Android UI】自定义带按钮的标题栏

    自定义标题栏在很多的android app中很常见,可以说是一种很有用的UI设计方法.自 己也本着学习的态度,经过一番各种坑,终于实现了,现总结如下: 一:大致流程 1.      对指定的andro ...

  6. 记一次java.lang.NoClassDefFoundError异常

    前阵子做了个评论过滤敏感词的功能,本地测试没有任何问题,然后就部署到线上服务器,通知相关人员线上测试.大约过了十来天,那货和我说接口出问题了,当时一脸懵逼,用了十来天突然出问题了???好吧,出问题了咱 ...

  7. C#7.1 新增功能

    连载目录    [已更新最新开发文章,点击查看详细] C# 7.1 是 C# 语言的第一个点版本(更新版本). 它标志着该语言发布节奏的加速. 理想情况下,可以在每个新功能准备就绪时更快推出新功能.  ...

  8. C 单链表 实现约瑟夫环

    list.h #ifndef _List_H #define _List_H typedef int ElementType; struct Node; typedef struct Node *Pt ...

  9. [转]PHP的类自动加载机制,spl_autoload_register使用介绍

    转自 http://blog.csdn.net/hguisu/article/details/7463333: 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和requ ...

  10. [P2216] [HAOI2007]理想的正方形 「单调队列」

    思路:用单调队列分别维护行与列. 具体实现方法:是先用单调队列对每一行的值维护,并将a[][]每个区间的最大值,最小值分别存在X[][]和x[][]中. 那么X[][]与x[][]所存储的分别是1×n ...