Java和Scala中的面向对象思想的区别
Scala 的面向对象思想和Java的面向对象思想和概念是一致的。
封装:
**在Java当中,**先把属性写成私有的,然后给它添加get和set方法,把它封装起来,把属性和方法结合在一起就是封装了
**在Scala当中,**属性底层就已经带有get和set方法了,只是它写出来不是get和set,它是用“ . ”点,的这种方式来给它实现的。如果想要它和Java的那些框架兼容的话,需要有明文的get和set方法,需要给它加注解,@BeanProperty,这就是Scala的封装。(它其实是不推荐明文的封装,因为它底层已经实现了)
继承:
**在Java中,**继承就是子类继承父类的所有的属性和方法,在最开始的版本中Java的接口没有非抽象的使用和方法,不好用。
而Scala那个时候就已经创造出来了,它发现了Java的这个问题,就设计了一个叫做特质,一方面特质既具有接口的特性,又具有抽象类的特性,这样它就可以用时拥有抽象的属性方法和非抽象的属性方法,功能使用起来就方便很多。
**在Scala中,**Scala的继承和Java差不了太多,都是一个父类,多个特质。
Java的继承类似于里面是一层父类的模板,父类的对象就写在里面,外面套一层子类的对象,各写各的互不影响。如果两边有相同的属性的话,也不会有什么影响和冲突。
而Scala里面不是这样子的,Scala里面是在同一个对象里面写代码,类似于跑那个代码,跑那个构造器,集成的时候只继承构造器,跑这个代码的时候,父类的代码先跑一遍,子类的代码再跑一遍,如果名字一样就冲突了,冲突了就要重写了,所以Scala里面重写的范围比较广,即可以重写属性,也可以重写方法。同时Scala里面有val和var,var是不能重写的,变量不能重写。要修改它的值,直接修改就可以了。
多态:
**在Java中的多态,**父类的引用指向子类的实例,当产生多态的时候,属性是没有影响的,属性就是引用指向谁掉谁的属性。而调用方法的时候,它会一层一层地往外找,找到最外层的子类的那个重写的方法来进行一个调用,这就是Java的一个多态。
在Scala中的多态比Java中要进一步拓展了一些,因为在Scala中属性也有多态,再加上它的代码在继承的时候就是写在一起的,所以它的里面既有方法的重写又有属性的重写。在多态的时候就全部使用重写后的了,属性也能重写,也是使用重写后的。方法也能重写,也是使用重写后的方法。在调用的时候,就不会指向父类的那个属性了。这就是Scala的多态。