- Scala 是100%面向对象, java是95%面向对象
- Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型, null,静态方法等。
- Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言, 即在 Scala 中,一切皆为对象。
- 在面向对象的学习过程中可以对比着 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
- 通过底层编译的结果, 我们可以看到, 属性是
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;
}
}