scala教程:属性(成员变量)的底层实现

scala 代码

object StdClass {

  def main(args: Array[String]): Unit = {
    val phone:Phone = new Phone()
    phone.cpu="123"
    println(phone.cpu)
  }
}
class Phone{
  val name:String="iphone15"
  var cpu:String = "A100"
  var screen:Double=6.1

  var rom:Int=128
  var ram:Int = 4

}

反编译

idea 反编译

反编译工具

使用 http://java-decompiler.github.io/ 工具

反编译代码

public class Phone {
  private final String name = "iphone15";

  public String name() {
    return this.name;
  }

  private String cpu = "A100";

  public String cpu() {
    return this.cpu;
  }

  public void cpu_$eq(String x$1) {
    this.cpu = x$1;
  }

  private double screen = 6.1D;

  public double screen() {
    return this.screen;
  }

  public void screen_$eq(double x$1) {
    this.screen = x$1;
  }

  private int rom = 128;

  public int rom() {
    return this.rom;
  }

  public void rom_$eq(int x$1) {
    this.rom = x$1;
  }

  private int ram = 4;

  public int ram() {
    return this.ram;
  }

  public void ram_$eq(int x$1) {
    this.ram = x$1;
  }
}
public final class StdClass$ {
  public static StdClass$ MODULE$;

  public void main(String[] args) {
    Phone phone = new Phone();
    phone.cpu_$eq("123");
    scala.Predef$.MODULE$.println(phone.cpu());
  }

  private StdClass$() {
    MODULE$ = this;
  }
}

图解

结论

  • public 属性,底层实际为 private

  • 访问属性 cpu 时,在底层上是调用 phone.cpu() 方法,

  • 给属性 cpu 赋值时,底层是调用 phone.cpu_$eq("123"); 方法赋值的

所以 Scala 并不推荐将属性设为 private,再为其设置 public 的 get 和 set 方法
而是直接通过 对象名.属性名 来访问 或 赋值


原文出处:/show_1IX1CZIPbMxO.html