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

众所周知,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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1. Scala变量 在Scala,变量可以使用var关键字定义为可变变量或使用val关键字定义为不可变变量。例如,在Scala,我们可以定义一个可变的整数变量如下: ``` var age: Int = 25 age = 30 ``` 在上面的代码,我们定义了一个名为age的变量,并将其初始化为25。然后,我们又将其值更改为30。 另外,我们也可以定义一个不可变的字符串变量如下: ``` val name: String = "John" ``` 在上面的代码,我们定义了一个名为name的变量,并将其初始化为字符串“John”。由于它是不可变的,我们不能更改它的值。 2. 访问修饰符 Scala有三种访问修饰符:private、protected和public。默认情况下,Scala的所有成员都是public的。以下是这些访问修饰符的解释: - private修饰符:只能在定义该成员的或对象内部使用。如果一个成员被private修饰符修饰,那么它只能被同一个或对象的其他成员访问。 - protected修饰符:只能在定义该成员的、对象或子使用。如果一个成员被protected修饰符修饰,那么它可以被同一个、对象或子的其他成员访问。 - public修饰符:可以在任何地方使用。如果一个成员没有被private或protected修饰符修饰,那么它就是public的。 以下是这些修饰符的示例: ``` class Person { private var age: Int = 25 protected var name: String = "John" def displayAge() { println(age) } } class Student extends Person { def display() { println(name) } } ``` 在上面的代码,我们定义了一个名为Person的,并在其定义了一个名为age的私有变量和一个名为name的受保护变量。然后,我们定义了一个名为Student的,并在其定义了一个名为display的方法。该方法可以访问父的受保护变量name,但无法访问私有变量age。 3. 运算符 Scala支持所有常见的算术、比较、逻辑和位运算符。以下是其的一些示例: ``` val x = 10 val y = 20 val z = 25 println("x + y = " + (x + y)) println("x - y = " + (x - y)) println("x * y = " + (x * y)) println("y / x = " + (y / x)) println("y % x = " + (y % x)) println("z << 2 = " + (z << 2)) println("z >> 2 = " + (z >> 2)) println("z >>> 2 = " + (z >>> 2)) println("x & y = " + (x & y)) println("x | y = " + (x | y)) println("!(x == y) = " + !(x == y)) println("x < y && x < z = " + (x < y && x < z)) println("x < y || x < z = " + (x < y || x < z)) ``` 在上面的代码,我们使用了加、减、乘、除和模运算符,以及左移、右移、无符号右移、按位与、按位或、逻辑非、逻辑与和逻辑或运算符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我们始终是路人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值