Scala面向对象的底层实现详解以及与java的区别(一)

  1. Scala 是100%面向对象, java是95%面向对象
    1. Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型, null,静态方法等。
    2. Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言, 即在 Scala 中,一切皆为对象。
    3. 在面向对象的学习过程中可以对比着 Java 面向对象的方式解决养猫问题

mian()方法

object CatDemo {
  def main(args: Array[String]): Unit = {
    //创建一只猫
    val cat = new Cat //给猫的属性赋值
    //说明
    //1. cat.name = "小白" 其实不是直接访问属性,而是
    //2. cat.name 等价于 cat.name()
    cat.name = "小白" //等价
    cat.age = 10
    cat.color = "白色"
    println("ok~")
    printf("\n 小猫的信息如下: %s %d %s", cat.name, cat.age, cat.color)
  }
}

Cat.class

//定义一个类 Cat
//一个 class Cat 对应的字节码文件只有一个 Cat.class ,默认是 public 
class Cat {
  //定义/声明三个属性
  //说明
  //1. 当我们声明了 var name :String 时, 在底层对应 private name
  //2. 同时会生成 两个 public 方法 name() <=类似=> getter public name_$eq() => setter
  var name: String = "" //给初始值
  var age: Int = _ // _ 表示给age 一个默认的值 ,如果Int 默认就是0
  cat.name_$eq("小白")


  var color: String = _ // _ 给 color 默认值,如果 String ,默认是就是""
}


实际编译的cat.class
Scala面向对象的底层实现详解以及与java的区别(一)_第1张图片

  1. 通过底层编译的结果, 我们可以看到, 属性是private类型的, 我们其实是通过调用了属性同名方法来访问的, 而且由于scala中无参方法在调用时, 括号可以省略, 所以造成了我们可以直接调用private变量的假象.
    比如: cat.name 等价于 cat.name()
    cat.age = 10 其实是底层调用了 cat.age_$ql(10)相当于java的setter()

相当于java代码:

public class Cat {
  private String name = "";
  private int age;
  private String color;
  public String name() {
    return this.name;
  }
  public void name_$eq(String x$1) {
    this.name = x$1;
  } public int age () {
    return this.age;
  }
  public void age_$eq(int x$1) {
    this.age = x$1;
  }
  public String color() {
    return this.color;
  }
  public void color_$eq(String x$1) {
    this.color = x$1;
  }
}

你可能感兴趣的:(Scala)