关闭

Scala 类的主构造方法中属性修饰符的作用与区别

标签: scalajavaclass
39人阅读 评论(0) 收藏 举报
分类:

众所周知,Scala 是运行于Java平台(Java虚拟机)的,那么Scala程序编译之后会生成对应的字节码文件,我们将字节码文件反编译成Java文件即可知Scala 为我们都做了什么.

  1. Scala 源代码

    
    class Test4(a: String)
    
    class Test5(val b: String, var c: String)
    
    class Test6(private val d: String, private var e: String)
    
    class Test7(private[this] val f: String, private[this] var g: String)
    
    class Test8(@BeanProperty val f: String, @BeanProperty var g: String)
    
    //貌似这种写法没有什么用
    class Test9(@BeanProperty private[this] val f: String, @BeanProperty private[this] var g: String)
  2. 反编译后的Java代码

    public class Test4
    {
      public Test4(String a)
      {
      }
    }
    
    public class Test5
    {
      private final String b;
      private String c;
    
      public String b(){return this.b; } 
      public String c() { return this.c; } 
      public void c_$eq(String x$1) { this.c = x$1; }
    
    
      public Test5(String b, String c)
      {
      }
    }
    
    public class Test6
    {
      private final String d;
      private String e;
    
      private String d(){return this.d; } 
      private String e() { return this.e; } 
      private void e_$eq(String x$1) { this.e = x$1; }
    
    
      public Test6(String d, String e)
      {
      }
    }
    
    public class Test7
    {
      public Test7(String f, String g)
      {
      }
    }
    
    public class Test8
    {
      private final String f;
      private String g;
    
      public String f(){return this.f; } 
      public String g() { return this.g; } 
      public void g_$eq(String x$1) { this.g = x$1; } 
      public String getF() { return f(); } 
      public String getG() { return g(); } 
      public void setG(String x$1) { g_$eq(x$1); }
    
    
      public Test8(@BeanProperty String f, @BeanProperty String g)
      {
      }
    }
    
    public class Test9
    {
      public Test9(@BeanProperty String f, @BeanProperty String g)
      {
      }
    }

    总结

主构造器参数 生成的字段 生成的方法
name:String 不生成任何字段 不生成任何方法
val/var name:String 私有字段 公共的getter/setter方法
private val/var name:String 私有字段 私有的getter/setter方法
private[this] val/var name:String 不生成任何字段 不生成任何方法
@BeanProperty val/var name:String 私有字段 公共的Scala版和JavaBean版的 getter/setter方法
@BeanProperty private[this] val/var name:String 不生成任何字段 不生成任何方法
0
0
查看评论

Scala访问控制修饰符

参考自《Programming in Scala》一、访问控制修饰符包的成员,类或对象可以使用访问控制修饰符,比如 private 和 protected 来修饰,通过这些修饰符可以控制其他部分对这些类,对象的访问。Scala 和访问控制大体上和 Java 类似,但也有些重要的不同,本篇将介绍这些。...
  • u011026329
  • u011026329
  • 2016-01-20 17:57
  • 1548

Scala之主构造函数

主构造函数首先,我们必须要非常清晰明确的认识到:主构造函数不是你看到class后面跟的参数列表,那怎么可能是主构造函数呢?那只是主构造函数的函数列表!那主构造函数的函数体在那里呢?答案是:class body里所有出去字段和方法声明的语句,剩下的一切都是主构造函数的,它们在class实例化时一定会被...
  • bluishglc
  • bluishglc
  • 2016-03-15 19:10
  • 12587

Python 中的@修饰符作用

在python 2.4以上的的函数中偶尔会看到函数定义的上一行有@functionName的修饰,这一下这个语法细节,其实这有点像C语言带参数的宏操作,解释器读到这样的修饰之后,会先解析@后的内容,直接就把@下一行的函数或者类作为@后边的函数的参数,然后将返回值赋值给下一行修饰的函数对象。 def...
  • zhx278171313
  • zhx278171313
  • 2014-04-10 18:03
  • 4771

Java类、属性、方法分类及修饰符整合

原文地址 类的修饰符整合 一.类 类的修饰符: Public:可以在其他任何类中使用,默认为统一包下的任意类。 Abstract:抽象类,不能被实例化,可以包含抽象方法,抽象方法没有被实现,无具体功能,只能衍生子类。 Final:不能被继承。 二.变量 变量修饰符: 一个类...
  • qq_34163820
  • qq_34163820
  • 2016-07-05 11:08
  • 683

scala 构造方法(默认构造器)

与类名放在一起的(方法)是默认构造器 class SparkContext(config: SparkConf) extends Logging with ExecutorAllocationClient { ... def this() = this(new SparkConf()) } ...
  • gdmzlhj1
  • gdmzlhj1
  • 2016-03-01 13:45
  • 532

Java:构造函数的访问修饰符

构造方法可以处于public、protected、private和默认四种访问级别之一。 public public这里就不多说了 private 当构造方法为private级别时,意味着只能在当前类访问它,不能被继承,不能被其他程序用new创建实例对象。可以对比其他几种修饰符的作用:abs...
  • wangyanguiyiyang
  • wangyanguiyiyang
  • 2015-11-17 10:31
  • 2503

java中构造器和方法的区别

(1)功能和作用的不同    构造器是为了创建一个类的实例。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus(); 相反,方法的作用是为了执行java代码。    (2)修饰符,返回值和命名的不同   &#...
  • yaoxy
  • yaoxy
  • 2009-06-27 11:08
  • 8246

Java的自学之路-构造方法 的作用以及与set方法的区别

在java中,我们创建一个类时需要对类中的成员变量进行私有化,private..这样可以提高代码的安全性,那么在new 一个对象时,我们就不能对类中的成员变量直接赋值,此时可以在类中写一个 方法,这个方法即set()方法,可以用对象的引用来调用set()方法,在set方法里给成员变量进行赋值,如下...
  • qq_34481114
  • qq_34481114
  • 2016-10-09 10:57
  • 2217

Scala访问修饰符可见性问题(对比Java)

Java的访问修饰符可见性问题:   类内部 本包 子类 外部包 public √ √ √ √ protected √ √ √ × de
  • u013063153
  • u013063153
  • 2017-07-03 22:00
  • 373

Java中构造方法、实例方法、类方法的区别

1. 构造方法        构造方法负责对象的初始化工作,为实例变量赋予合适的初始值。必须满足以下的语法规则:   方法名与类名相同;不要返回类型(例如return、void等);不能被static、final、nat...
  • hellohm_ndsc
  • hellohm_ndsc
  • 2014-12-17 10:41
  • 6245
    个人资料
    • 访问:27186次
    • 积分:1308
    • 等级:
    • 排名:千里之外
    • 原创:109篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条
    个人介绍
    文章分类
    最新评论